Quero aprender como resolver o erro do CloudFormation “o recurso já existe na pilha” alterando o nome do recurso ou gerando um nome exclusivo.
Breve descrição
Quando você cria um recurso que tem o mesmo nome e é definido com o mesmo valor de outro recurso, o AWS CloudFormation não consegue diferenciá-los. Em seguida, você recebe a mensagem de erro: “O recurso já existe na pilha”. Cada recurso tem uma ID física exclusiva. Você não pode reutilizar a ID física para a maioria dos recursos definidos no CloudFormation.
Para resolver esse problema, altere o nome do recurso que falhou para um nome exclusivo. Ou pode escolher por não definir o nome desse recurso. Se não definir um nome, o CloudFormation gerará um nome exclusivo quando você criar o recurso. Esse nome exclusivo não entrará em conflito com seus recursos existentes.
Resolução
Observação: é possível usar a seguinte resolução para erros relacionados com recursos que existem em uma pilha diferente ou que você criou com outros recursos da AWS. Por exemplo, você pode receber esse erro com filas do Amazon Simple Queue Service (Amazon SQS) que têm um identificador que já existe.
Para alterar o nome do recurso que falhou ou gerar um nome exclusivo, conclua as seguintes etapas:
-
No modelo do CloudFormation que contém o recurso com falha, verifique se outros recursos declarados explicitamente têm o mesmo nome do seu recurso com falha.
No exemplo a seguir, a pilha falha porque cada recurso ManagedPolicy do AWS Identity and Access Management (IAM) (ManagedPolicyName) tem o mesmo nome (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:
........
........
-
Atualize o nome de qualquer recurso que tenha um nome duplicado. Por exemplo, altere a primeira ocorrência de FinalS3WritePolicy para FinalS3DeletePolicy. Ou remova o nome.
Nos exemplos a seguir, a Pilha A é bem-sucedida porque cada recurso ManagedPolicy do IAM tem um nome exclusivo (FinalS3DeletePolicy e FinalS3WritePolicy). A Pilha B é bem-sucedida porque nenhum valor de nome é definido para nenhuma das propriedades ManagedPolicyName. Quando o recurso é criado, o CloudFormation gera automaticamente um nome exclusivo para cada recurso ManagedPolicy do IAM na Pilha B.
Pilha 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:
........
........
Pilha B:
S3DeletePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
........
........
S3WritePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
........
........