AWS CloudFormation - 在 RDS 实例就绪后创建表?

Posted

技术标签:

【中文标题】AWS CloudFormation - 在 RDS 实例就绪后创建表?【英文标题】:AWS CloudFormation - Create Tables After RDS Instance Is Ready? 【发布时间】:2019-02-25 11:18:05 【问题描述】:

这里是 CloudFormation 业余爱好者。一直在网上查找,但找不到任何关于在通过 CloudFormation 建立 RDS 实例后如何创建表的参考资料。是否可以指定 Lambda 来启动和创建所有表,或者指定要应用的 SQL 文件?这方面的标准模式是什么?

【问题讨论】:

【参考方案1】:

没有任何 CloudFormation 资源可以在创建 RDS 实例后处理其“内部”;它是一个黑匣子,您需要在 CloudFormation 之外配置(包含用户、表和数据)。这有点令人难过,因为版本控制、管理和部署数据库模式是基础架构和应用程序之间边界上的经典部署问题,这也正是 CloudFormation 所在(作为版本控制、管理和部署其他基础架构的工具)。

尽管它不是初学者级别的功能,但您可以做的是使用custom resource 在创建 RDS 实例后连接到它,然后运行适当的 SQL 命令来创建用户和表。您在 CloudFormation 模板中定义架构(SQL 或更结构化的描述,类似于 DynamoDB AtributeDefinitions),然后将该架构传递给您的自定义资源 lambda 函数,然后在数据库中运行查询。

如果您沿着这条路走下去,您可能会花很多时间发明如何将“之前”和“之后”模式中的差异转换为ALTER TABLE SQL 语句以在数据库中触发。您的自定义资源 lambda 代码需要非常健壮,并且始终将响应发送回 CloudFormation,即使在出现错误的情况下也是如此。并且不要忘记,如果您的堆栈更新因任何原因失败,CloudFormation 将再次“反向”调用您的自定义资源(即要求您将数据库从更新后模式更改回更新前模式)作为一部分回滚过程。

如果您确实走这条路并想出了一些强大的东西,请务必发布它,因为我相信很多人都会对此感兴趣!我在网上快速浏览了一下,但找不到任何明显的预先存在的东西。

【讨论】:

【参考方案2】:

很遗憾,CF 模板无法直接运行安装脚本。您可以尝试,就像您提到的那样,在 CF 模板成功创建 RDS 后,使用 Lambda 运行表设置。 DependsOn attribute 有帮助。您应该将凭证传递给 Lambda 以访问 RDS。

【讨论】:

以上是关于AWS CloudFormation - 在 RDS 实例就绪后创建表?的主要内容,如果未能解决你的问题,请参考以下文章

AWS — AWS CloudFormation

AWS 中的 cloudformation 最佳实践

是否可以在 AWS::OpsWorks::Instance 资源中使用 AWS::CloudFormation::Init 和元数据?

我无法在我的 cloudformation 代码中添加“AWS”:“*”

AWS::CloudFormation::Init 它是如何工作的?

AWS CloudFormation 可以调用 AWS API 吗?