我正在使用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" } } }
这一切都有效。但我需要在创建数据库时在数据库上运行初始SQL,以设置我的应用程序架构。我目前的方法是让应用程序自我迁移,但我想在CloudFormation定义中执行此操作。这可能吗?
答案 0 :(得分:8)
不,这是不可能的。但是,您可以将EC2实例连接到RDS实例来执行此操作。我可能会在S3中存储一个.sql文件,并在EC2实例上使用cloud-init脚本来下载文件并执行它。
答案 1 :(得分:6)
还可以创建CloudFormation自定义资源。关于如何使用SNS构建一个here的讨论很好;也可以使用Lambda构建一个。自定义资源本质上只是RPC,因此例如,创建一个用模式初始化数据库并不困难。
答案 2 :(得分:3)
CloudFormation仍然没有为我们提供任何解决方案,但希望他们很快会添加Database Migration Service支持。
与此同时,如果您正在使用CodePipeline,那么有很好的解决方案:创建一个调用Lambda函数来运行迁移的迁移阶段。我偶然发现this guide从CodePipeline调用Lambda,这可能对那些不熟悉的人有所帮助。
答案 3 :(得分:0)
另一个选择是将DBSnapshotIdentifier属性用于AWS :: RDS :: DBInstance资源。唯一要注意的是,您首先需要在AWS中加载数据库才能创建快照。从那时起,您可以自动化您的cloudformation堆栈以使用它。
DBSnapshotIdentifier: 用于还原数据库实例的数据库快照的名称(ARN)。
如果该属性包含一个值(非空字符串),则AWS CloudFormation将从指定的快照创建数据库。
使用DBSnapshotIdentifier属性还原数据库实例后,对于以后对该数据库实例的任何更新,必须指定相同的DBSnapshotIdentifier属性。当您为更新指定此属性时,不会再次从数据库快照还原数据库实例,并且数据库中的数据也不会更改。但是,如果未指定DBSnapshotIdentifier属性,则会创建一个空数据库实例,并删除原始数据库实例。