我已经创build了一个CloudFormation脚本,可以对我们现有的AWS堆栈进行克隆。 我已经添加了信息,以便CloudFormation可以从现有RDS实例的快照创buildRDS,也可以使用指定的数据库创build新实例。 但是,当我尝试将相同的脚本应用于现有堆栈时(通过使用现有堆栈中的脚本创build新堆栈,然后尝试通过新脚本进行升级来validation),CloudFormation始终会创build一个新的RDS实例。
下面是CloudFormation脚本的提取部分。
{ "Parameters": { "liveDbName" : { "Default": "default", "Description" : "The live database name to create by default", "Type": "String", "MinLength": "1", "MaxLength": "64", "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*", "ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters." }, "liveDbSnapshotIdentifier" : { "Description" : "This overrides Default Production Db name", "Type": "String", "Default": "" }, }, "Metadata": { "AWS::CloudFormation::Interface": { "ParameterGroups": [ { "Label": { "default": "Db Layer Configuration" }, "Parameters": [ "webDbInstanceType", "liveDbName", "liveDbSnapshotIdentifier", "dbTimeZone", "dbMasterUser", "dbMasterPassword" ] } ] } }, "Conditions": { "UseLiveDbSnapshot" : { "Fn::Not" : [{ "Fn::Equals" : [ {"Ref" : "liveDbSnapshotIdentifier"}, "" ] }] }, } "Resources": { "WebDb": { "Type": "AWS::RDS::DBInstance", "DeletionPolicy": "Snapshot", "Properties": { "AllocatedStorage": "100", "AutoMinorVersionUpgrade": "true", "BackupRetentionPeriod": "30", "CopyTagsToSnapshot": "true", "DBName" : { "Fn::If" : [ "UseLiveDbSnapshot", { "Ref" : "AWS::NoValue"}, { "Ref" : "liveDbName" } ] }, "DBSnapshotIdentifier" : { "Fn::If" : [ "UseLiveDbSnapshot", { "Ref" : "liveDbSnapshotIdentifier" }, { "Ref" : "AWS::NoValue"} ] }, "DBInstanceClass": { "Ref": "webDbInstanceType" }, "DBParameterGroupName": { "Ref": "WebDbParameterGroup" }, "DBSubnetGroupName": { "Ref": "DbSubnetGroup" }, "Engine": "mysql", "MasterUsername": { "Ref": "dbMasterUser" }, "MasterUserPassword": { "Ref": "dbMasterPassword" }, "MultiAZ": "true", "PubliclyAccessible": "false", "StorageType": "gp2", "Tags": [ { "Key": "Name", "Value": "WebDb" } ] } } } }
当然还有脚本的其他部分,但这是处理我们数据库部分的部分(完全是“命名空间”,我相信)。
我在做什么错我的脚本,是否有一个正确的方法来做到这一点? 很显然,我不希望CloudFormation在现有实例上恢复快照,但我不希望它使用指定的数据库创build新实例。
我已经添加了现有的堆栈脚本作为Dropbox的链接,因为该文件太长,直接包含在这里: https : //www.dropbox.com/s/313kmcnzk0pvyqi/sanitized-cloudformation.json?dl=0
您的原始CloudFormation模板不包含DBName或DBSnapshotIdentifier属性。 所以RDS实例是在没有DBName情况下创build的。 您的RDS实例安装的任何数据库都是事后创build的,而不是由CloudFormation创build的。
您的新模板包含DBName或DBSnapshotIdentifier ,具体取决于input参数。
根据AWS::RDS::DBInstance资源的AWS::RDS::DBInstance参考文档,如果添加/更改/删除DBName或DBSnapshotIdentifier属性,则将重新创buildRDS实例。
资料来源: http : //docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html
我猜测,当你应用更新后的模板时,你试图使用RDS实例中的数据库名称作为liveDbName的值。 不过,就CloudFormation而言,这是对RDS实例的更改,需要更换。
要应用模板更新,您需要对其进行修改,以便不应用DBName或DBSnapshotIdentifier 。