我想了解如何通过更改资源名称或生成一个唯一的名称来解决 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(AWS 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:
........
........