我想解決 AWS CloudFormation 中的「Last applied policy cannot be deleted」錯誤。
簡短說明
當您嘗試刪除 CloudFormation 政策(例如 AWS::SQS::QueuePolicy、AWS::S3::BucketPolicy、AWS::SNS::TopicPolicy 與 AWS::IAM::Policy)時,您可能會收到以下錯誤訊息:
「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 Command Line Interface (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 重新命名。最佳實務是僅在單一堆疊中管理一個政策資源。