AWS CloudFormation スタックでのリソース作成が失敗し、リソースはスタックに既に存在しているという内容のエラーメッセージが表示されます。このエラーの解決方法を教えてください。
簡単な説明
別のリソースと同じ名前で同じ値に設定されたカスタム名前付きリソースを作成する場合、CloudFormation はそれらを区別できません。次に、「カスタム名前付きリソースは既にスタックに存在します」というエラー メッセージが表示されます。 カスタム名を持つそれぞれのリソースには、ユニークな物理 ID が 1 つあります。CloudFormation で定義されているリソースでは、ほとんどの場合、物理 ID を再利用することはできません。
失敗したリソースをユニークな名前に変更することで、このエラーを解決できます。または、そのリソースにカスタム名を定義しないという方法もあります。カスタム名を設定しない場合は、CloudFormation によって、リソースの作成時にユニークな名前が生成されます。このユニークな名前は、既存のリソースと競合することはありません。
解決方法
1. 失敗したリソースを含む CloudFormation テンプレートで、他の明示的に宣言されたリソースに、失敗したリソースと同じ名前が付けられていないかを確認します。
次の例では、AWS Identity and Access Management (IAM) のそれぞれの ManagedPolicy リソース (ManagedPolicyName) に、同じカスタム名 (FinalS3WritePolicy) が付けられているのでスタックは失敗します。
S3DeletePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName:
Fn::Join:
- _
- - FinalS3WritePolicy
- Ref: EnvType
PolicyDocument:
........
........
S3WritePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName:
Fn::Join:
- _
- - FinalS3WritePolicy
- Ref: EnvType
PolicyDocument:
........
........
2. すべてのリソースについて、重複している名前を修正します。たとえば、前の例であれば FinalS3WritePolicy の最初のインスタンスを、FinalS3DeletePolicy に変更します。または、カスタム名を削除します。
次の例では、各 IAM ManagedPolicy リソースにユニークなカスタム名 (FinalS3DeletePolicy および FinalS3WritePolicy) が付けられているので、スタック A は成功します。また、スタック B ではどちらの ManagedPolicyName プロパティにもカスタム名の値が設定されていないため成功します。スタック B では、各 IAM ManagedPolicy リソースのためのユニークな名前を、そのリソース作成時に CloudFormation が自動生成します。
スタック 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:
........
........
注意: この記事の解決方法は、CloudFormation の外部に作成した他のスタックまたはリソース内で発生する、同様のエラーにも適用することができます。