Quiero solucionar el error “Resource already exists in the stack” de mi pila en AWS CloudFormation.
Descripción corta
Cada recurso tiene un ID físico único y no puedes reutilizar el ID físico para la mayoría de los recursos que se definen en CloudFormation.
Si creas una pila y los recursos tienen el mismo nombre y el mismo valor que otro recurso, CloudFormation no puede diferenciar entre los recursos. En ese caso, recibirás el mensaje de error “Resource already exists in stack”. Además, es posible que recibas este error si existen recursos que CloudFormation no define ni administra con el mismo ID físico en la cuenta o región de AWS.
Para resolver este problema, cambia el nombre del recurso que falla por un nombre único o no definas el nombre de ese recurso. Si no defines un nombre, CloudFormation genera un nombre único cuando se crea el recurso. Este nombre único no entrará en conflicto con tus recursos existentes.
Resolución
Nota: Puedes usar la siguiente resolución para los errores relacionados con los recursos que existen en una pila diferente o que has creado con otros servicios de AWS. Por ejemplo, puedes recibir este error con las colas de Amazon Simple Queue Service (Amazon SQS) que tienen un identificador que ya existe.
Comprobación del nombre de los recursos
En la plantilla de CloudFormation que contiene el recurso que falla, comprueba si hay otros recursos declarados explícitamente con el mismo nombre que el recurso que falla.
En el siguiente ejemplo, la pila falla porque los recursos de ManagedPolicy de AWS Identity and Access Management (IAM) tienen el mismo nombre (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:
........
........
Actualización del nombre del recurso duplicado
Actualiza el nombre de cualquier recurso que tenga un nombre duplicado. Por ejemplo, cambia 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 ManagedPolicy de IAM 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 deManagedPolicy de IAM en la pila B.
Ejemplo de la 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:
........
........
Ejemplo de la pila B:
S3DeletePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
........
........
S3WritePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
........
........