如何解决 AWS CloudFormation 中的“自定义名称资源已存在于堆栈中”错误?

上次更新时间:2019 年 5 月 23 日

我的 AWS CloudFormation 堆栈创建资源失败,并且我收到一条错误消息,告诉我该资源已经存在于堆栈中。如何解决此错误?

简短描述

如果一个或多个使用自定义名称的资源将相同的名称设置为相同的值,您将会从 AWS CloudFormation 收到此错误。每个使用自定义名称的资源都具有唯一的物理 ID。对于 AWS CloudFormation 中定义的大多数资源,您不能重复使用物理 ID。

您可以将重复或创建失败的资源的名称更改为一个唯一的名称,从而解决此错误。您也可选择不为该资源设置自定义名称。如果您不设置自定义名称,则 AWS CloudFormation 会创建资源时生成一个唯一的名称。此唯一名称不会与您现有的资源冲突。

解决方法

1.    在包含创建失败的资源的 AWS CloudFormation 模板中,检查是否有其他显式声明的资源与您创建失败的资源具有相同的名称。

在下例中,堆栈失败的原因是所有 AWS Identity and Access Management (IAM) ManagedPolicy 资源 (ManagedPolicyName) 都使用相同的自定义名称 (FinalS3WritePolicy)。

# This stack will fail
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 资源都具有唯一的自定义名称(FinalS3DeletePolicyFinalS3WritePolicy),堆栈 A 成功创建了资源。由于所有 ManagedPolicyName 属性均未设置自定义名称值,堆栈 B 也成功创建了资源。AWS CloudFormation 在创建资源时自动为堆栈 B 中的每个 IAM ManagedPolicy 资源生成了一个唯一的名称

堆栈 A:

# This stack will Succeed as unique names are set:
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:

# This stack will Succeed as no names are set     
S3DeletePolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      PolicyDocument:
........
........
S3WritePolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      PolicyDocument:
........
........

注意:对于涉及存在于不同堆栈中的资源或者在 AWS CloudFormation 之外创建的资源的相关错误,您也可以使用本文中提到的解决方案。


这篇文章对您有帮助吗?

您觉得我们哪些地方需要改进?


需要更多帮助?