Lorsque je redéploie mon code AWS Cloud Development Kit (AWS CDK), le message d'erreur « Already Exists » s'affiche.
Résolution
La plupart des ressources de la bibliothèque AWS CDK Construct définissent la propriété removalPolicy à l'état RETAIN par défaut. Si vous ne définissez pas la propriété removalPolicy à l’état RETAIN pour vos ressources, celles-ci deviennent orphelines. Les ressources orphelines demeurent dans votre compte AWS une fois que vous avez supprimé la pile, puis passent à l’état DELETE_COMPLETE.
Lorsque vous mettez à jour la pile, AWS CDK supprime la ressource. Si vous avez spécifié un nom personnalisé pour les ressources, le message d’erreur « Already Exists » peut alors s’afficher lorsque vous redéployez le même code.
Remarque : Les étapes suivantes utilisent un compartiment Amazon Simple Storage Service (Amazon S3) comme exemple de ressource, associé à la classe s3.Bucket dans AWS CDK.
Exemple de ressource dotée d’un nom personnalisé :
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'amzn-s3-demo-bucket',
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
Importer la ressource retenue dans votre nouvelle pile
Procédez comme suit :
-
Vérifiez que votre environnement répond aux exigences pour utiliser la commande cdk import de l’interface de ligne de commande AWS CDK.
Remarque : Vous ne pouvez pas importer de ressource dans votre pile lorsque vous mettez à jour ou créez d'autres ressources dans la pile. Vous ne pouvez importer qu'une ou plusieurs ressources en une seule opération d'importation.
-
Supprimez temporairement toutes les autres ressources de votre code, à l'exception de la ressource que vous souhaitez retenir. Les propriétés définies de la ressource que vous importez doivent correspondre à celles de la ressource que vous avez déployée. Par exemple, importez la ressource de compartiment S3 s3-bucket retenue.
Remarque : Pour importer une ressource, vous devez définir une politique de suppression pour cette ressource.
Exemple de politique :
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',
Remarque : Remplacez s3-bucket par le nom de votre compartiment s3.
-
Exécutez la commande cdk import suivante pour lancer l'importation de la ressource :
cdk import
-
Entrez l'ID de la ressource lorsque CDK vous y invite. Dans cet exemple, entrez le nom du compartiment S3.
-
Réintroduisez les ressources de votre code, puis exécutez la commande deploy suivante :
cdk deploy
Supprimer manuellement la ressource retenue
Procédez comme suit :
- Connectez-vous à la console de gestion AWS.
- Choisissez le service des ressources que vous ne souhaitez pas retenir.
- Supprimez les ressources manuellement. Par exemple, pour supprimer la ressource s3.bucket, supprimez le compartiment Amazon S3.
- Pour redéployer le code AWS CDK, exécutez la commande deploy suivante :
cdk deploy
Modifier le nom de la ressource retenue
Procédez comme suit :
- Ouvrez le code AWS CDK pour la ressource.
- Mettez à jour le nom de la ressource en lui attribuant une valeur unique qui n’entre pas en conflit avec celui de la ressource retenue :
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'amzn-s3-demo-bucket',
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
Remarque : L’exemple précédent utilise le paramètre bucketName pour modifier le nom de la ressource s3.Bucket. Remplacez amzn-s3-demo-bucket par le nom de votre compartiment S3.
Supprimer le nom de la ressource
Pour supprimer le nom de la ressource afin qu'AWS CDK puisse générer un nom unique, procédez comme suit :
- Pour supprimer le nom de la ressource d'AWS CDK, exécutez le code suivant :
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
Remarque : L’exemple de code précédent supprime la propriété bucketName pour permettre à AWS CDK de générer un nouveau nom.
- Pour redéployer AWS CDK, exécutez la commande deploy suivante :
cdk deploy
Définir la propriété removalPolicy sur DÉTRUIRE
Procédez comme suit :
-
Ouvrez le code AWS CDK pour les ressources.
-
Définissez la propriété removalPolicy sur DÉTRUIRE :
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'amzn-s3-demo-bucket',
removalPolicy: RemovalPolicy.DESTROY
});
-
Pour accéder au modèle AWS CloudFormation, exécutez la commande cdk synth suivante :
cdk synth
-
Vérifiez que les paramètres DeletionPolicy et UpdateReplacePolicy sont définis sur Supprimer.