我已经创建了一个CloudFormation脚本,它支持我们现有AWS堆栈的一个克隆。我已经添加了一些信息,这样CloudFormation就可以根据现有RDS实例的快照创建RDS,或者用命名的数据库创建一个新实例。但是,当我试图将相同的脚本应用于现有堆栈(通过从现有堆栈创建一个新堆栈,然后尝试通过新脚本进行升级来验证)时,CloudFormation总是创建一个新的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恢复现有实例上的快照,但我也不希望它用命名的数据库创建一个新实例。
我添加了现有的堆栈脚本作为Dropbox的链接,因为文件太长,不能直接包含在这里:https://www.dropbox.com/s/313kmcnzk0pvyqi/sanitized-cloudformation.json?dl=0
发布于 2017-10-18 21:03:10
原始CloudFormation模板不包括DBName
或DBSnapshotIdentifier
属性。因此,RDS实例是在没有DBName
的情况下创建的。任何由RDS实例保存的数据库都是在事实之后创建的,而不是由CloudFormation创建的。
根据输入参数的不同,新模板包括DBName
或DBSnapshotIdentifier
。
根据CloudFormation资源的AWS::RDS::DBInstance
引用文档,如果添加/更改/删除DBName
或DBSnapshotIdentifier
属性,那么将重新创建RDS实例。
我猜想,当您应用更新的模板时,您试图使用您在RDS实例中拥有的数据库名称作为liveDbName
的值。但是,就CloudFormation而言,这是对RDS实例的更改,需要替换。
要应用模板更新,您需要修改它,使其既不应用DBName
也不应用DBSnapshotIdentifier
。
https://serverfault.com/questions/879085
复制相似问题