Cuando vuelvo a desplegar el código de AWS Cloud Development Kit (AWS CDK), se muestra el error «Already Exists».
Resolución
La mayoría de los recursos de la biblioteca de componentes de AWS CDK establecen la propiedad removalPolicy en el estado RETAIN de forma predeterminada. Si nos define la propiedad removalPolicy en RETAIN en tus recursos, se quedarán huérfanos. Los recursos huérfanos permanecerán en tu cuenta de AWS después de eliminar la pila y pasarán al estado DELETE_COMPLETE.
Al actualizar la pila, AWS CDK elimina el recurso. Si has especificado un nombre personalizado para los recursos, es posible que aparezca el error «Already Exists» cuando vuelvas a desplegar el mismo código.
Nota: En los siguientes pasos se utiliza un ejemplo de recurso de bucket de Amazon Simple Storage Service (Amazon S3) asociado a la clase s3.Bucket en AWS CDK.
Ejemplo de recurso con nombre personalizado:
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'amzn-s3-demo-bucket',
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
Importación del recurso retenido a la pila nueva
Sigue estos pasos:
-
Confirma que tu entorno cumple los requisitos para usar el comando cdk import de la interfaz de la línea de comandos (CLI) de AWS CDK.
Nota: No puedes importar un recurso a tu pila cuando actualizas o creas otros recursos en la pila. Solo puedes importar uno o más recursos en una sola operación de importación.
-
Elimina temporalmente todos los demás recursos de tu código, excepto el recurso que deseas retener. Las propiedades definidas del recurso que importes deben coincidir con las propiedades del recurso que has desplegado. Por ejemplo, importa el recurso de bucket de S3 retenido s3-bucket.
Nota: Para importar un recurso, debes establecer una política de eliminación para el recurso.
Ejemplo de política:
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'amzn-s3-demo-bucket',
removalPolicy: RemovalPolicy.RETAIN
});
//const cfnFunction = new lambda.CfnFunction(this, 'MyCfnFunction', {
// code: {
// ...
// s3Bucket: s3Bucket.bucketArn
// },
// role: 'role',
Nota: Sustituye s3-bucket por el nombre de tu bucket de S3.
-
Ejecuta el siguiente comando cdk import para iniciar la importación de recursos:
cdk import
-
Introduce el ID del recurso cuando CDK te lo pida. En este ejemplo, introduce el nombre del bucket de S3.
-
Vuelva a introducir los recursos del código y, a continuación, ejecuta el siguiente comando deploy:
cdk deploy
Eliminación manual del recurso retenido
Siga estos pasos:
- Inicia sesión en la consola de administración de AWS.
- Selecciona el servicio de los recursos que no desees retener.
- Elimina los recursos manualmente. Por ejemplo, para eliminar el recurso s3.bucket, elimina el bucket de Amazon S3.
- Para volver a desplegar AWS CDK, ejecuta el siguiente comando deploy:
cdk deploy
Cambio del nombre del recurso retenido
Sigue estos pasos:
- Abre el código de AWS CDK del recurso.
- Actualiza el nombre del recurso a un valor único que no entre en conflicto con el nombre del recurso retenido:
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'amzn-s3-demo-bucket',
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
Nota: En el ejemplo anterior se utiliza el parámetro bucketName para cambiar el nombre del recurso s3.Bucket. Sustituye amzn-s3-demo-bucket por el nombre de tu bucket de S3.
Eliminación del nombre de un recurso
Para eliminar el nombre del recurso para que AWS CDK pueda generar un nombre único, sigue estos pasos:
- Para eliminar el nombre del recurso de AWS CDK, ejecuta el siguiente código:
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
Nota: El código del ejemplo anterior elimina la propiedad bucketName para permitir que AWS CDK genere otro nombre nuevo.
- Para volver a desplegar AWS CDK, ejecuta el siguiente comando deploy:
cdk deploy
Definición de la propiedad removalPolicy como DESTROY
Sigue estos pasos:
-
Abre el código de AWS CDK para los recursos.
-
Define la propiedad removalPolicy como DESTROY:
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'amzn-s3-demo-bucket',
removalPolicy: RemovalPolicy.DESTROY
});
-
Para acceder a la plantilla de AWS CloudFormation, ejecuta el siguiente comando cdk synth:
cdk synth
-
Comprueba que tanto DeletionPolicy como UpdateReplacePolicy se hayan definido como Eliminar.