如何通过CloudFormation阻止IAM角色与DynamoDB表被删除?
嘿,我来帮你搞定这个问题——要防止CloudFormation在变更栈或者删除栈的时候误删你的LambdaRole和DynamoTable,有两个核心思路,咱们一个个说清楚:
1. 用CloudFormation自带的DeletionPolicy属性(最直接靠谱)
这是CloudFormation专门为资源删除控制设计的原生机制,完全不需要额外的IAM策略,直接在模板里配置就行。
你只需要给LambdaRole和DynamoTable资源加上DeletionPolicy: Retain属性:
- 当你从模板里移除这些资源、或者删除整个CloudFormation栈时,AWS会保留这些资源在账户里,不会删掉它们。
- 如果资源是通过条件创建的(比如你的DynamoTable依赖
ShouldCreateTable参数),这个策略只会对实际被创建出来的资源生效,没创建的资源自然也不存在删除问题。
给你修改后的模板片段参考:
{ ... "Resources" : { "Get" : { "Type" : "AWS::Serverless::Function", "Properties": { ... "Role": {"Fn::If" : ["CreateRole", {"Fn::GetAtt":["LambdaRole", "Arn"]}, {"Ref":"RoleARN"}]}, "Environment" : { "Variables" : { "AppDynamoTable" : { "Fn::If" : ["CreateDynamoTable", {"Ref":"DynamoTable"}, { "Ref" : "TableName" } ] } } }, ... } }, "LambdaRole":{ "Type":"AWS::IAM::Role", "DeletionPolicy": "Retain", // 新增:阻止删除角色 ... }, "DynamoTable" : { "Type" : "AWS::DynamoDB::Table", "DeletionPolicy": "Retain", // 新增:阻止删除表 ... } }, }
另外,如果你的场景需要控制资源被替换时的旧资源保留(比如修改DynamoDB表主键导致CloudFormation要替换表),还可以加上UpdateReplacePolicy: Retain,这样旧的资源会被保留下来,不会被自动删除。
2. IAM策略:从权限层面限制删除(作为补充)
IAM策略不能直接阻止CloudFormation本身的删除逻辑,但可以限制执行CloudFormation操作的IAM用户/角色,不让他们拥有删除这些资源的权限。
比如你可以给执行CloudFormation的角色添加一条拒绝策略:
{ "Effect": "Deny", "Action": [ "iam:DeleteRole", "dynamodb:DeleteTable" ], "Resource": [ "arn:aws:iam::YOUR_ACCOUNT_ID:role/LambdaRole", "arn:aws:dynamodb:YOUR_REGION:YOUR_ACCOUNT_ID:table/DynamoTable" ] }
不过要注意:这种方式是“一刀切”的——如果后续你真的需要删除这些资源,得先调整IAM策略,不然会报错。而且如果CloudFormation栈的变更逻辑要求删除这些资源(比如你从模板里移除了它们),CloudFormation会因为权限不足而失败,栈会卡在错误状态,不如DeletionPolicy灵活。
总结
优先用DeletionPolicy: Retain,这是模板层面的原生控制,简单直接,不会影响正常的栈变更;IAM策略可以作为权限层面的补充,但要考虑后续运维的灵活性。
内容的提问来源于stack exchange,提问作者Efren

