Behebung häufiger AWS CDK-Probleme - AWS Cloud Development Kit (AWS CDK) v2

Dies ist der AWS CDK v2-Entwicklerhandbuch. Das ältere CDK v1 wurde am 1. Juni 2022 in die Wartung aufgenommen und der Support wurde am 1. Juni 2023 eingestellt.

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Behebung häufiger AWS CDK-Probleme

In diesem Thema wird beschrieben, wie Sie die folgenden Probleme mit dem AWS CDK beheben können.

Nach der Aktualisierung des AWS CDK meldet das AWS CDK Toolkit (CLI) eine Nichtübereinstimmung mit der Construct Library AWS

Die Version des AWS CDK Toolkits (das den cdk Befehl bereitstellt) muss mindestens der Version des Construct Library-Hauptmoduls entsprechen. AWS aws-cdk-lib Das Toolkit soll abwärtskompatibel sein. Die neueste 2.x-Version des Toolkits kann mit jeder 1.x- oder 2.x-Version der Bibliothek verwendet werden. Aus diesem Grund empfehlen wir Ihnen, diese Komponente global zu installieren und auf dem neuesten Stand zu halten.

npm update -g aws-cdk

Wenn Sie mit mehreren Versionen des AWS CDK Toolkits arbeiten müssen, installieren Sie eine bestimmte Version des Toolkits lokal in Ihrem Projektordner.

Wenn Sie TypeScript oder verwenden JavaScript, enthält Ihr Projektverzeichnis bereits eine versionierte lokale Kopie des CDK Toolkits.

Wenn Sie eine andere Sprache verwenden, verwenden Sie diese, um das AWS CDK Toolkit npm zu installieren. Lassen Sie dabei das Flag weg und geben Sie die -g gewünschte Version an. Zum Beispiel:

npm install aws-cdk@2.0

Um ein lokal installiertes AWS CDK Toolkit auszuführen, verwenden Sie den Befehl statt nur. npx aws-cdk cdk Zum Beispiel:

npx aws-cdk deploy MyStack

npx aws-cdkführt die lokale Version des AWS CDK Toolkits aus, falls eine existiert. Es wird auf die globale Version zurückgegriffen, wenn ein Projekt keine lokale Installation hat. Möglicherweise finden Sie es praktisch, einen Shell-Alias einzurichten, um sicherzustellen, dass er immer auf diese Weise aufgerufen cdk wird.

macOS/Linux
alias cdk="npx aws-cdk"
Windows
doskey cdk=npx aws-cdk $*

Beim Bereitstellen meines AWS CDK-Stacks erhalte ich eine Fehlermeldung NoSuchBucket

Ihre AWS Umgebung wurde nicht gebootet und verfügt daher nicht über einen Amazon S3 S3-Bucket, in dem Ressourcen während der Bereitstellung gespeichert werden können. Sie können den Staging-Bucket und andere erforderliche Ressourcen mit dem folgenden Befehl erstellen:

cdk bootstrap aws://ACCOUNT-NUMBER/REGION

Um unerwartete AWS Gebühren zu vermeiden, AWS bootet das CDK keine Umgebung automatisch. Sie müssen für jede Umgebung, in der Sie das Deployment durchführen, explizit ein Bootstrap durchführen.

Standardmäßig werden die Bootstrap-Ressourcen in der Region oder den Regionen erstellt, die von Stacks in der aktuellen AWS CDK-Anwendung verwendet werden. Alternativ werden sie in der Region erstellt, die in Ihrem lokalen AWS Profil angegeben ist (festgelegt vonaws configure), wobei das Konto dieses Profils verwendet wird. Sie können in der Befehlszeile wie folgt ein anderes Konto und eine andere Region angeben. (Sie müssen das Konto und die Region angeben, wenn Sie sich nicht im Verzeichnis einer App befinden.)

cdk bootstrap aws://ACCOUNT-NUMBER/REGION

Weitere Informationen finden Sie unter AWS CDK-Bootstrapping.

Beim Bereitstellen meines AWS CDK-Stacks erhalte ich eine Meldung forbidden: null

Sie stellen einen Stack bereit, der Bootstrap-Ressourcen benötigt, aber eine IAM-Rolle oder ein IAM-Konto verwenden, dem die Schreibberechtigung fehlt. (Der Staging-Bucket wird verwendet, wenn Stacks bereitgestellt werden, die Assets enthalten oder eine AWS CloudFormation Vorlage synthetisieren, die größer als 50.000 ist.) Verwenden Sie ein Konto oder eine Rolle, die berechtigt ist, die Aktion für den in s3:* der Fehlermeldung genannten Bucket durchzuführen.

Wenn ich einen AWS CDK-Stack synthetisiere, erhalte ich die Meldung --app is required either in command-line, in cdk.json or in ~/.cdk.json

Diese Meldung bedeutet normalerweise, dass Sie sich zum Zeitpunkt der Ausgabe nicht im Hauptverzeichnis Ihres AWS CDK-Projekts befinden. cdk synth Die Datei cdk.json in diesem Verzeichnis, die durch den cdk init Befehl erstellt wurde, enthält die Befehlszeile, die Sie benötigen, um Ihre AWS CDK-App auszuführen (und damit zu synthetisieren). Für eine TypeScript App cdk.json sieht die Standardeinstellung beispielsweise etwa so aus:

{ "app": "npx ts-node bin/my-cdk-app.ts" }

Wir empfehlen, cdk Befehle nur im Hauptverzeichnis Ihres Projekts auszugeben, damit das AWS CDK-Toolkit Ihre App cdk.json dort finden und erfolgreich ausführen kann.

Falls das aus irgendeinem Grund nicht praktikabel ist, sucht das AWS CDK Toolkit an zwei anderen Stellen nach der Befehlszeile der App:

  • cdk.jsonIn deinem Home-Verzeichnis

  • Zum cdk synth Befehl selbst mit der -a Option

Sie könnten beispielsweise einen Stack aus einer TypeScript App wie folgt synthetisieren.

cdk synth --app "npx ts-node my-cdk-app.ts" MyStack

Beim Synthetisieren eines AWS CDK-Stacks erhalte ich eine Fehlermeldung, weil die AWS CloudFormation Vorlage zu viele Ressourcen enthält

Das AWS CDK generiert Vorlagen und stellt sie bereit. AWS CloudFormation AWS CloudFormation hat ein festes Limit für die Anzahl der Ressourcen, die ein Stack enthalten kann. Mit dem AWS CDK können Sie schneller an dieses Limit stoßen, als Sie vielleicht erwarten.

Anmerkung

Das AWS CloudFormation Ressourcenlimit liegt zum jetzigen Zeitpunkt bei 500. Das aktuelle Ressourcenlimit finden Sie unter AWS CloudFormation Kontingente.

Die absichtsbasierten Konstrukte der AWS Construct Library auf höherer Ebene stellen automatisch alle Hilfsressourcen bereit, die für die Protokollierung, Schlüsselverwaltung, Autorisierung und andere Zwecke benötigt werden. Wenn Sie beispielsweise einer Ressource Zugriff auf eine andere gewähren, werden alle IAM-Objekte generiert, die für die Kommunikation der jeweiligen Dienste erforderlich sind.

Unserer Erfahrung nach führt die reale Verwendung absichtsbasierter Konstrukte zu 1—5 AWS CloudFormation Ressourcen pro Konstrukt, obwohl dies variieren kann. Für serverlose Anwendungen sind AWS 5—8 Ressourcen pro API-Endpunkt typisch.

Muster, die eine höhere Abstraktionsebene darstellen, ermöglichen es Ihnen, noch mehr AWS Ressourcen mit noch weniger Code zu definieren. Der AWS CDK-Code im Beispiel: Create an AWS Fargate service using the AWS CDK generiert beispielsweise mehr als 50 AWS CloudFormation Ressourcen und definiert dabei nur drei Konstrukte!

Das Überschreiten des AWS CloudFormation Ressourcenlimits ist ein Fehler bei der Synthese. AWS CloudFormation Das AWS CDK gibt eine Warnung aus, wenn Ihr Stack 80% des Limits überschreitet. Sie können ein anderes Limit verwenden, indem Sie die maxResources Eigenschaft für Ihren Stack festlegen, oder die Validierung deaktivieren, indem Sie sie maxResources auf 0 setzen.

Tipp

Mit dem folgenden Utility-Skript können Sie die genaue Anzahl der Ressourcen in Ihrer synthetisierten Ausgabe ermitteln. (Da jeder AWS CDK-Entwickler Node.js benötigt, ist das Skript in JavaScript das Skript geschrieben.)

// rescount.js - count the resources defined in a stack // invoke with: node rescount.js <path-to-stack-json> // e.g. node rescount.js cdk.out/MyStack.template.json import * as fs from 'fs'; const path = process.argv[2]; if (path) fs.readFile(path, 'utf8', function(err, contents) { console.log(err ? `${err}` : `${Object.keys(JSON.parse(contents).Resources).length} resources defined in ${path}`); }); else console.log("Please specify the path to the stack's output .json file");

Wenn sich die Ressourcenanzahl Ihres Stacks dem Limit nähert, sollten Sie eine Neuarchitektur in Betracht ziehen, um die Anzahl der Ressourcen, die Ihr Stack enthält, zu reduzieren: zum Beispiel, indem Sie einige Lambda-Funktionen kombinieren oder Ihren Stack in mehrere Stapel aufteilen. Das CDK unterstützt Verweise zwischen Stacks, sodass Sie die Funktionalität Ihrer App auf die Art und Weise, die für Sie am sinnvollsten ist, in verschiedene Stapel aufteilen können.

Anmerkung

AWS CloudFormation Experten schlagen oft die Verwendung von verschachtelten Stacks als Lösung für das Ressourcenlimit vor. Das AWS CDK unterstützt diesen Ansatz über das Konstrukt. NestedStack

Ich habe drei (oder mehr) Availability Zones für meine Auto Scaling Scaling-Gruppe oder VPC angegeben, aber sie wurde nur in zwei bereitgestellt

Um die Anzahl der von Ihnen angeforderten Availability Zones zu ermitteln, geben Sie das Konto und die Region in der env Eigenschaft des Stacks an. Wenn Sie nicht beide angeben, synthetisiert das AWS CDK den Stack standardmäßig als umgebungsunabhängig. Sie können den Stack dann mithilfe von in einer bestimmten Region bereitstellen. AWS CloudFormation Da einige Regionen nur zwei Availability Zones haben, verwendet eine umgebungsunabhängige Vorlage nicht mehr als zwei.

Anmerkung

In der Vergangenheit wurden Regionen gelegentlich mit nur einer Availability Zone gestartet. Umgebungsunabhängige AWS CDK-Stacks können in solchen Regionen nicht bereitgestellt werden. Zum jetzigen Zeitpunkt haben jedoch alle AWS Regionen mindestens zwei. AZs

Sie können dieses Verhalten ändern, indem Sie die AvailabilityZones (Python:availability_zones) -Eigenschaft Ihres Stacks überschreiben, um explizit die Zonen anzugeben, die Sie verwenden möchten.

Weitere Informationen zur Angabe des Kontos und der Region eines Stacks bei der Synthese unter Beibehaltung der Flexibilität zur Bereitstellung in jeder Region finden Sie unter Umgebungen für das CDK. AWS

Mein S3-Bucket, meine DynamoDB-Tabelle oder eine andere Ressource werden bei der Ausgabe nicht gelöscht cdk destroy

Standardmäßig haben Ressourcen, die Benutzerdaten enthalten können, die Eigenschaft removalPolicy (Python:removal_policy) vonRETAIN, und die Ressource wird nicht gelöscht, wenn der Stack zerstört wird. Stattdessen wird die Ressource aus dem Stapel verwaist. Sie müssen die Ressource dann manuell löschen, nachdem der Stapel zerstört wurde. Solange Sie dies nicht tun, schlägt die erneute Bereitstellung des Stacks fehl. Dies liegt daran, dass der Name der neuen Ressource, die während der Bereitstellung erstellt wird, mit dem Namen der verwaisten Ressource in Konflikt steht.

Wenn Sie die Entfernungsrichtlinie einer Ressource auf festlegenDESTROY, wird diese Ressource gelöscht, wenn der Stapel zerstört wird.

TypeScript
import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as s3 from 'aws-cdk-lib/aws-s3'; export class CdkTestStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const bucket = new s3.Bucket(this, 'Bucket', { removalPolicy: cdk.RemovalPolicy.DESTROY, }); } }
JavaScript
const cdk = require('aws-cdk-lib'); const s3 = require('aws-cdk-lib/aws-s3'); class CdkTestStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); const bucket = new s3.Bucket(this, 'Bucket', { removalPolicy: cdk.RemovalPolicy.DESTROY }); } } module.exports = { CdkTestStack }
Python
import aws_cdk as cdk from constructs import Construct import aws_cdk.aws_s3 as s3 class CdkTestStack(cdk.stack): def __init__(self, scope: Construct, id: str, **kwargs): super().__init__(scope, id, **kwargs) bucket = s3.Bucket(self, "Bucket", removal_policy=cdk.RemovalPolicy.DESTROY)
Java
software.amazon.awscdk.*; import software.amazon.awscdk.services.s3.*; import software.constructs; public class CdkTestStack extends Stack { public CdkTestStack(final Construct scope, final String id) { this(scope, id, null); } public CdkTestStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); Bucket.Builder.create(this, "Bucket") .removalPolicy(RemovalPolicy.DESTROY).build(); } }
C#
using Amazon.CDK; using Amazon.CDK.AWS.S3; public CdkTestStack(Construct scope, string id, IStackProps props) : base(scope, id, props) { new Bucket(this, "Bucket", new BucketProps { RemovalPolicy = RemovalPolicy.DESTROY }); }
Anmerkung

AWS CloudFormation kann einen nicht leeren Amazon S3 S3-Bucket nicht löschen. Wenn Sie die Entfernungsrichtlinie eines Amazon S3 S3-Buckets auf festlegen und dieser Daten enthältDESTROY, schlägt der Versuch, den Stack zu löschen, fehl, da der Bucket nicht gelöscht werden kann. Sie können das AWS CDK die Objekte im Bucket löschen lassen, bevor Sie versuchen, ihn zu zerstören, indem Sie die autoDeleteObjects Requisite des Buckets auf setzen. true