AWS CloudFormation のスタックの "Resource already exists in the stack" というエラーをトラブルシューティングしたいです。
簡単な説明
各リソースには固有の物理 ID があり、CloudFormation で定義されているほとんどのリソースで物理 ID を再利用することはできません。
スタックを作成し、リソースの名前と値が別のリソースと同じ場合、CloudFormation はリソースを区別できません。この場合、"Resource already exists in stack" というエラーメッセージが表示されます。また、CloudFormation が定義または管理していない同じ物理 ID のリソースが AWS アカウントまたは AWS リージョンに存在する場合も、このエラーが表示されることがあります。
この問題を解決するには、障害が発生したリソースの名前を一意の名前に変更するか、そのリソースの名前を定義しないでください。名前を定義しない場合、CloudFormation によって、リソースの作成時に一意の名前が生成されます。この一意の名前は、既存のリソースと競合しません。
解決策
注: 別のスタックに存在するリソース、または他の AWS サービスで作成したリソースに関連するエラーには、次の解決策を使用できます。例えば、識別子がすでに存在する Amazon Simple Queue Service (Amazon SQS) キューでこのエラーが表示されることがあります。
リソースの名前を確認する
障害が発生したリソースを含む CloudFormation テンプレートで、明示的に宣言された他のリソースに障害が発生したリソースと同じ名前が付けられていないか確認します。
次の例では、各 AWS Identity and Access Management (IAM) の ManagedPolicy リソースに同じ 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:
........
........
重複しているリソースの名前を更新する
名前が重複しているリソースの名前を更新します。例えば、最初に出現した FinalS3WritePolicy を FinalS3DeletePolicy に変更します。または、名前を削除します。
次の例では、IAM のそれぞれの ManagedPolicy リソースに一意の名前 FinalS3DeletePolicy と FinalS3WritePolicy が付けられているため、スタック A は成功します。どちらの ManagedPolicyName プロパティにも名前値が設定されていないため、スタック B は成功します。リソースが作成されると、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:
........
........