Amazon web services 在使用CloudFormation创建RDS数据库实例时,是否有方法运行初始SQL?

Amazon web services 在使用CloudFormation创建RDS数据库实例时,是否有方法运行初始SQL?,amazon-web-services,amazon-rds,amazon-cloudformation,Amazon Web Services,Amazon Rds,Amazon Cloudformation,我正在使用CloudFormation创建一个RDS实例,使用以下方法: "Resources": { "myDB": { "Type": "AWS::RDS::DBInstance", "Properties": { "AllocatedStorage": "5", "DBInstanceClass": "db.m1.small", "

我正在使用CloudFormation创建一个RDS实例,使用以下方法:

"Resources": { "myDB": { "Type": "AWS::RDS::DBInstance", "Properties": { "AllocatedStorage": "5", "DBInstanceClass": "db.m1.small", "Engine": "MySQL", "EngineVersion": "5.5", "DBName": "mydb", "MasterUsername": { "Ref": "DBUser" }, "MasterUserPassword": { "Ref": "DBPassword" }, "DBParameterGroupName": { "Ref": "myRDSParamGroup" } } } “资源”:{ “myDB”:{ “类型”:“AWS::RDS::DBInstance”, “财产”:{ “AllocatedStorage”:“5”, “DBInstanceClass”:“db.m1.small”, “引擎”:“MySQL”, “EngineVersion”:“5.5”, “数据库名”:“mydb”, “主用户名”:{ “Ref”:“DBUser” }, “MasterUserPassword”:{ “Ref”:“DBPassword” }, “DBParameterGroupName”:{ “Ref”:“myRDSParamGroup” } } }
这一切都是可行的。但我需要在数据库创建时在数据库上运行初始SQL,以设置我的应用程序架构。我目前的方法是让应用程序自行迁移,但我希望在CloudFormation定义中这样做。这可能吗?

不可能。但是,您可以让EC2实例连接到您的RDS实例来完成。我希望可能在S3中存储一个.sql文件,并在EC2实例上使用cloud init脚本下载并执行该文件。

也可以创建一个CloudFormation自定义资源。关于如何使用SNS构建一个自定义资源,有一个很好的讨论;也可以使用Lambda构建一个自定义资源。自定义资源基本上只是RPC,so例如,创建一个模式来初始化数据库并不困难。

CloudFormation仍然没有为我们提供任何解决方案,但希望他们很快会增加支持


同时,如果您使用CodePipeline,有一个很好的解决方案:创建一个迁移阶段,调用Lambda函数来运行迁移。我偶然发现从CodePipeline调用Lambda,这对那些不熟悉的人可能有帮助。

另一个选项是对AWS::RDS::DBInstance resource.T使用DBSnapshotIdentifier属性他唯一的发现是,你首先需要在AWS中加载一个DB来创建快照。从那时起,你可以自动化你的cloudformation堆栈来使用它

DBSnapshotIdentifier: 用于还原数据库实例的数据库快照的名称(ARN)

如果属性包含值(空字符串除外),AWS CloudFormation将从指定的快照创建数据库

使用DBSnapshotIdentifier属性还原DB实例后,必须为该DB实例的任何未来更新指定相同的DBSnapshotIdentifier属性。为更新指定此属性时,不会再次从DB快照还原该DB实例,并且不会更改数据库中的数据。但是,如果不指定如果禁用DBSnapshotIdentifier属性,将创建一个空的DB实例,并删除原始DB实例

从更多信息查看文档:

我希望避免让我的beanstalk/EC2资源负责在init上加载数据库架构/数据。我希望数据库init架构/数据将通过另一种方式进行管理,以分离关注点,并且不要将以应用程序为中心的应用程序与资源调配内容混合。一个定制的cloudformation资源负责获取sql脚本和N将模式/数据插入RDS数据库似乎很好,可能是使用lambda,然后我们需要找到一种方法来删除无用的额外自定义资源。如果有人找到一种标准方法来满足这种经典要求,那就太酷了:init DBI同意你所说的一切--模式是一个部署问题。这可能是“标准"不存在是因为访问限制。对于要初始化数据库的自定义资源,它必须具有写入权限,这是不可取的。不过,我自己也面临着类似的问题;如果我最终构建了自定义资源,我会回来分享我所做的工作,以供参考,希望它对您有用。您是否提出了解决方案解决方案?我面临着同样的问题。我曾考虑过使用ansible playbook来解决这个问题,但我不知道是否有一个合适的解决方案可以在cloudformation中实现。我没有这样做。我最终只是解决了这个问题,这并不难,因为在我的用例中,我们很少上下旋转新的堆栈。这种方法显然是不可能的或者一个更大容量的用例。如果我今天必须解决这个问题,我会按照上面的链接设置一个自定义资源。今天,使用Lambda函数+自定义资源比使用EC2更有意义instance@OdedNiv我正试图做完全相同的事情。你介意共享lambda函数和自定义资源吗?@RishiGoel我没有我有一个,但Lambda非常简单,文档也非常简单。我可能很快就会创建一个,在这种情况下,我会将它发布在这里。我尝试过的一件事是让一个SNS主题连接到cloudformation模板拥有的NotificationARNs。从那里,有一个Lambda函数,通过NotificationARNs监听所有事件。当事件创建完成后,启动您想要的任何行为。更多信息=>太糟糕了,这不是RDS的常用功能。无论您是通过CLI、Console、SDK、CloudFormation还是Beanstalk创建DB实例,都应该有一个选项来运行指定的脚本。就像您可以在EC2实例上运行用户数据脚本一样。