我想解决 AWS CloudFormation 中的“Last applied policy cannot be deleted”(无法删除上次应用的策略)错误。
简短描述
当您尝试删除 CloudFormation 堆栈或策略资源,例如 AWS::SQS::QueuePolicy、AWS::S3::BucketPolicy 和 AWS::SNS::TopicPolicy 时,您可能会收到以下错误:
“无法删除上次应用的策略。在删除上次应用的策略之前,请删除应用于此资源的其他策略。”
如果您对同一资源应用一个策略后又应用一个策略,则第二个策略将成为上次应用的策略。当您尝试删除第二个策略时,CloudFormation 将不允许您删除该策略。
根据以下场景对此错误进行故障排除:
- 堆栈和策略资源处于 DELETE_FAILED 状态。
- 当存在其他堆栈部署的其他策略资源时,该策略资源将被删除。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
堆栈和策略资源处于 DELETE_FAILED 状态
如果您尝试删除堆栈但策略资源未删除,请尝试再次删除该堆栈并跳过该资源。要解决堆栈和策略处于 DELETE_FAILED 状态的问题,请执行以下操作之一:
当您完成上述操作之一并尝试再次删除堆栈时,您选择保留的资源将不会被删除。堆栈的状态将更改为 DELETE_COMPLETE。
**注意:**为防止不必要的费用,请在删除堆栈时手动删除保留的资源。如果您应用了策略的资源被删除,则无需手动删除这些资源。当删除目标资源时,策略资源将被删除。
有关详细信息,请参阅如何删除卡在 DELETE_FAILED 状态的 AWS CloudFormation 堆栈?
删除应用于同一个资源的不同堆栈中的策略资源
如果您将来自不同堆栈的多个策略应用于同一个资源,则必须删除应用的第一个策略。
例如,您在 example-stack-A 中创建 ExamplePolicyA 并将该策略应用于 exampleQueue1。然后,您使用不同的权限在 example-stack-B 中创建 ExamplePolicyB 并将该策略应用于 exampleQueue1。当您尝试删除 ExamplePolicyB 时,您会收到以下错误:
“无法删除上次应用的策略。在删除上次应用的策略之前,请删除应用于此资源的其他策略。”
要删除 ExamplePolicyB,必须先删除 ExamplePolicyA。
**注意:**最佳做法是在创建新策略之前删除以前的策略。