Direkt zum Inhalt

Wie behebe ich den Fehler „Bereits vorhanden“, den ich erhalte, wenn ich meinen AWS-CDK-Code erneut bereitstelle, nachdem ich den Stack aus der Bereitstellung gelöscht habe?

Lesedauer: 4 Minute
0

Wenn ich meinen Code für das AWS Cloud Development Kit (AWS CDK) erneut bereitstelle, erhalte ich die Fehlermeldung „Bereits vorhanden“.

Lösung

Die meisten Ressourcen in der AWS-CDK-Konstruktbibliothek setzen die Eigenschaft removalPolicy standardmäßig auf den Status BEIBEHALTUNG. Wenn du die Eigenschaft removalPolicy für deine Ressourcen nicht auf BEIBEHALTUNG einstellst, werden die Ressourcen verwaist. Verwaiste Ressourcen verbleiben in deinem AWS-Konto, nachdem du den Stack gelöscht hast, und gehen danach in den Status DELETE_COMPLETE über.

Wenn du den Stack aktualisierst, entfernt AWS CDK die Ressource. Wenn du einen benutzerdefinierten Namen für die Ressourcen angegeben hast, wird der Fehler „Bereits vorhanden“ angezeigt, wenn du denselben Code erneut bereitstellst.

Hinweis: In den folgenden Schritten wird eine Beispiel-Bucket-Ressource von Amazon Simple Storage Service (Amazon S3) verwendet, die durch die Klasse s3.Bucket in AWS CDK dargestellt wird.

Beispiel für eine Ressource mit benutzerdefiniertem Namen:

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

Importiere die beibehaltene Ressource in deinen neuen Stack

Führe die folgenden Schritte aus:

  1. Stelle sicher, dass deine Umgebung die Anforderungen für die Verwendung des Befehls cdk import der AWS-CDK-Befehlszeilenschnittstelle (CLI) erfüllt.
    Hinweis: Du kannst keine Ressource in deinen Stack importieren, wenn du andere Ressourcen im Stack aktualisierst oder erstellst. Du kannst in einem einzigen Importvorgang nur eine oder mehrere Ressourcen importieren.

  2. Entferne vorübergehend alle anderen Ressourcen aus deinem Code, mit Ausnahme der Ressource, die du beibehalten möchtest. Die definierten Eigenschaften der Ressource, die du importierst, müssen mit den Eigenschaften der Ressource übereinstimmen, die du bereitgestellt hast. Importiere beispielsweise die beibehaltene S3-Bucket-Ressource s3-bucket.
    Hinweis: Lege eine Entfernungsrichtlinie für eine Ressource fest, um sie zu importieren.
    Beispiel für eine Richtlinie:

    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',

    Hinweis: Ersetze s3-bucket durch den S3-Bucket-Namen.

  3. Führe den folgenden Befehl cdk import aus, um den Ressourcenimport zu starten:

    cdk import
  4. Gib die Ressourcen-ID ein, wenn CDK dich dazu auffordert. Gib in diesem Beispiel den Namen für den S3 Bucket ein.

  5. Führe die Ressourcen aus deinem Code erneut ein und führe dann den folgenden Bereitstellungsbefehl aus:

    cdk deploy

Manuelles Löschen der beibehaltenen Ressource

Führen Sie die folgenden Schritte aus:

  1. Melde dich bei der AWS-Managementkonsole an.
  2. Wähle den Service der Ressourcen, die du nicht beibehalten möchtest.
  3. Lösche die Ressourcen manuell. Um beispielsweise die Ressource s3.bucket zu entfernen, lösche den Amazon-S3-Bucket.
  4. Führe den folgenden Bereitstellungsbefehl aus, um das AWS CDK erneut bereitzustellen:
    cdk deploy

Den Namen der beibehaltenen Ressource ändern

Führe die folgenden Schritte aus:

  1. Öffne den AWS-CDK-Code für die Ressource.
  2. Aktualisiere den Namen der Ressource auf einen eindeutigen Wert, der nicht mit dem Namen der beibehaltenen Ressource kollidiert:
    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     bucketName: 'amzn-s3-demo-bucket',
     versioned: false,
     encryption: s3.BucketEncryption.S3_MANAGED
     });
    Hinweis: Aktualisiere bei diesem Beispiel den Parameter bucketName, um den Namen der Ressource s3.Bucket zu ändern. Ersetze amzn-s3-demo-bucket durch deinen S3-Bucket-Namen.

Den Ressourcennamen löschen

Gehe wie folgt vor, um den Ressourcennamen zu löschen, sodass AWS CDK einen eindeutigen Namen generieren kann:

  1. Führe den folgenden Code aus, um den Ressourcennamen aus AWS CDK zu entfernen:
    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     versioned: false,
     encryption: s3.BucketEncryption.S3_MANAGED
     });
    Hinweis: Der vorherige Beispielcode entfernt die Eigenschaft bucketName, damit AWS CDK einen neuen Namen generieren kann.
  2. Führe den folgenden Bereitstellungsbefehl aus, um AWS CDK erneut bereitzustellen:
    cdk deploy

Setze die Eigenschaft removalPolicy auf ZERSTÖREN

Führe die folgenden Schritte aus:

  1. Öffne den AWS-CDK-Code für die Ressourcen.

  2. Setze die Eigenschaft removalPolicy auf DESTROY:

    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     bucketName: 'amzn-s3-demo-bucket',
     removalPolicy: RemovalPolicy.DESTROY
     });
  3. Um auf die AWS-CloudFormation-Vorlage zuzugreifen, führe den folgenden cdk-synth-Befehl aus:

    cdk synth
  4. Stelle dann sicher, dass DeletionPolicy und UpdateReplacePolicy auf Löschen eingestellt sind.