我的 AWS CloudFormation 堆栈创建资源失败,并且我收到一条错误消息,告诉我该资源已经存在于堆栈中。如何解决此错误?
简短描述
当您创建与另一个资源具有相同名称并设置为相同值的自定义名称资源时,CloudFormation 无法区分它们。然后,您会收到错误消息:“Custom Named Resource already exists in stack(自定义名称资源已存在于堆栈中)”。 每个使用自定义名称的资源都具有唯一的物理 ID。对于 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 成功创建了资源。由于所有 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:
........
........
**注意:**对于涉及存在于不同堆栈中的资源或者在 CloudFormation 之外创建的资源的相关错误,您也可以使用本文中提到的解决方法。