Quiero saber cómo solucionar el error de CloudFormation «The resource already exists in the stack» cambiando el nombre del recurso o generando un nombre único.
Breve descripción
Cuando crea un recurso que tiene el mismo nombre y con el mismo valor que otro recurso, AWS CloudFormation no puede diferenciarlos. En ese caso, recibirá el mensaje de error «Resource already exists in stack». Cada recurso tiene un identificador físico único. No puede reutilizar el identificador físico para la mayoría de los recursos que se definen en CloudFormation.
Para resolver este problema, cambie el nombre del recurso que falla por un nombre único. O bien, puede optar por no definir el nombre de ese recurso. Si no establece un nombre, CloudFormation genera un nombre único cuando se crea el recurso. Este nombre único no entrará en conflicto con sus recursos existentes.
Resolución
Nota: Puede usar la siguiente resolución para los errores relacionados con los recursos que existen en una pila diferente o que ha creado con otros recursos de AWS. Por ejemplo, puede recibir este error con las colas de Amazon Simple Queue Service (Amazon SQS) que tienen un identificador que ya existe.
Para cambiar el nombre del recurso que falla o generar un nombre único, siga estos pasos:
-
En la plantilla de CloudFormation que contiene el recurso que falla, compruebe si hay otros recursos declarados explícitamente con el mismo nombre que el recurso que falla.
En el siguiente ejemplo, la pila falla porque todos los recursos de AWS Identity and Access Management (IAM) ManagedPolicy (ManagedPolicyName) tienen el mismo nombre (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:
........
........
-
Actualice el nombre de cualquier recurso que tenga un nombre duplicado. Por ejemplo, cambie la primera aparición de FinalS3WritePolicy a FinalS3DeletePolicy. O bien, elimina el nombre.
En los siguientes ejemplos, la pila A funciona correctamente porque cada recurso de IAM ManagedPolicy tiene un nombre único (FinalS3DeletePolicy y FinalS3WritePolicy). La pila B funciona correctamente porque no se han establecido valores de nombre para ninguna de las propiedades de ManagedPolicyName. Cuando se crea el recurso, CloudFormation genera automáticamente un nombre único para cada recurso de IAM ManagedPolicy en la pila B.
Pila 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:
........
........
Pila B:
S3DeletePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
........
........
S3WritePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
........
........