我想解决 AWS CloudFormation 中的 "Last applied policy cannot be deleted" 错误。
简短描述
当您尝试删除 AWS::SQS::QueuePolicy、AWS::S3::BucketPolicy、AWS::SNS::TopicPolicy 和 AWS::IAM::Policy 等 CloudFormation 策略时,您可能会收到以下错误消息:
"Last applied policy cannot be deleted.Please delete other policies applied to this resource before deleting the last applied policy."
如果您对同一资源应用一个策略后又应用一个策略,则第二个策略将成为上次应用的策略。当您尝试删除第二个策略时,CloudFormation 将不允许您删除该策略。
根据以下场景之一对此问题进行故障排除:
- 堆栈和策略处于 DELETE_FAILED 状态。
- 您已尝试删除应用于同一资源的不同堆栈中的策略资源。
- 堆栈和策略处于 UPDATE_FAILED 状态。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
堆栈和策略处于 DELETE_FAILED 状态
如果您尝试删除堆栈但策略未删除,请使用 CloudFormation 控制台或 AWS CLI 再次删除该堆栈并跳过该资源。
CloudFormation 控制台
按照从 CloudFormation 控制台中删除堆栈中的说明强制删除堆栈。
AWS CLI
运行以下 delete-stack 命令:
aws cloudformation delete-stack --stack-name example-stack-name --retain-resources example-policy-resource-id
**注意:**请将 example-stack-name 替换为删除失败的堆栈,并将 example-policy-resource-id 替换为删除失败的策略资源的 ID。
再次删除堆栈后,您选择保留的资源不会被删除。堆栈的状态将更改为 DELETE_COMPLETE。
**注意:**为避免不必要的费用,请在删除堆栈时手动删除保留的资源。如果您删除目标资源,则策略资源也会被删除,因此您无需手动删除该资源。
有关详细信息,请参阅如何删除卡滞在 DELETE_FAILED 状态的 AWS CloudFormation 堆栈?
您已尝试删除应用于同一资源的不同堆栈中的策略资源
如果您将来自不同堆栈的多个策略应用于同一资源,则必须删除应用的第一个策略。
例如,您在 example-stack-A 中创建 ExamplePolicyA 并将该策略应用于 exampleQueue1。然后,您使用不同的权限在 example-stack-B 中创建 ExamplePolicyB 并将该策略应用于 exampleQueue1。当您尝试删除 ExamplePolicyB 时,您会收到以下错误:
"Last applied policy cannot be deleted.Please delete other policies applied to this resource before deleting the last applied policy."
要删除 ExamplePolicyB,必须先删除 ExamplePolicyA。
**注意:**最佳做法是在创建新策略之前删除以前的策略。
堆栈和策略资源处于 UPDATE_FAILED 状态
如果您从策略中移除了实体,则您的堆栈或策略资源可能处于 UPDATE\ _FAILED 状态。出现此错误是因为该策略已附加到不同堆栈中定义的另一个 AWS::IAM::Policy 资源或被其覆盖。
要解决此问题,请在尝试删除上次应用的策略之前,从其他堆栈中删除应用于同一实体的 AWS::IAM::Policy 资源。
完成以下步骤以删除资源:
-
在失败的堆栈资源中,更新堆栈模板以将 DeletionPolicy: Retain 添加到策略资源类型部分。
策略示例:
yaml
MySharedPolicy:
Type: AWS::IAM::Policy
DeletionPolicy: Retain # Add this line
Properties:
# existing properties remain the same
-
使用保留策略部署更新后的模板。
-
从 CloudFormation 模板中删除策略资源。
**注意:**由于您添加了保留策略,因此 IAM 策略不会被删除。
-
更新您的堆栈以完成移除过程。
**注意:**如果您仍需要此堆栈中的策略资源,请根据步骤 1 中的策略将资源添加回模板。然后,使用模板更新堆栈以创建资源。
最佳做法是从 AWS::IAM::Policy 迁移到 AWS::IAM::RolePolicy、AWS::IAM::UserPolicy 或 AWS::IAM::GroupPolicy。
如果问题仍然存在,或者您无法识别包含策略资源的其他堆栈,请清理并重新创建资源。重新创建策略资源时,您可能会收到 "resource already exists" 错误。要解决此问题,请重命名 PolicyName。最佳做法是仅在一个堆栈中管理一个策略资源。