AWS::RDS::DBInstance 类型的资源已部署。即使我没有在模板中指定它,数据库也会自动使用标准端口 3306。这很好,也是预期的。
但是,现在我想通过添加 that property 在模板中显式指定端口号:端口:“3306”
。
问题是,当我将其添加到模板时,CloudFormation 更改集告诉我这是一个将导致数据库替换的修改。这是更改集:
[
{
"resourceChange": {
"logicalResourceId": "RDSDBInstanceA",
"action": "Modify",
"physicalResourceId": "awesome-db",
"resourceType": "AWS::RDS::DBInstance",
"replacement": "True",
"moduleInfo": null,
"details": [
{
"target": {
"name": "Port",
"requiresRecreation": "Always",
"attribute": "Properties"
},
"causingEntity": null,
"evaluation": "Static",
"changeSource": "DirectModification"
}
],
"changeSetId": null,
"scope": [
"Properties"
]
},
"hookInvocationCount": null,
"type": "Resource"
}
]
预期行为
我希望 CloudFormation 说:未检测到任何更改。因为数据库已经使用端口 3306,所以实际上没有任何变化。
如果它已经在使用我想要的端口,我为什么还要尝试解决这个问题?
这样我就可以重复使用 Postgres 的 MySQL 模板,有条件地将端口号更改为标准 5432。奇怪的是,当我部署 Postgres 数据库而不指定端口号时,它使用了 3306 ——这是一个问题我,因为我想要标准端口 5432。
我尝试过的事情:
- 在 MySQL 部署时,使用
AWS::NoValue
作为Port
属性的值,欺骗 CloudFormation 认为没有任何变化:
Port: !If [IsMySQL, AWS::NoValue, "5432"]
结果相同。
如果这是 Terraform...
它会检查状态,发现端口已经是 3306,然后说“没有变化”。
我的问题
如何避免替换数据库,同时仍将此属性添加到模板?
最佳答案
CloudFormation 不会查看已部署的资源来识别更改,它只是将当前部署的堆栈与新堆栈进行比较。因此,在这种情况下,您有一个堆栈,以前不包含值,现在包含它,CF 认为这是一个更改。我有点惊讶 AWS::NoValue
选项不起作用。
解决这个问题的一个选择是利用堆栈导入。步骤如下:
- 通过将当前 RDS 实例的
DeletionPolicy
设置为RETAIN
(如果尚未设置)来更新当前堆栈。 - 更新当前堆栈,删除 RDS 实例。 RDS实例仍然存在,但不再受CF控制。
- 将 RDS 添加回您的模板中,按照您想要的方式进行配置,然后使用 CF 中的“将资源导入堆栈”选项。这应该允许您将 RDS 实例添加回您的堆栈中,并按照您想要的方式进行配置。
请记住,当您将某些内容导入堆栈 CF 时,仅假设模板中的配置与导入的资源匹配。
关于mysql - CloudFormation 更改集显示替换,尽管没有更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68182626/