Dies ist der AWS CDK v2-Entwicklerhandbuch. Das ältere CDK v1 wurde am 1. Juni 2022 gewartet 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.
Arbeiten mit AWS CDK in unterstützten Programmiersprachen
Verwenden Sie die AWS Cloud Development Kit (AWS CDK) , um Ihre AWS Cloud Infrastruktur mit einer unterstützten Programmiersprache zu definieren.
Importieren der AWS Konstruktbibliothek
Die AWS CDK enthält die AWS Construct Library, eine Sammlung von Konstrukten, die nach AWS Diensten organisiert sind. Die stabilen Konstrukte der Bibliothek werden in einem einzigen Modul angeboten, das durch seinen TypeScript Paketnamen aufgerufen wird: aws-cdk-lib
. Der tatsächliche Paketname variiert je nach Sprache.
- TypeScript
-
Installieren |
npm-Installation aws-cdk-lib |
Import |
const cdk = require Bolaws-cdk-lib'); |
- JavaScript
-
Installieren |
npm-Installation aws-cdk-lib |
Import |
const cdk = require Bolaws-cdk-lib'); |
- Python
-
Installieren |
python -m pip-Installation aws-cdk-lib |
Import |
Importieren von aws_cdk als cdk |
- Java
-
Hinzufügen zu pom.xml |
Group software.amazon.awscdk ; artifact aws-cdk-lib |
Import |
Importieren von software.amazon.awscdk.App; (for example) |
- C#
-
Installieren |
dotnet Paket Amazon.CDK.Lib hinzufügen |
Import |
mit Amazon.CDK; |
Die construct
Basisklasse und der unterstützende Code befinden sich im constructs
Modul . Experimentelle Konstrukte, bei denen die API noch verfeinert wird, werden als separate Module verteilt.
Die AWS CDK API-Referenz zu
Die AWS CDK API-Referenz enthält eine detaillierte Dokumentation der Konstrukte (und anderer Komponenten) in der Bibliothek. Für jede unterstützte Programmiersprache wird eine Version der API-Referenz bereitgestellt.
Das Referenzmaterial jedes Moduls ist in die folgenden Abschnitte unterteilt.
-
Übersicht: Einführungsmaterial, das Sie kennen müssen, um mit dem Service in der AWS CDK, einschließlich Konzepten und Beispielen, arbeiten zu können.
-
Konstrukte: Bibliotheksklassen, die eine oder mehrere konkrete AWS Ressourcen darstellen. Dies sind die „kuratierten“ (L2) Ressourcen oder Muster (L3-Ressourcen), die eine High-Level-Schnittstelle mit verzweigten Standardwerten bereitstellen.
-
Klassen : Nicht-Konstrukt-Klassen, die Funktionen bereitstellen, die von Konstrukten im Modul verwendet werden.
-
Strukturen : Datenstrukturen (Attributpakete), die die Struktur zusammengesetzter Werte wie Eigenschaften (das Argument von props
Konstrukten) und Optionen definieren.
-
Schnittstellen : Schnittstellen, deren Namen alle mit „I“ beginnen, definieren die absolute Mindestfunktionalität für das entsprechende Konstrukt oder eine andere Klasse. Das CDK verwendet Konstruktschnittstellen, um AWS Ressourcen darzustellen, die außerhalb Ihrer AWS CDK App definiert sind und von Methoden wie referenziert werdenBucket.fromBucketArn()
.
-
Enums : Sammlungen benannter Werte zur Angabe bestimmter Konstruktparameter. Die Verwendung eines Aufzählungswerts ermöglicht es dem CDK, diese Werte während der Synthetisierung auf Gültigkeit zu überprüfen.
-
CloudFormation Ressourcen : Diese L1-Konstrukte, deren Namen mit „Cfn“ beginnen, stellen genau die in der CloudFormation Spezifikation definierten Ressourcen dar. Sie werden automatisch mit jeder CDK-Version aus dieser Spezifikation generiert. Jedes L2- oder L3-Konstrukt kapselt eine oder mehrere CloudFormation Ressourcen.
-
CloudFormation Eigenschaftstypen : Die Sammlung benannter Werte, die die Eigenschaften für jede CloudFormation Ressource definieren.
Schnittstellen im Vergleich zu Konstruktklassen
Die AWS CDK verwendet Schnittstellen auf eine bestimmte Weise, die möglicherweise nicht offensichtlich ist, selbst wenn Sie mit Schnittstellen als Programmierkonzept vertraut sind.
unterstützt die AWS CDK Verwendung von Ressourcen, die außerhalb von CDK-Anwendungen definiert wurden, mit Methoden wie Bucket.fromBucketArn()
. Externe Ressourcen können nicht geändert werden und verfügen möglicherweise nicht über alle Funktionen, die mit Ressourcen verfügbar sind, die in Ihrer CDK-App definiert sind, z. B. die -Bucket
Klasse. Schnittstellen stellen dann die im CDK verfügbare Mindestfunktionalität für einen bestimmten AWS Ressourcentyp dar, einschließlich externer Ressourcen.
Wenn Sie Ressourcen in Ihrer CDK-App instanziieren, sollten Sie immer konkrete Klassen wie verwendenBucket
. Wenn Sie den Typ eines Arguments angeben, das Sie in einem Ihrer eigenen Konstrukte akzeptieren, verwenden Sie den Schnittstellentyp, z. B. , IBucket
wenn Sie bereit sind, sich mit externen Ressourcen zu befassen (d. h. Sie müssen sie nicht ändern). Wenn Sie ein CDK-definiertes Konstrukt benötigen, geben Sie den allgemeinsten Typ an, den Sie verwenden können.
Einige Schnittstellen sind Mindestversionen von Eigenschaften oder Optionspaketen, die bestimmten Klassen zugeordnet sind, und nicht Konstrukten. Solche Schnittstellen können nützlich sein, wenn Sie ein Subclassing durchführen, um Argumente zu akzeptieren, die Sie an Ihre übergeordnete Klasse übergeben. Wenn Sie eine oder mehrere zusätzliche Eigenschaften benötigen, möchten Sie diese Schnittstelle oder einen bestimmten Typ implementieren oder daraus ableiten.
Einige von unterstützte Programmiersprachen verfügen AWS CDK über keine Schnittstellenfunktion. In diesen Sprachen sind Schnittstellen einfach übliche Klassen. Sie können sie anhand ihrer Namen identifizieren, die dem Muster eines anfänglichen „I“ gefolgt vom Namen eines anderen Konstrukts folgen (z. B. IBucket
). Es gelten dieselben Regeln.
Verwalten von Abhängigkeiten
Abhängigkeiten für Ihre AWS CDK App oder Bibliothek werden mithilfe von Paketverwaltungstools verwaltet. Diese Tools werden häufig mit den Programmiersprachen verwendet.
In der Regel AWS CDK unterstützt das das standardmäßige oder offizielle Paketverwaltungs-Tool der Sprache, falls es eines gibt. Andernfalls AWS CDK unterstützt die die beliebteste oder weit verbreitetste der Sprache. Möglicherweise können Sie auch andere Tools verwenden, insbesondere wenn sie mit den unterstützten Tools funktionieren. Die offizielle Unterstützung für andere Tools ist jedoch begrenzt.
Die AWS CDK unterstützt die folgenden Paketmanager:
Sprache |
Unterstütztes Paketverwaltungstool |
TypeScript/JavaScript |
NPM (Node Package Manager) oder Yarn |
Python |
PIP (Package Installer für Python) |
Java |
Maven |
C# |
NuGet |
Go |
Go-Module |
Wenn Sie ein neues Projekt mit dem AWS CDK CLI cdk init
Befehl erstellen, werden Abhängigkeiten für die CDK-Kernbibliotheken und stabile Konstrukte automatisch angegeben.
Weitere Informationen zum Verwalten von Abhängigkeiten für unterstützte Programmiersprachen finden Sie im Folgenden:
Vergleich von AWS CDK in TypeScript mit anderen Sprachen
TypeScript war die erste Sprache, die für die Entwicklung von AWS CDK Anwendungen unterstützt wurde. Daher wird eine beträchtliche Menge an Beispiel-CDK-Code in geschrieben TypeScript. Wenn Sie in einer anderen Sprache entwickeln, kann es nützlich sein, zu vergleichen, wie AWS CDK Code in im TypeScript Vergleich zu Ihrer Sprache Ihrer Wahl implementiert wird. Dies kann Ihnen helfen, die Beispiele in der gesamten Dokumentation zu verwenden.
Importieren eines Moduls
- TypeScript/JavaScript
-
TypeScript unterstützt den Import entweder eines gesamten Namespace oder einzelner Objekte aus einem Namespace. Jeder Namespace enthält Konstrukte und andere Klassen zur Verwendung mit einem bestimmten AWS Service.
// Import main CDK library as cdk
import * as cdk from 'aws-cdk-lib'; // ES6 import preferred in TS
const cdk = require('aws-cdk-lib'); // Node.js require() preferred in JS
// Import specific core CDK classes
import { Stack, App } from 'aws-cdk-lib';
const { Stack, App } = require('aws-cdk-lib');
// Import AWS S3 namespace as s3 into current namespace
import { aws_s3 as s3 } from 'aws-cdk-lib'; // TypeScript
const s3 = require('aws-cdk-lib/aws-s3'); // JavaScript
// Having imported cdk already as above, this is also valid
const s3 = cdk.aws_s3;
// Now use s3 to access the S3 types
const bucket = s3.Bucket(...);
// Selective import of s3.Bucket
import { Bucket } from 'aws-cdk-lib/aws-s3'; // TypeScript
const { Bucket } = require('aws-cdk-lib/aws-s3'); // JavaScript
// Now use Bucket to instantiate an S3 bucket
const bucket = Bucket(...);
- Python
-
Wie unterstützt TypeScriptPython auch Importe von namespace-Modulen und selektive Importe. Namespaces in Python sehen wie aws_cdk.xxx aus, wobei xxx einen - AWS Servicenamen darstellt, z. B. s3 für Amazon S3. (Amazon S3 wird in diesen Beispielen verwendet).
# Import main CDK library as cdk
import aws_cdk as cdk
# Selective import of specific core classes
from aws_cdk import Stack, App
# Import entire module as s3 into current namespace
import aws_cdk.aws_s3 as s3
# s3 can now be used to access classes it contains
bucket = s3.Bucket(...)
# Selective import of s3.Bucket into current namespace
from aws_cdk.s3 import Bucket
# Bucket can now be used to instantiate a bucket
bucket = Bucket(...)
- Java
-
Java-Importe funktionieren anders als TypeScript. Jede Importanweisung importiert entweder einen einzelnen Klassennamen aus einem bestimmten Paket oder alle in diesem Paket definierten Klassen (mit *
). Auf Klassen kann entweder mit dem Klassennamen selbst zugegriffen werden, wenn er importiert wurde, oder mit dem qualifizierten Klassennamen einschließlich seines Pakets.
Bibliotheken werden wie software.amazon.awscdk.services.xxx
für die AWS Construct Library benannt (die Hauptbibliothek ist software.amazon.awscdk
). Die Maven-Gruppen-ID für AWS CDK Pakete lautet software.amazon.awscdk
.
// Make certain core classes available
import software.amazon.awscdk.Stack;
import software.amazon.awscdk.App;
// Make all Amazon S3 construct library classes available
import software.amazon.awscdk.services.s3.*;
// Make only Bucket and EventType classes available
import software.amazon.awscdk.services.s3.Bucket;
import software.amazon.awscdk.services.s3.EventType;
// An imported class may now be accessed using the simple class name (assuming that name
// does not conflict with another class)
Bucket bucket = Bucket.Builder.create(...).build();
// We can always use the qualified name of a class (including its package) even without an
// import directive
software.amazon.awscdk.services.s3.Bucket bucket =
software.amazon.awscdk.services.s3.Bucket.Builder.create(...)
.build();
// Java 10 or later can use var keyword to avoid typing the type twice
var bucket =
software.amazon.awscdk.services.s3.Bucket.Builder.create(...)
.build();
- C#
-
In C# importieren Sie Typen mit der -using
Richtlinie. Es gibt zwei Stile. Eine ermöglicht Ihnen den Zugriff auf alle Typen im angegebenen Namespace unter Verwendung ihrer einfachen Namen. Mit dem anderen können Sie mithilfe eines Alias auf den Namespace selbst verweisen.
Pakete werden wie Amazon.CDK.AWS.xxx
für Pakete der AWS Construct Library benannt. (Das Kernmodul ist Amazon.CDK
.)
// Make CDK base classes available under cdk
using cdk = Amazon.CDK;
// Make all Amazon S3 construct library classes available
using Amazon.CDK.AWS.S3;
// Now we can access any S3 type using its name
var bucket = new Bucket(...);
// Import the S3 namespace under an alias
using s3 = Amazon.CDK.AWS.S3;
// Now we can access an S3 type through the namespace alias
var bucket = new s3.Bucket(...);
// We can always use the qualified name of a type (including its namespace) even without a
// using directive
var bucket = new Amazon.CDK.AWS.S3.Bucket(...)
- Go
-
Jedes Modul der AWS Construct Library wird als Go-Paket bereitgestellt.
import (
"github.com/aws/aws-cdk-go/awscdk/v2" // CDK core package
"github.com/aws/aws-cdk-go/awscdk/v2/awss3" // AWS S3 construct library module
)
// now instantiate a bucket
bucket := awss3.NewBucket(...)
// use aliases for brevity/clarity
import (
cdk "github.com/aws/aws-cdk-go/awscdk/v2" // CDK core package
s3 "github.com/aws/aws-cdk-go/awscdk/v2/awss3" // AWS S3 construct library module
)
bucket := s3.NewBucket(...)
Instanziieren eines Konstrukts
AWS CDK -Konstruktklassen haben in allen unterstützten Sprachen denselben Namen. Die meisten Sprachen verwenden das new
Schlüsselwort , um eine Klasse zu instanziieren (Python und Go tun dies nicht). Außerdem this
bezieht sich das Schlüsselwort in den meisten Sprachen auf die aktuelle Instance. (Python verwendet self
nach Konvention.) Sie sollten einen Verweis auf die aktuelle Instance als scope
Parameter an jedes Konstrukt übergeben, das Sie erstellen.
Das dritte Argument für ein AWS CDK Konstrukt ist props
, ein Objekt, das Attribute enthält, die zum Erstellen des Konstrukts erforderlich sind. Dieses Argument kann optional sein, aber wenn es erforderlich ist, behandeln die unterstützten Sprachen es auf idiomatische Weise. Die Namen der Attribute werden auch an die Standardnamensmuster der Sprache angepasst.
- TypeScript/JavaScript
-
// Instantiate default Bucket
const bucket = new s3.Bucket(this, 'MyBucket');
// Instantiate Bucket with bucketName and versioned properties
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: 'my-bucket',
versioned: true,
});
// Instantiate Bucket with websiteRedirect, which has its own sub-properties
const bucket = new s3.Bucket(this, 'MyBucket', {
websiteRedirect: {host: 'aws.amazon.com'}});
- Python
-
Python verwendet beim Instanziieren einer Klasse kein new
Schlüsselwort. Das Eigenschaftenargument wird mithilfe von Schlüsselwortargumenten dargestellt, und die Argumente werden mit benanntsnake_case
.
Wenn es sich bei einem Eigenschaftswert selbst um ein Paket von Attributen handelt, wird er durch eine Klasse mit dem Namen nach der Eigenschaft dargestellt, die Schlüsselwortargumente für die Untereigenschaften akzeptiert.
In Python wird die aktuelle Instance als erstes Argument, das self
nach Konvention benannt ist, an Methoden übergeben.
# Instantiate default Bucket
bucket = s3.Bucket(self, "MyBucket")
# Instantiate Bucket with bucket_name and versioned properties
bucket = s3.Bucket(self, "MyBucket", bucket_name="my-bucket", versioned=true)
# Instantiate Bucket with website_redirect, which has its own sub-properties
bucket = s3.Bucket(self, "MyBucket", website_redirect=s3.WebsiteRedirect(
host_name="aws.amazon.com"))
- Java
-
In Java wird das Props-Argument durch eine Klasse mit dem Namen dargestellt XxxxProps
(z. B. BucketProps
für die Props des Bucket
Konstrukts). Sie erstellen das Props-Argument mit einem Builder-Muster.
Jede XxxxProps
Klasse hat einen Builder. Es gibt auch einen praktischen Builder für jedes Konstrukt, das die Eigenschaften und das Konstrukt in einem Schritt erstellt, wie im folgenden Beispiel gezeigt.
Props werden mit gleich benannt wie in TypeScriptcamelCase
.
// Instantiate default Bucket
Bucket bucket = Bucket(self, "MyBucket");
// Instantiate Bucket with bucketName and versioned properties
Bucket bucket = Bucket.Builder.create(self, "MyBucket")
.bucketName("my-bucket").versioned(true)
.build();
# Instantiate Bucket with websiteRedirect, which has its own sub-properties
Bucket bucket = Bucket.Builder.create(self, "MyBucket")
.websiteRedirect(new websiteRedirect.Builder()
.hostName("aws.amazon.com").build())
.build();
- C#
-
In C# werden Eigenschaften mithilfe eines Objektinitialisierers für eine Klasse namens XxxxProps
(z. B. BucketProps
für die Eigenschaften des Bucket
Konstrukts) angegeben.
Props werden ähnlich benannt wie TypeScript, mit Ausnahme von PascalCase
.
Es ist praktisch, das var
Schlüsselwort beim Instanziieren eines Konstrukts zu verwenden, sodass Sie den Klassennamen nicht zweimal eingeben müssen. Ihr lokaler Leitfaden zum Codestil kann jedoch variieren.
// Instantiate default Bucket
var bucket = Bucket(self, "MyBucket");
// Instantiate Bucket with BucketName and Versioned properties
var bucket = Bucket(self, "MyBucket", new BucketProps {
BucketName = "my-bucket",
Versioned = true});
// Instantiate Bucket with WebsiteRedirect, which has its own sub-properties
var bucket = Bucket(self, "MyBucket", new BucketProps {
WebsiteRedirect = new WebsiteRedirect {
HostName = "aws.amazon.com"
}});
- Go
-
Um ein Konstrukt in Go zu erstellen, rufen Sie die Funktion auf, NewXxxxxx
wobei der Name des Konstrukts Xxxxxxx
ist. Die Eigenschaften der Konstrukte sind als Struktur definiert.
In Go sind alle Konstruktparameter Zeiger, einschließlich Werte wie Zahlen, boolesche Werte und Zeichenfolgen. Verwenden Sie die Convenience-Funktionen wie jsii.String
, um diese Zeiger zu erstellen.
// Instantiate default Bucket
bucket := awss3.NewBucket(stack, jsii.String("MyBucket"), nil)
// Instantiate Bucket with BucketName and Versioned properties
bucket1 := awss3.NewBucket(stack, jsii.String("MyBucket"), &awss3.BucketProps{
BucketName: jsii.String("my-bucket"),
Versioned: jsii.Bool(true),
})
// Instantiate Bucket with WebsiteRedirect, which has its own sub-properties
bucket2 := awss3.NewBucket(stack, jsii.String("MyBucket"), &awss3.BucketProps{
WebsiteRedirect: &awss3.RedirectTarget{
HostName: jsii.String("aws.amazon.com"),
}})
Zugreifen auf Mitglieder
Es ist üblich, sich auf Attribute oder Eigenschaften von Konstrukten und anderen AWS CDK Klassen zu beziehen und diese Werte beispielsweise als Eingaben zum Erstellen anderer Konstrukte zu verwenden. Die zuvor beschriebenen Namensunterschiede für Methoden gelten auch hier. Darüber hinaus ist es in Java nicht möglich, direkt auf Mitglieder zuzugreifen. Stattdessen wird eine getter-Methode bereitgestellt.
- TypeScript/JavaScript
-
Namen sind camelCase
.
bucket.bucketArn
- Python
-
Namen sind snake_case
.
bucket.bucket_arn
- Java
-
Für jede Eigenschaft wird eine Getter-Methode bereitgestellt. Diese Namen sind camelCase
.
bucket.getBucketArn()
- C#
-
Namen sind PascalCase
.
bucket.BucketArn
- Go
-
Namen sind PascalCase
.
bucket.BucketArn
Aufzählungskonstanten
Enum-Konstanten sind auf eine Klasse beschränkt und haben Großbuchstaben mit Unterstrichen in allen Sprachen (manchmal auch als bezeichnetSCREAMING_SNAKE_CASE
). Da Klassennamen in allen unterstützten Sprachen außer Go auch dieselbe Groß- und Kleinschreibung verwenden, sind qualifizierte Enum-Namen in diesen Sprachen ebenfalls identisch.
s3.BucketEncryption.KMS_MANAGED
In Go sind Enum-Konstanten Attribute des Modul-Namespaces und werden wie folgt geschrieben.
awss3.BucketEncryption_KMS_MANAGED
Objektschnittstellen
Die AWS CDK verwendet TypeScript Objektschnittstellen, um anzugeben, dass eine Klasse einen erwarteten Satz von Methoden und Eigenschaften implementiert. Sie können eine Objektschnittstelle erkennen, da ihr Name mit beginntI
. Eine konkrete Klasse gibt die Schnittstellen an, die sie mithilfe des implements
Schlüsselworts implementiert.
- TypeScript/JavaScript
-
JavaScript verfügt über kein Schnittstellenfeature. Sie können das implements
Schlüsselwort und die darauf folgenden Klassennamen ignorieren.
import { IAspect, IConstruct } from 'aws-cdk-lib';
class MyAspect implements IAspect {
public visit(node: IConstruct) {
console.log('Visited', node.node.path);
}
}
- Python
-
Python verfügt über keine Schnittstellenfunktion. Für können AWS CDK Sie jedoch die Schnittstellenimplementierung angeben, indem Sie Ihre Klasse mit dekorieren@jsii.implements(interface)
.
from aws_cdk import IAspect, IConstruct
import jsii
@jsii.implements(IAspect)
class MyAspect():
def visit(self, node: IConstruct) -> None:
print("Visited", node.node.path)
- Java
-
import software.amazon.awscdk.IAspect;
import software.amazon.awscdk.IConstruct;
public class MyAspect implements IAspect {
public void visit(IConstruct node) {
System.out.format("Visited %s", node.getNode().getPath());
}
}
- C#
-
using Amazon.CDK;
public class MyAspect : IAspect
{
public void Visit(IConstruct node)
{
System.Console.WriteLine($"Visited ${node.Node.Path}");
}
}
- Go
-
Go-Strukturen müssen nicht explizit deklarieren, welche Schnittstellen sie implementieren. Der Go-Compiler bestimmt die Implementierung basierend auf den Methoden und Eigenschaften, die in der -Struktur verfügbar sind. Im folgenden Code MyAspect
implementiert beispielsweise die IAspect
Schnittstelle, da sie eine Visit
Methode bereitstellt, die ein Konstrukt verwendet.
type MyAspect struct {
}
func (a MyAspect) Visit(node constructs.IConstruct) {
fmt.Println("Visited", *node.Node().Path())
}