有没有办法在使用CloudFormation创建RDS数据库实例时运行初始SQL?

时间:2013-01-17 17:35:27

标签: amazon-web-services amazon-rds amazon-cloudformation

我正在使用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定义中执行此操作。这可能吗?

4 个答案:

答案 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属性,则会创建一个空数据库实例,并删除原始数据库实例。

从更多信息中查找文档: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html#cfn-rds-dbinstance-dbsnapshotidentifier