CloudFormation如何不删除现有栈及资源完成更新并解决同名报错
CloudFormation跨栈同名资源冲突问题解答
明确结论:无法在不删除现有旧栈、不迁移存量资源托管关系的前提下,通过新建CloudFormation栈直接覆盖已被其他栈托管的同名资源。
你遇到的报错是CloudFormation的基础校验规则导致的,报错原文如下:
client_variable_mapping_dev already exists in stack arn:aws:cloudformation:ap-south-1:505xxxxxxx:stack/dev-test/f7f1af20-e199-11ec-b2be-061b20ab09f2
同账号同区域下,CloudFormation不允许两个独立栈同时托管同一个物理资源,也不允许新栈创建和其他栈已托管资源物理名称完全重复的资源,不存在“新栈直接覆盖旧资源”的隐藏开关。
可落地的无数据损失操作方案
- 直接更新原有旧栈(推荐)
如果你只是要调整原有栈内S3、DynamoDB、Lambda的配置,不需要新建独立栈,直接对现有dev-test栈发起更新操作、上传新的模板即可。CloudFormation会自动识别模板变更,在保留DynamoDB数据、S3对象、Lambda配置等存量内容的前提下完成资源调整,完全不会触发重名报错。 - 导入旧资源到新栈托管
如果你必须用全新的栈替代旧栈管理资源,又要保留所有存量数据:- 保持新栈模板内同名资源的物理名称和现有线上资源完全一致
- 创建新栈时选择「导入现有资源到栈中」模式,按照控制台引导把旧栈里的重名资源逐一关联导入到新栈
- 导入完成后即可正常对新栈做模板更新,调整你需要修改的配置
注意:资源导入新栈后,旧栈内对应的资源条目会脱离旧栈托管,后续清理旧栈时一定要选择保留对应资源,避免误删数据
- 调整命名规则规避冲突
如果新旧栈需要长期同时运行,直接修改新栈模板内的资源物理名称,比如给新栈资源统一加-new后缀,从根源避开重名校验,新栈创建完成后再按需做存量数据迁移即可。
避坑提醒
- 不要尝试强制抢占其他栈的资源托管权,CloudFormation没有提供这类操作入口,反复提交只会重复触发资源已存在的报错。
- 不要直接删除旧栈后重建同名新栈:默认配置下删除栈会同步删除栈内托管的所有资源,会直接丢失DynamoDB表数据、S3存储对象等存量内容,除非提前把所有需要保留的资源删除策略设置为
Retain。
内容的提问来源于stack exchange,提问作者Uddhabendra Maity
相关产品推荐
相关产品推荐

