如何将CloudFormation资源的DeletionPolicy从Retain改为Delete
解决CloudFormation中无法更新资源DeletionPolicy的问题
问题背景
已部署的CloudFormation栈中,某IAM角色(ResourceA)的DeletionPolicy设为Retain,尝试将其改为Delete或直接移除该属性后,执行Serverless部署时收到「变更集未包含任何待部署的变更」提示,无法完成修改。
当前资源模板:
ResourceA: Type: AWS::IAM::Role DeletionPolicy: Retain Properties: RoleName: RoleName-${self:custom.env.stage} AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: events.amazonaws.com Action: sts:AssumeRole
期望修改为(二选一即可):
# 方案1:显式设置为Delete ResourceA: Type: AWS::IAM::Role DeletionPolicy: Delete Properties: RoleName: RoleName-${self:custom.env.stage} AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: events.amazonaws.com Action: sts:AssumeRole
# 方案2:移除DeletionPolicy(默认即为Delete) ResourceA: Type: AWS::IAM::Role Properties: RoleName: RoleName-${self:custom.env.stage} AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: events.amazonaws.com Action: sts:AssumeRole
原因分析
DeletionPolicy属于CloudFormation的资源元数据属性,而非资源的核心配置属性。CloudFormation在生成变更集时,默认不会检测该属性的修改,因此直接修改模板后执行部署,会被判定为无变更。
解决方案
方法1:通过AWS控制台直接修改(快速操作)
- 登录AWS CloudFormation控制台,找到目标栈
- 切换到「资源」标签,定位到
ResourceA(IAM角色资源) - 点击资源右侧的「操作」→「修改删除策略」
- 选择「Delete」并保存,修改即时生效
方法2:通过Serverless+CloudFormation替换资源(代码化操作)
如果需要通过代码或自动化流程修改,可通过替换资源的方式触发更新:
- 临时修改模板中的资源逻辑ID(比如将
ResourceA改为ResourceA-New),同时设置DeletionPolicy: Delete(或移除该属性) - 执行
serverless deploy,此时CloudFormation会创建新的IAM角色,原角色因Retain策略会保留在AWS账户中 - 验证新角色正常提供服务后,手动删除原Retain策略的IAM角色
- 将模板中的资源逻辑ID改回
ResourceA,再次执行serverless deploy,新部署的资源将使用默认的Delete策略
方法3:使用AWS CLI强制替换资源
通过CLI命令强制触发资源替换,让CloudFormation应用新的DeletionPolicy:
aws cloudformation update-stack \ --stack-name YOUR_STACK_NAME \ --use-previous-template \ --resources-to-replace ResourceA
执行命令后,CloudFormation会生成变更集,确认替换资源即可完成修改。替换后,新资源会使用模板中设置的DeletionPolicy(或默认的Delete)。
内容的提问来源于stack exchange,提问作者Gaurav Thantry
相关产品推荐
相关产品推荐

