CloudFormation添加RDS已在用端口属性触发实例替换如何规避
解决方案:使用CloudFormation资源导入功能同步模板配置
这是唯一无需替换现有数据库实例即可完成模板属性补全的方案,操作步骤如下:
- 调整你的CloudFormation模板,添加上所需的端口条件配置,不要修改其他已有资源的属性配置,保持RDS实例的逻辑资源ID和原有完全一致:
Conditions: IsMySQL: !Equals [!Ref DBEngine, "mysql"] # 其他原有条件保持不变 Resources: RDSDBInstanceA: # 必须和原有逻辑ID完全一致 Type: AWS::RDS::DBInstance Properties: # 其他原有属性全部保持不变 Port: !If [IsMySQL, "3306", "5432"] # 其他原有属性全部保持不变
- 进入CloudFormation控制台,选中目标堆栈,在操作菜单中选择「导入资源到堆栈」
- 按照向导指引上传修改后的模板,在资源识别步骤输入现有RDS实例的物理ID(即你的实例标识符
awesome-db) - 生成导入变更集,确认变更集中所有操作均为
Import类型,无Modify/Replace类型的变更后再执行后续操作 - 执行导入操作,完成后模板中的显式端口配置就会和现有实例完成状态对齐,不会触发任何实例实际变更
补充说明
- 导入完成后,后续新创建的同模板堆栈会自动按照条件配置分配对应数据库的标准端口,不会再出现Postgres实例默认使用3306的问题
- 你之前尝试的
AWS::NoValue方案无法生效的原因是:模板从「无Port属性」变为「有Port属性且值为AWS::NoValue」本身也属于属性变更,依然会触发替换规则 - 操作前建议先对现有RDS实例创建快照,避免意外情况
内容的提问来源于stack exchange,提问作者Yann Stoneman
相关产品推荐
相关产品推荐

