跳至内容

如何解决 CloudFormation 中的 "Last applied policy cannot be deleted" 错误?

2 分钟阅读
0

我想解决 AWS CloudFormation 中的 "Last applied policy cannot be deleted" 错误。

简短描述

当您尝试删除 AWS::SQS::QueuePolicyAWS::S3::BucketPolicyAWS::SNS::TopicPolicyAWS::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 资源。

完成以下步骤以删除资源:

  1. 在失败的堆栈资源中,更新堆栈模板以将 DeletionPolicy: Retain 添加到策略资源类型部分。 
    策略示例:

    yaml
    MySharedPolicy:
        Type: AWS::IAM::Policy
        DeletionPolicy: Retain # Add this line
        Properties:
        # existing properties remain the same
  2. 使用保留策略部署更新后的模板。

  3. 从 CloudFormation 模板中删除策略资源。
    **注意:**由于您添加了保留策略,因此 IAM 策略不会被删除。

  4. 更新您的堆栈以完成移除过程。
    **注意:**如果您仍需要此堆栈中的策略资源,请根据步骤 1 中的策略将资源添加回模板。然后,使用模板更新堆栈以创建资源。

最佳做法是从 AWS::IAM::Policy 迁移到 AWS::IAM::RolePolicyAWS::IAM::UserPolicyAWS::IAM::GroupPolicy

如果问题仍然存在,或者您无法识别包含策略资源的其他堆栈,请清理并重新创建资源。重新创建策略资源时,您可能会收到 "resource already exists" 错误。要解决此问题,请重命名 PolicyName。最佳做法是仅在一个堆栈中管理一个策略资源。

AWS 官方已更新 6 个月前