我想了解如何變更資源名稱或產生唯一名稱,以便解決 CloudFormation 錯誤訊息 "the resource already exists in the stack"。
簡短說明
當您建立具有相同名稱的資源,並設為與其他資源相同的值時,AWS CloudFormation 無法區分這些資源。接著您會收到錯誤訊息:"Resource already exists in stack." 每個資源都有唯一的實體 ID。您無法針對在 CloudFormation 中定義的大多數資源重複使用這個實體 ID。
若要解決此問題,請將失敗資源的名稱變更為獨特不重複的名稱。或者,您可以選擇不要定義該資源的名稱。如果不設定名稱,CloudFormation 會在您建立資源時產生唯一的名稱。此唯一名稱不會與您現有的資源衝突。
解決方法
**注意:**您可以使用下列解決方法,針對存在於不同堆疊中的資源或您使用其他 AWS 資源建立的資源解決相關錯誤。例如,具有已存在識別碼的 Amazon Simple Queue Service (Amazon SQS) 佇列中就可能收到此錯誤訊息。
若要變更失敗資源的名稱或產生唯一名稱,請完成下列步驟:
-
在包含失敗資源的 CloudFormation 範本中,檢查其他明確宣告的資源是否與失敗的資源具有相同的名稱。
在下列範例中,堆疊會失敗,因為每個 AWS Identity and Access Management (IAM) ManagedPolicy 資源 (ManagedPolicyName) 都具有相同的名稱 (FinalS3WritePolicy):
S3DeletePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName:
Fn::Join:
- _
- - FinalS3DeletePolicy
- Ref: EnvType
PolicyDocument:
........
........
S3WritePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName:
Fn::Join:
- _
- - FinalS3WritePolicy
- Ref: EnvType
PolicyDocument:
........
........
-
更新任何具有重複名稱的資源名稱。例如,將 FinalS3WritePolicy 第一個重複項目變更為 FinalS3DeletePolicy。或者將該名稱移除。
在下列範例中,堆疊 A 會成功,因為每個 IAM ManagedPolicy 資源都具有唯一的名稱 (FinalS3DeletePolicy 和 FinalS3WritePolicy)。堆疊 B 會成功,因為沒有為任何一個 ManagedPolicyName 屬性設定名稱值。建立資源後,CloudFormation 會自動為堆疊 B 中的每個 IAM ManagedPolicy 資源產生唯一的名稱。
堆疊 A:
S3DeletePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName:
Fn::Join:
- _
- - FinalS3DeletePolicy
- Ref: EnvType
PolicyDocument:
........
........
S3WritePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName:
Fn::Join:
- _
- - FinalS3WritePolicy
- Ref: EnvType
PolicyDocument:
........
........
堆疊 B:
S3DeletePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
........
........
S3WritePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
........
........