リソース名を変更するか、一意の名前を生成することで、「リソースはスタックに既に存在します」という CloudFormation エラーを解決する方法を学びたいと考えています。
簡単な説明
別のリソースと名前が同じで、同じ値に設定されたリソースを作成する場合、AWS CloudFormation はそれらを区別できません。この場合、「リソースは既にスタックに存在します」というエラーメッセージが表示されます。 各リソースには一意の物理 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 に変更します。または、名前を削除します。
次の例では、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:
........
........