Salta al contenuto

Come posso risolvere l'errore “Already Exists” che ricevo quando implemento nuovamente il codice AWS CDK dopo avere eliminato lo stack dalla distribuzione?

4 minuti di lettura
0

Quando ridistribuisco il mio codice Kit di sviluppo per il cloud AWS (AWS CDK) (AWS CDK), ricevo un messaggio di errore "Already Exists".

Risoluzione

La maggior parte delle risorse della libreria di costrutti di AWS CDK imposta la proprietà removalPolicy sullo stato RETAIN per impostazione predefinita. Se non imposti la proprietà removalPolicy su RETAIN per le risorse, le risorse sono orfane. Le risorse orfane rimangono nell'account AWS dopo che elimini lo stack, quindi passano allo stato DELETE_COMPLETE.

Quando aggiorni lo stack, AWS CDK rimuove la risorsa. Se hai specificato un nome personalizzato per le risorse, potresti ricevere un errore "Already Exists" quando ridistribuisci lo stesso codice.

Nota: i passaggi seguenti utilizzano l'esempio di una risorsa bucket Amazon Simple Storage Service (Amazon S3) associata alla classe s3.Bucket in AWS CDK.

Esempio di risorsa con nome personalizzato:

const s3Bucket = new s3.Bucket(this, 's3-bucket', {
 bucketName: 'amzn-s3-demo-bucket',
 versioned: false,
 encryption: s3.BucketEncryption.S3_MANAGED
 });

Importa la risorsa mantenuta nel nuovo stack

Completa i seguenti passaggi:

  1. Verifica che l'ambiente soddisfi i requisiti per utilizzare il comando dell'interfaccia a riga di comando (CLI) di AWS CDK cdk import.
    Nota: non puoi importare una risorsa nello stack quando aggiorni o crei altre risorse. Puoi solo importare una o più risorse in una singola operazione di importazione.

  2. Rimuovi temporaneamente tutte le altre risorse dal codice ad eccezione della risorsa che desideri mantenere. Le proprietà definite della risorsa importata devono corrispondere alle proprietà della risorsa distribuita. Ad esempio, importa la risorsa bucket S3 mantenuta s3-bucket.
    Nota: per importare una risorsa, devi impostare una policy di rimozione per la risorsa.
    Esempio di policy:

    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: sostituiscis3-bucket con il nome del tuo bucket s3.

  3. Esegui questo comando cdk import per avviare l'importazione della risorsa:

    cdk import
  4. Inserisci l'ID della risorsa quando CDK lo richiede. In questo esempio, inserisci il nome del bucket S3.

  5. Reintroduci le risorse dal codice, quindi esegui questo comando deploy:

    cdk deploy

Elimina manualmente la risorsa mantenuta

Completa i seguenti passaggi:

  1. Accedi alla Console di gestione AWS.
  2. Seleziona il servizio delle risorse che non desideri mantenere.
  3. Elimina manualmente le risorse. Ad esempio, per rimuovere la risorsa s3.bucket, elimina il bucket Amazon S3.
  4. Per ridistribuire AWS CDK, esegui questo comando deploy:
    cdk deploy

Cambia il nome della risorsa mantenuta

Completa i seguenti passaggi:

  1. Apri il codice AWS CDK per la risorsa.
  2. Aggiorna il nome della risorsa a un valore univoco che non sia in conflitto con il nome della risorsa mantenuta:
    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     bucketName: 'amzn-s3-demo-bucket',
     versioned: false,
     encryption: s3.BucketEncryption.S3_MANAGED
     });
    Nota: l’esempio precedente utilizza il parametro bucketName per modificare il nome della risorsa s3.Bucket. Sostituisci amzn-s3-demo-bucket con il nome del tuo bucket S3.

Elimina il nome della risorsa

Per eliminare il nome della risorsa in modo che AWS CDK possa generare un nome univoco, completa i seguenti passaggi:

  1. Per rimuovere il nome della risorsa da AWS CDK, esegui questo codice:
    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     versioned: false,
     encryption: s3.BucketEncryption.S3_MANAGED
     });
    Nota: l'esempio di codice precedente rimuove la proprietà bucketName per consentire ad AWS CDK di generare un nuovo nome.
  2. Per ridistribuire AWS CDK, esegui questo comando deploy:
    cdk deploy

Imposta la proprietà removalPolicy su DESTROY

Completa i seguenti passaggi:

  1. Apri il codice AWS CDK per le risorse.

  2. Imposta la proprietà removalPolicy su DESTROY:

    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     bucketName: 'amzn-s3-demo-bucket',
     removalPolicy: RemovalPolicy.DESTROY
     });
  3. Per accedere al modello AWS CloudFormation, esegui questo comando cdk synth:

    cdk synth
  4. Verifica che DeletionPolicy e UpdateReplacePolicy siano impostate su Delete.