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.
In diesem Thema wird beschrieben, wie Sie die folgenden Probleme mit dem beheben können AWS CDK.
Nach der AWS CDK Aktualisierung von meldet das AWS CDK Toolkit (CLI) eine Nichtübereinstimmung mit der AWS Construct-Bibliothek
Die Version des AWS CDK Toolkits (das den cdk
Befehl bereitstellt) muss mindestens der Version des Hauptmoduls der AWS Construct Library entsprechen,. 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 -g
Flag weg und geben Sie die 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 npx aws-cdk
statt nur. cdk
Zum Beispiel:
npx aws-cdk deploy MyStack
npx aws-cdk
fü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.
alias cdk="npx aws-cdk"
Beim Bereitstellen meines AWS CDK Stacks erhalte ich eine NoSuchBucket
Fehlermeldung
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 CDK bootet der keine Umgebung automatisch. Sie müssen jede Umgebung, in der Sie die Bereitstellung durchführen, explizit bootstrappen.
Standardmäßig werden die Bootstrap-Ressourcen in der Region oder den Regionen erstellt, die von Stacks in der aktuellen Anwendung verwendet werden. AWS CDK
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 forbidden: null
Nachricht
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 bei der Ausgabe cdk
synth
nicht im Hauptverzeichnis Ihres AWS CDK Projekts befinden. Die Datei cdk.json
in diesem Verzeichnis, die durch den cdk init
Befehl erstellt wurde, enthält die Befehlszeile, die zum Ausführen (und damit zum Synthetisieren) Ihrer AWS CDK App erforderlich ist. 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.json
In 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 Stapel 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 in generiert Beispiel: Erstellen Sie einen AWS Fargate Dienst mit dem AWS CDK beispielsweise mehr als 50 AWS CloudFormation Ressourcen und definiert gleichzeitig nur drei Konstrukte!
Das Überschreiten des AWS CloudFormation Ressourcenlimits ist ein Fehler bei der AWS CloudFormation Synthese. Der 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 maxResources
sie 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 das Skript geschrieben JavaScript.)
// 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. Der 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 der den AWS CDK 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 Eigenschaft availablilityZones
(Python:availability_zones
) 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 unterUmgebungen für die AWS CDK.
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.
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,
});
}
}
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 die Objekte im Bucket AWS CDK löschen lassen, bevor Sie versuchen, ihn zu zerstören, indem Sie die autoDeleteObjects
Requisite des Buckets auf true
setzen.