Dies ist der AWS CDK v2-Entwicklerhandbuch. Die ältere CDK Version 1 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.
Ressourcen und die AWS CDK
Ressourcen sind das, was Sie für die Verwendung AWS-Services in Ihren Anwendungen konfigurieren. Ressourcen sind ein Feature von AWS CloudFormation. Indem Sie Ressourcen und ihre Eigenschaften in einer AWS CloudFormation Vorlage konfigurieren, können Sie diese bereitstellen, AWS CloudFormation um Ihre Ressourcen bereitzustellen. Mit dem AWS Cloud Development Kit (AWS CDK) können Sie Ressourcen mithilfe von Konstrukten konfigurieren. Anschließend stellen Sie Ihre CDK App bereit. Dazu müssen Sie eine AWS CloudFormation Vorlage synthetisieren und diese bereitstellen, AWS CloudFormation um Ihre Ressourcen bereitzustellen.
Wie unter beschriebenAWS CDK Konstrukte, AWS CDK bietet das eine umfangreiche Klassenbibliothek mit Konstrukten, sogenannten AWS Konstrukten, die alle Ressourcen repräsentieren. AWS
Um eine Instanz einer Ressource mit dem entsprechenden Konstrukt zu erstellen, übergeben Sie den Gültigkeitsbereich als erstes Argument, die logische ID des Konstrukts und eine Reihe von Konfigurationseigenschaften (Requisiten). So erstellen Sie beispielsweise eine SQS Amazon-Warteschlange mit AWS KMS Verschlüsselung mithilfe des SQS.Queue-Konstrukts aus der AWS Construct-Bibliothek.
- TypeScript
-
import * as sqs from '@aws-cdk/aws-sqs';
new sqs.Queue(this, 'MyQueue', {
encryption: sqs.QueueEncryption.KMS_MANAGED
});
- JavaScript
-
const sqs = require('@aws-cdk/aws-sqs');
new sqs.Queue(this, 'MyQueue', {
encryption: sqs.QueueEncryption.KMS_MANAGED
});
- Python
-
import aws_cdk.aws_sqs as sqs
sqs.Queue(self, "MyQueue", encryption=sqs.QueueEncryption.KMS_MANAGED)
- Java
-
import software.amazon.awscdk.services.sqs.*;
Queue.Builder.create(this, "MyQueue").encryption(
QueueEncryption.KMS_MANAGED).build();
- C#
-
using Amazon.CDK.AWS.SQS;
new Queue(this, "MyQueue", new QueueProps
{
Encryption = QueueEncryption.KMS_MANAGED
});
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/jsii-runtime-go"
sqs "github.com/aws/aws-cdk-go/awscdk/v2/awssqs"
)
sqs.NewQueue(stack, jsii.String("MyQueue"), &sqs.QueueProps{
Encryption: sqs.QueueEncryption_KMS_MANAGED,
})
Einige Konfigurationsrequisiten sind optional und haben in vielen Fällen Standardwerte. In einigen Fällen sind alle Requisiten optional, und das letzte Argument kann vollständig weggelassen werden.
Ressourcenattribute
Die meisten Ressourcen in der AWS Construct-Bibliothek stellen Attribute zur Verfügung, die bei der Bereitstellung von AWS CloudFormation aufgelöst werden. Attribute werden in Form von Eigenschaften für die Ressourcenklassen mit dem Typnamen als Präfix verfügbar gemacht. Das folgende Beispiel zeigt, wie Sie mithilfe URL der Eigenschaft queueUrl
(Python:queue_url
) den Wert einer SQS Amazon-Warteschlange abrufen.
- TypeScript
-
import * as sqs from '@aws-cdk/aws-sqs';
const queue = new sqs.Queue(this, 'MyQueue');
const url = queue.queueUrl; // => A string representing a deploy-time value
- JavaScript
-
const sqs = require('@aws-cdk/aws-sqs');
const queue = new sqs.Queue(this, 'MyQueue');
const url = queue.queueUrl; // => A string representing a deploy-time value
- Python
-
import aws_cdk.aws_sqs as sqs
queue = sqs.Queue(self, "MyQueue")
url = queue.queue_url # => A string representing a deploy-time value
- Java
-
Queue queue = new Queue(this, "MyQueue");
String url = queue.getQueueUrl(); // => A string representing a deploy-time value
- C#
-
var queue = new Queue(this, "MyQueue");
var url = queue.QueueUrl; // => A string representing a deploy-time value
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/jsii-runtime-go"
sqs "github.com/aws/aws-cdk-go/awscdk/v2/awssqs"
)
queue := sqs.NewQueue(stack, jsii.String("MyQueue"), &sqs.QueueProps{})
url := queue.QueueUrl() // => A string representing a deploy-time value
Informationen darüber, wie die Bereitstellungszeitattribute als AWS CDK Zeichenketten kodiert, finden Sie unterTokens und die AWS CDK.
Ressourcen referenzieren
Bei der Konfiguration von Ressourcen müssen Sie häufig auf Eigenschaften einer anderen Ressource verweisen. Im Folgenden sind einige Beispiele aufgeführt:
-
Eine Amazon Elastic Container Service (AmazonECS) -Ressource benötigt einen Verweis auf den Cluster, auf dem sie ausgeführt wird.
-
Für eine CloudFront Amazon-Distribution ist ein Verweis auf den Amazon Simple Storage Service (Amazon S3) -Bucket erforderlich, der den Quellcode enthält.
Sie können auf eine der folgenden Arten auf Ressourcen verweisen:
-
Indem Sie eine in Ihrer CDK App definierte Ressource übergeben, entweder im selben Stack oder in einem anderen
-
Indem Sie ein Proxy-Objekt übergeben, das auf eine in Ihrem AWS Konto definierte Ressource verweist, die aus einer eindeutigen Kennung der Ressource (z. B. einemARN) erstellt wurde
Wenn die Eigenschaft eines Konstrukts ein Konstrukt für eine andere Ressource darstellt, entspricht ihr Typ dem Schnittstellentyp des Konstrukts. Das ECS Amazon-Konstrukt verwendet beispielsweise eine Eigenschaft cluster
vom Typecs.ICluster
. Ein anderes Beispiel ist das CloudFront Verteilungskonstrukt, das eine Eigenschaft sourceBucket
(Python:source_bucket
) vom Typ annimmts3.IBucket
.
Sie können jedes Ressourcenobjekt des richtigen Typs, das in derselben AWS CDK App definiert ist, direkt übergeben. Das folgende Beispiel definiert einen ECS Amazon-Cluster und verwendet ihn dann, um einen ECS Amazon-Service zu definieren.
- TypeScript
-
const cluster = new ecs.Cluster(this, 'Cluster', { /*...*/ });
const service = new ecs.Ec2Service(this, 'Service', { cluster: cluster });
- JavaScript
-
const cluster = new ecs.Cluster(this, 'Cluster', { /*...*/ });
const service = new ecs.Ec2Service(this, 'Service', { cluster: cluster });
- Python
-
cluster = ecs.Cluster(self, "Cluster")
service = ecs.Ec2Service(self, "Service", cluster=cluster)
- Java
-
Cluster cluster = new Cluster(this, "Cluster");
Ec2Service service = new Ec2Service(this, "Service",
new Ec2ServiceProps.Builder().cluster(cluster).build());
- C#
-
var cluster = new Cluster(this, "Cluster");
var service = new Ec2Service(this, "Service", new Ec2ServiceProps { Cluster = cluster });
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/jsii-runtime-go"
ecs "github.com/aws/aws-cdk-go/awscdk/v2/awsecs"
)
cluster := ecs.NewCluster(stack, jsii.String("MyCluster"), &ecs.ClusterProps{})
service := ecs.NewEc2Service(stack, jsii.String("MyService"), &ecs.Ec2ServiceProps{
Cluster: cluster,
})
Referenzieren von Ressourcen in einem anderen Stack
Sie können auf Ressourcen in einem anderen Stack verweisen, sofern sie in derselben App definiert sind und sich in derselben AWS Umgebung befinden. Das folgende Muster wird im Allgemeinen verwendet:
-
Speichern Sie einen Verweis auf das Konstrukt als Attribut des Stacks, der die Ressource erzeugt. (Um einen Verweis auf den Stack des aktuellen Konstrukts zu erhalten, verwenden SieStack.of(this)
.)
-
Übergeben Sie diese Referenz als Parameter oder Eigenschaft an den Konstruktor des Stacks, der die Ressource verbraucht. Der verbrauchende Stapel übergibt ihn dann als Eigenschaft an jedes Konstrukt, das ihn benötigt.
Das folgende Beispiel definiert einen Stapelstack1
. Dieser Stack definiert einen Amazon S3 S3-Bucket und speichert einen Verweis auf das Bucket-Konstrukt als Attribut des Stacks. Dann definiert die App einen zweiten Stackstack2
, der bei der Instanziierung einen Bucket akzeptiert. stack2
könnte zum Beispiel eine AWS Glue Tabelle definieren, die den Bucket für die Datenspeicherung verwendet.
- TypeScript
-
const prod = { account: '123456789012', region: 'us-east-1' };
const stack1 = new StackThatProvidesABucket(app, 'Stack1', { env: prod });
// stack2 will take a property { bucket: IBucket }
const stack2 = new StackThatExpectsABucket(app, 'Stack2', {
bucket: stack1.bucket,
env: prod
});
- JavaScript
-
const prod = { account: '123456789012', region: 'us-east-1' };
const stack1 = new StackThatProvidesABucket(app, 'Stack1', { env: prod });
// stack2 will take a property { bucket: IBucket }
const stack2 = new StackThatExpectsABucket(app, 'Stack2', {
bucket: stack1.bucket,
env: prod
});
- Python
-
prod = core.Environment(account="123456789012", region="us-east-1")
stack1 = StackThatProvidesABucket(app, "Stack1", env=prod)
# stack2 will take a property "bucket"
stack2 = StackThatExpectsABucket(app, "Stack2", bucket=stack1.bucket, env=prod)
- Java
-
// Helper method to build an environment
static Environment makeEnv(String account, String region) {
return Environment.builder().account(account).region(region)
.build();
}
App app = new App();
Environment prod = makeEnv("123456789012", "us-east-1");
StackThatProvidesABucket stack1 = new StackThatProvidesABucket(app, "Stack1",
StackProps.builder().env(prod).build());
// stack2 will take an argument "bucket"
StackThatExpectsABucket stack2 = new StackThatExpectsABucket(app, "Stack,",
StackProps.builder().env(prod).build(), stack1.bucket);
- C#
-
Amazon.CDK.Environment makeEnv(string account, string region)
{
return new Amazon.CDK.Environment { Account = account, Region = region };
}
var prod = makeEnv(account: "123456789012", region: "us-east-1");
var stack1 = new StackThatProvidesABucket(app, "Stack1", new StackProps { Env = prod });
// stack2 will take a property "bucket"
var stack2 = new StackThatExpectsABucket(app, "Stack2", new StackProps { Env = prod,
bucket = stack1.Bucket});
Wenn der AWS CDK feststellt, dass sich die Ressource in derselben Umgebung, aber in einem anderen Stapel befindet, synthetisiert er automatisch AWS CloudFormation Exporte im produzierenden Stapel und ein Fn:: ImportValue im verbrauchenden Stapel, um diese Informationen von einem Stapel auf den anderen zu übertragen.
Behebung von Deadlocks bei Abhängigkeiten
Wenn Sie auf eine Ressource von einem Stapel in einem anderen Stapel verweisen, entsteht eine Abhängigkeit zwischen den beiden Stacks. Dadurch wird sichergestellt, dass sie in der richtigen Reihenfolge bereitgestellt werden. Nachdem die Stacks bereitgestellt wurden, ist diese Abhängigkeit konkret. Danach kann das Entfernen der Nutzung der gemeinsam genutzten Ressource aus dem verbrauchenden Stack zu einem unerwarteten Bereitstellungsfehler führen. Dies passiert, wenn zwischen den beiden Stacks eine weitere Abhängigkeit besteht, die eine Bereitstellung in derselben Reihenfolge erzwingt. Es kann auch ohne Abhängigkeit geschehen, wenn der produzierende Stack einfach vom CDK Toolkit so ausgewählt wird, dass er zuerst bereitgestellt wird. Der AWS CloudFormation Export wird aus dem produzierenden Stack entfernt, weil er nicht mehr benötigt wird. Die exportierte Ressource wird jedoch weiterhin im verbrauchenden Stack verwendet, da ihr Update noch nicht bereitgestellt wurde. Daher schlägt die Bereitstellung des Producer-Stacks fehl.
Um diesen Deadlock zu überwinden, entfernen Sie die Nutzung der gemeinsam genutzten Ressource aus dem verbrauchenden Stack. (Dadurch wird der automatische Export aus dem produzierenden Stack entfernt.) Als Nächstes fügen Sie denselben Export manuell zum Produktionsstapel hinzu und verwenden dabei genau dieselbe logische ID wie der automatisch generierte Export. Entfernen Sie die Nutzung der gemeinsam genutzten Ressource im verbrauchenden Stack und stellen Sie beide Stapel bereit. Entfernen Sie dann den manuellen Export (und die gemeinsam genutzte Ressource, falls sie nicht mehr benötigt wird) und stellen Sie beide Stapel erneut bereit. Die exportValue()
Methode des Stacks ist eine bequeme Möglichkeit, den manuellen Export für diesen Zweck zu erstellen. (Sehen Sie sich das Beispiel in der verlinkten Methodenreferenz an.)
Verweisen auf Ressourcen in Ihrem Konto AWS
Angenommen, Sie möchten eine Ressource, die bereits in Ihrem AWS Konto verfügbar ist, in Ihrer AWS CDK App verwenden. Dies kann eine Ressource sein, die über die Konsole, eine AWS SDK, direkt mit AWS CloudFormation oder in einer anderen AWS CDK
Anwendung definiert wurde. Sie können die Ressource ARN (oder ein anderes identifizierendes Attribut oder eine Gruppe von Attributen) in ein Proxy-Objekt umwandeln. Das Proxy-Objekt dient als Referenz auf die Ressource, indem es eine statische Factory-Methode für die Klasse der Ressource aufruft.
Wenn Sie einen solchen Proxy erstellen, wird die externe Ressource nicht Teil Ihrer AWS CDK App. Daher wirken sich Änderungen, die Sie am Proxy in Ihrer AWS CDK App vornehmen, nicht auf die bereitgestellte Ressource aus. Der Proxy kann jedoch an jede AWS CDK Methode übergeben werden, die eine Ressource dieses Typs benötigt.
Das folgende Beispiel zeigt, wie Sie auf einen Bucket verweisen, der auf einem vorhandenen Bucket mit dem ARN arn:aws:s3: ::amzn-s3-demo-bucket1 basiert, und auf eine Amazon Virtual Private Cloud, die auf einem vorhandenen Bucket mit einer bestimmten ID basiert. VPC
- TypeScript
-
// Construct a proxy for a bucket by its name (must be same account)
s3.Bucket.fromBucketName(this, 'amzn-s3-demo-bucket', 'amzn-s3-demo-bucket1');
// Construct a proxy for a bucket by its full ARN (can be another account)
s3.Bucket.fromBucketArn(this, 'amzn-s3-demo-bucket', 'arn:aws:s3:::amzn-s3-demo-bucket1');
// Construct a proxy for an existing VPC from its attribute(s)
ec2.Vpc.fromVpcAttributes(this, 'MyVpc', {
vpcId: 'vpc-1234567890abcde',
});
- JavaScript
-
// Construct a proxy for a bucket by its name (must be same account)
s3.Bucket.fromBucketName(this, 'amzn-s3-demo-bucket', 'amzn-s3-demo-bucket1');
// Construct a proxy for a bucket by its full ARN (can be another account)
s3.Bucket.fromBucketArn(this, 'amzn-s3-demo-bucket', 'arn:aws:s3:::amzn-s3-demo-bucket1');
// Construct a proxy for an existing VPC from its attribute(s)
ec2.Vpc.fromVpcAttributes(this, 'MyVpc', {
vpcId: 'vpc-1234567890abcde'
});
- Python
-
# Construct a proxy for a bucket by its name (must be same account)
s3.Bucket.from_bucket_name(self, "amzn-s3-demo-bucket", "amzn-s3-demo-bucket1")
# Construct a proxy for a bucket by its full ARN (can be another account)
s3.Bucket.from_bucket_arn(self, "amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket1")
# Construct a proxy for an existing VPC from its attribute(s)
ec2.Vpc.from_vpc_attributes(self, "MyVpc", vpc_id="vpc-1234567890abcdef")
- Java
-
// Construct a proxy for a bucket by its name (must be same account)
Bucket.fromBucketName(this, "amzn-s3-demo-bucket", "amzn-s3-demo-bucket1");
// Construct a proxy for a bucket by its full ARN (can be another account)
Bucket.fromBucketArn(this, "amzn-s3-demo-bucket",
"arn:aws:s3:::amzn-s3-demo-bucket1");
// Construct a proxy for an existing VPC from its attribute(s)
Vpc.fromVpcAttributes(this, "MyVpc", VpcAttributes.builder()
.vpcId("vpc-1234567890abcdef").build());
- C#
-
// Construct a proxy for a bucket by its name (must be same account)
Bucket.FromBucketName(this, "amzn-s3-demo-bucket", "amzn-s3-demo-bucket1");
// Construct a proxy for a bucket by its full ARN (can be another account)
Bucket.FromBucketArn(this, "amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket1");
// Construct a proxy for an existing VPC from its attribute(s)
Vpc.FromVpcAttributes(this, "MyVpc", new VpcAttributes
{
VpcId = "vpc-1234567890abcdef"
});
- Go
-
// Define a proxy for a bucket by its name (must be same account)
s3.Bucket_FromBucketName(stack, jsii.String("amzn-s3-demo-bucket"), jsii.String("amzn-s3-demo-bucket1"))
// Define a proxy for a bucket by its full ARN (can be another account)
s3.Bucket_FromBucketArn(stack, jsii.String("amzn-s3-demo-bucket"), jsii.String("arn:aws:s3:::amzn-s3-demo-bucket1"))
// Define a proxy for an existing VPC from its attributes
ec2.Vpc_FromVpcAttributes(stack, jsii.String("MyVpc"), &ec2.VpcAttributes{
VpcId: jsii.String("vpc-1234567890abcde"),
})
Schauen Vpc.fromLookup()
wir uns die Methode genauer an. Da das ec2.Vpc
Konstrukt komplex ist, gibt es viele Möglichkeiten, wie Sie es VPC für Ihre CDK App auswählen möchten. Um dies zu beheben, verfügt das VPC Konstrukt über eine fromLookup
statische Methode (Python:from_lookup
), mit der Sie das gewünschte Amazon suchen können, VPC indem Sie Ihr AWS Konto zur Synthesezeit abfragen.
Zur Verwendung muss das SystemVpc.fromLookup()
, das den Stack synthetisiert, Zugriff auf das Konto haben, dem Amazon VPC gehört. Dies liegt daran, dass das CDK Toolkit das Konto abfragt, um zum Zeitpunkt der Synthese das richtige Amazon VPC zu finden.
Außerdem Vpc.fromLookup()
funktioniert es nur in Stacks, die mit einem expliziten Konto und einer Region definiert sind (sieheUmgebungen für die AWS CDK). Wenn der AWS CDK versucht, einen Amazon VPC aus einem umgebungsunabhängigen Stack zu suchen, weiß das CDK Toolkit nicht, welche Umgebung abgefragt werden muss, um das zu finden. VPC
Sie müssen ausreichende Vpc.fromLookup()
Attribute angeben, um a in Ihrem Konto eindeutig zu identifizieren. VPC AWS
Beispielsweise kann es immer nur einen Standard gebenVPC, sodass es ausreichend ist, den VPC als Standard anzugeben.
- TypeScript
-
ec2.Vpc.fromLookup(this, 'DefaultVpc', {
isDefault: true
});
- JavaScript
-
ec2.Vpc.fromLookup(this, 'DefaultVpc', {
isDefault: true
});
- Python
-
ec2.Vpc.from_lookup(self, "DefaultVpc", is_default=True)
- Java
-
Vpc.fromLookup(this, "DefaultVpc", VpcLookupOptions.builder()
.isDefault(true).build());
- C#
-
Vpc.FromLookup(this, id = "DefaultVpc", new VpcLookupOptions { IsDefault = true });
- Go
-
ec2.Vpc_FromLookup(this, jsii.String("DefaultVpc"), &ec2.VpcLookupOptions{
IsDefault: jsii.Bool(true),
})
Sie können die tags
Eigenschaft auch verwenden, um nach VPCs einem Tag abzufragen. Sie können dem Amazon VPC zum Zeitpunkt seiner Erstellung Tags hinzufügen, indem Sie AWS CloudFormation oder die verwenden AWS CDK. Sie können Tags nach der Erstellung jederzeit bearbeiten, indem Sie die AWS Management Console AWS CLI, oder eine verwenden AWS SDK. Zusätzlich zu allen Tags, die Sie selbst hinzufügen, fügt der AWS CDK automatisch die folgenden Tags zu allen erstellten Tags VPCs hinzu.
-
Name — Der Name desVPC.
-
aws-cdk:subnet-name — Der Name des Subnetzes.
-
aws-cdk:subnet-type — Der Typ des Subnetzes: öffentlich, privat oder isoliert.
- TypeScript
-
ec2.Vpc.fromLookup(this, 'PublicVpc',
{tags: {'aws-cdk:subnet-type': "Public"}});
- JavaScript
-
ec2.Vpc.fromLookup(this, 'PublicVpc',
{tags: {'aws-cdk:subnet-type': "Public"}});
- Python
-
ec2.Vpc.from_lookup(self, "PublicVpc",
tags={"aws-cdk:subnet-type": "Public"})
- Java
-
Vpc.fromLookup(this, "PublicVpc", VpcLookupOptions.builder()
.tags(java.util.Map.of("aws-cdk:subnet-type", "Public")) // Java 9 or later
.build());
- C#
-
Vpc.FromLookup(this, id = "PublicVpc", new VpcLookupOptions
{ Tags = new Dictionary<string, string> { ["aws-cdk:subnet-type"] = "Public" });
- Go
-
ec2.Vpc_FromLookup(this, jsii.String("DefaultVpc"), &ec2.VpcLookupOptions{
Tags: &map[string]*string{"aws-cdk:subnet-type": jsii.String("Public")},
})
Die Ergebnisse von Vpc.fromLookup()
werden in der Projektdatei zwischengespeichert. cdk.context.json
(Siehe Kontextwerte und AWS CDK). Übergeben Sie diese Datei der Versionskontrolle, damit Ihre App weiterhin auf dasselbe Amazon verweistVPC. Das funktioniert auch dann, wenn Sie später Ihre VPCs Attribute so ändern, dass ein anderes ausgewählt VPC wird. Dies ist besonders wichtig, wenn Sie den Stack in einer Umgebung bereitstellen, die keinen Zugriff auf das AWS Konto hat, das das definiertVPC, z. B. CDKPipelines.
Sie können eine externe Ressource zwar überall verwenden, wo Sie eine ähnliche, in Ihrer AWS CDK App definierte Ressource verwenden würden, aber Sie können sie nicht ändern. Zum Beispiel bewirkt der Aufruf von addToResourcePolicy
(Python:add_to_resource_policy
) auf einem externen s3.Bucket
Gerät nichts.
Physische Namen der Ressourcen
Die logischen Namen der Ressourcen in AWS CloudFormation unterscheiden sich von den Namen der Ressourcen, die AWS Management Console
nach ihrer Bereitstellung von angezeigt werden AWS CloudFormation. Er AWS CDK nennt diese endgültigen Namen physische Namen.
AWS CloudFormation Könnte beispielsweise den Amazon S3 S3-Bucket mit der logischen ID Stack2amzn-s3-demo-bucket4DD88B4F
aus dem vorherigen Beispiel mit dem physischen Namen erstellenstack2amzn-s3-demo-bucket4dd88b4f-iuv1rbv9z3to
.
Sie können einen physischen Namen angeben, wenn Sie Konstrukte erstellen, die Ressourcen darstellen, indem Sie die Eigenschaft verwenden <resourceType>
Name. Im folgenden Beispiel wird ein Amazon S3 S3-Bucket mit dem physischen Namen erstelltamzn-s3-demo-bucket
.
- TypeScript
-
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', {
bucketName: 'amzn-s3-demo-bucket',
});
- JavaScript
-
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', {
bucketName: 'amzn-s3-demo-bucket'
});
- Python
-
bucket = s3.Bucket(self, "amzn-s3-demo-bucket", bucket_name="amzn-s3-demo-bucket")
- Java
-
Bucket bucket = Bucket.Builder.create(this, "amzn-s3-demo-bucket")
.bucketName("amzn-s3-demo-bucket").build();
- C#
-
var bucket = new Bucket(this, "amzn-s3-demo-bucket", new BucketProps { BucketName = "amzn-s3-demo-bucket" });
- Go
-
bucket := s3.NewBucket(this, jsii.String("amzn-s3-demo-bucket"), &s3.BucketProps{
BucketName: jsii.String("amzn-s3-demo-bucket"),
})
Die Zuweisung physischer Namen zu Ressourcen hat einige Nachteile in AWS CloudFormation. Am wichtigsten ist jedoch, dass alle Änderungen an bereitgestellten Ressourcen, die einen Austausch von Ressourcen erfordern, wie z. B. Änderungen an den Eigenschaften einer Ressource, die nach der Erstellung unveränderlich sind, fehlschlagen, wenn einer Ressource ein physischer Name zugewiesen wurde. Wenn Sie in diesem Zustand landen, besteht die einzige Lösung darin, den AWS CloudFormation Stack zu löschen und die AWS CDK App dann erneut bereitzustellen. Einzelheiten finden Sie in der AWS CloudFormation Dokumentation.
In einigen Fällen, z. B. beim Erstellen einer AWS CDK App mit umgebungsübergreifenden Verweisen, sind physische Namen erforderlich, AWS CDK damit sie ordnungsgemäß funktioniert. In diesen Fällen können Sie, wenn Sie sich nicht selbst die Mühe machen möchten, einen physischen Namen zu finden, den AWS CDK Namen für Sie selbst festlegen lassen. Verwenden Sie dazu den speziellen Wert PhysicalName.GENERATE_IF_NEEDED
wie folgt.
- TypeScript
-
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', {
bucketName: core.PhysicalName.GENERATE_IF_NEEDED,
});
- JavaScript
-
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', {
bucketName: core.PhysicalName.GENERATE_IF_NEEDED
});
- Python
-
bucket = s3.Bucket(self, "amzn-s3-demo-bucket",
bucket_name=core.PhysicalName.GENERATE_IF_NEEDED)
- Java
-
Bucket bucket = Bucket.Builder.create(this, "amzn-s3-demo-bucket")
.bucketName(PhysicalName.GENERATE_IF_NEEDED).build();
- C#
-
var bucket = new Bucket(this, "amzn-s3-demo-bucket", new BucketProps
{ BucketName = PhysicalName.GENERATE_IF_NEEDED });
- Go
-
bucket := s3.NewBucket(this, jsii.String("amzn-s3-demo-bucket"), &s3.BucketProps{
BucketName: awscdk.PhysicalName_GENERATE_IF_NEEDED(),
})
Übergeben von eindeutigen Ressourcen-Identifikatoren
Wann immer möglich, sollten Sie Ressourcen als Referenz übergeben, wie im vorherigen Abschnitt beschrieben. Es gibt jedoch Fälle, in denen Sie keine andere Wahl haben, als mit einem ihrer Attribute auf eine Ressource zu verweisen. Zu den beispielhaften Anwendungsfällen gehören die folgenden:
-
Wenn Sie AWS CloudFormation Ressourcen auf niedriger Ebene verwenden.
-
Wenn Sie Ressourcen für die Laufzeitkomponenten einer AWS CDK Anwendung verfügbar machen müssen, z. B. wenn Sie über Umgebungsvariablen auf Lambda-Funktionen verweisen.
Diese Bezeichner sind als Attribute für die Ressourcen verfügbar, wie z. B. die folgenden.
- TypeScript
-
bucket.bucketName
lambdaFunc.functionArn
securityGroup.groupArn
- JavaScript
-
bucket.bucketName
lambdaFunc.functionArn
securityGroup.groupArn
- Python
-
bucket.bucket_name
lambda_func.function_arn
security_group_arn
- Java
-
Die AWS CDK Java-Bindung verwendet Getter-Methoden für Attribute.
bucket.getBucketName()
lambdaFunc.getFunctionArn()
securityGroup.getGroupArn()
- C#
-
bucket.BucketName
lambdaFunc.FunctionArn
securityGroup.GroupArn
- Go
-
bucket.BucketName()
fn.FunctionArn()
Das folgende Beispiel zeigt, wie ein generierter Bucket-Name an eine AWS Lambda Funktion übergeben wird.
- TypeScript
-
const bucket = new s3.Bucket(this, 'Bucket');
new lambda.Function(this, 'MyLambda', {
// ...
environment: {
BUCKET_NAME: bucket.bucketName,
},
});
- JavaScript
-
const bucket = new s3.Bucket(this, 'Bucket');
new lambda.Function(this, 'MyLambda', {
// ...
environment: {
BUCKET_NAME: bucket.bucketName
}
});
- Python
-
bucket = s3.Bucket(self, "Bucket")
lambda.Function(self, "MyLambda", environment=dict(BUCKET_NAME=bucket.bucket_name))
- Java
-
final Bucket bucket = new Bucket(this, "Bucket");
Function.Builder.create(this, "MyLambda")
.environment(java.util.Map.of( // Java 9 or later
"BUCKET_NAME", bucket.getBucketName()))
.build();
- C#
-
var bucket = new Bucket(this, "Bucket");
new Function(this, "MyLambda", new FunctionProps
{
Environment = new Dictionary<string, string>
{
["BUCKET_NAME"] = bucket.BucketName
}
});
- Go
-
bucket := s3.NewBucket(this, jsii.String("Bucket"), &s3.BucketProps{})
lambda.NewFunction(this, jsii.String("MyLambda"), &lambda.FunctionProps{
Environment: &map[string]*string{"BUCKET_NAME": bucket.BucketName()},
})
Erteilen von Berechtigungen zwischen Ressourcen
Konstrukte auf höherer Ebene ermöglichen die Erzielung von Berechtigungen mit den geringsten Rechten, indem sie einfache, absichtsbasierte bis ausdrückliche Berechtigungsanforderungen anbieten. APIs Viele L2-Konstrukte bieten beispielsweise Erteilungsmethoden, mit denen Sie einer Entität (z. B. einer IAM Rolle oder einem Benutzer) die Erlaubnis erteilen können, mit der Ressource zu arbeiten, ohne manuell Berechtigungsanweisungen erstellen zu müssen. IAM
Im folgenden Beispiel werden die Berechtigungen erstellt, die es der Ausführungsrolle einer Lambda-Funktion ermöglichen, Objekte in einen bestimmten Amazon S3 S3-Bucket zu lesen und zu schreiben. Wenn der Amazon S3 S3-Bucket mit einem AWS KMS Schlüssel verschlüsselt ist, gewährt diese Methode auch der Ausführungsrolle der Lambda-Funktion die Erlaubnis, mit dem Schlüssel zu entschlüsseln.
- TypeScript
-
if (bucket.grantReadWrite(func).success) {
// ...
}
- JavaScript
-
if ( bucket.grantReadWrite(func).success) {
// ...
}
- Python
-
if bucket.grant_read_write(func).success:
# ...
- Java
-
if (bucket.grantReadWrite(func).getSuccess()) {
// ...
}
- C#
-
if (bucket.GrantReadWrite(func).Success)
{
// ...
}
- Go
-
if *bucket.GrantReadWrite(function, nil).Success() {
// ...
}
Die Grant-Methoden geben ein iam.Grant
Objekt zurück. Verwenden Sie das success
Attribut des Grant
Objekts, um festzustellen, ob der Zuschuss tatsächlich gewährt wurde (z. B. wurde er möglicherweise nicht auf externe Ressourcen angewendet). Sie können auch die Methode assertSuccess
(Python:assert_success
) des Grant
Objekts verwenden, um zu erzwingen, dass der Zuschuss erfolgreich beantragt wurde.
Wenn eine bestimmte Grant-Methode für den jeweiligen Anwendungsfall nicht verfügbar ist, können Sie eine generische Grant-Methode verwenden, um einen neuen Zuschuss mit einer bestimmten Liste von Aktionen zu definieren.
Das folgende Beispiel zeigt, wie einer Lambda-Funktion Zugriff auf die Amazon DynamoDB CreateBackup
DynamoDB-Aktion gewährt wird.
- TypeScript
-
table.grant(func, 'dynamodb:CreateBackup');
- JavaScript
-
table.grant(func, 'dynamodb:CreateBackup');
- Python
-
table.grant(func, "dynamodb:CreateBackup")
- Java
-
table.grant(func, "dynamodb:CreateBackup");
- C#
-
table.Grant(func, "dynamodb:CreateBackup");
- Go
-
table := dynamodb.NewTable(this, jsii.String("MyTable"), &dynamodb.TableProps{})
table.Grant(function, jsii.String("dynamodb:CreateBackup"))
Für viele Ressourcen, wie z. B. Lambda-Funktionen, muss bei der Ausführung von Code eine Rolle übernommen werden. Mit einer Konfigurationseigenschaft können Sie eine iam.IRole
angeben. Wenn keine Rolle angegeben ist, erstellt die Funktion automatisch eine Rolle speziell für diesen Zweck. Anschließend können Sie Grant-Methoden für die Ressourcen verwenden, um der Rolle Anweisungen hinzuzufügen.
Die Grant-Methoden basieren auf untergeordneten Ebenen APIs für den Umgang mit IAM Richtlinien. Richtlinien werden als Objekte modelliert. PolicyDocument Fügen Sie mithilfe der Methode (Python:) Anweisungen direkt zu Rollen (oder der angehängten Rolle eines Konstruktsadd_to_role_policy
) oder mit der addToRolePolicy
Methode (Python:) zur Bucket
Richtlinie einer Ressource addToResourcePolicy
(z. B. einer Richtlinieadd_to_resource_policy
) hinzu.
Metriken und Alarme für Ressourcen
Viele Ressourcen geben CloudWatch Metriken aus, mit denen Überwachungs-Dashboards und Alarme eingerichtet werden können. Konstrukte auf höherer Ebene verfügen über metrische Methoden, mit denen Sie auf die Metriken zugreifen können, ohne nach dem richtigen Namen suchen zu müssen.
Das folgende Beispiel zeigt, wie ein Alarm definiert wird, wenn ApproximateNumberOfMessagesNotVisible
der Wert einer SQS Amazon-Warteschlange 100 überschreitet.
- TypeScript
-
import * as cw from '@aws-cdk/aws-cloudwatch';
import * as sqs from '@aws-cdk/aws-sqs';
import { Duration } from '@aws-cdk/core';
const queue = new sqs.Queue(this, 'MyQueue');
const metric = queue.metricApproximateNumberOfMessagesNotVisible({
label: 'Messages Visible (Approx)',
period: Duration.minutes(5),
// ...
});
metric.createAlarm(this, 'TooManyMessagesAlarm', {
comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
threshold: 100,
// ...
});
- JavaScript
-
const cw = require('@aws-cdk/aws-cloudwatch');
const sqs = require('@aws-cdk/aws-sqs');
const { Duration } = require('@aws-cdk/core');
const queue = new sqs.Queue(this, 'MyQueue');
const metric = queue.metricApproximateNumberOfMessagesNotVisible({
label: 'Messages Visible (Approx)',
period: Duration.minutes(5)
// ...
});
metric.createAlarm(this, 'TooManyMessagesAlarm', {
comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
threshold: 100
// ...
});
- Python
-
import aws_cdk.aws_cloudwatch as cw
import aws_cdk.aws_sqs as sqs
from aws_cdk.core import Duration
queue = sqs.Queue(self, "MyQueue")
metric = queue.metric_approximate_number_of_messages_not_visible(
label="Messages Visible (Approx)",
period=Duration.minutes(5),
# ...
)
metric.create_alarm(self, "TooManyMessagesAlarm",
comparison_operator=cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
threshold=100,
# ...
)
- Java
-
import software.amazon.awscdk.core.Duration;
import software.amazon.awscdk.services.sqs.Queue;
import software.amazon.awscdk.services.cloudwatch.Metric;
import software.amazon.awscdk.services.cloudwatch.MetricOptions;
import software.amazon.awscdk.services.cloudwatch.CreateAlarmOptions;
import software.amazon.awscdk.services.cloudwatch.ComparisonOperator;
Queue queue = new Queue(this, "MyQueue");
Metric metric = queue
.metricApproximateNumberOfMessagesNotVisible(MetricOptions.builder()
.label("Messages Visible (Approx)")
.period(Duration.minutes(5)).build());
metric.createAlarm(this, "TooManyMessagesAlarm", CreateAlarmOptions.builder()
.comparisonOperator(ComparisonOperator.GREATER_THAN_THRESHOLD)
.threshold(100)
// ...
.build());
- C#
-
using cdk = Amazon.CDK;
using cw = Amazon.CDK.AWS.CloudWatch;
using sqs = Amazon.CDK.AWS.SQS;
var queue = new sqs.Queue(this, "MyQueue");
var metric = queue.MetricApproximateNumberOfMessagesNotVisible(new cw.MetricOptions
{
Label = "Messages Visible (Approx)",
Period = cdk.Duration.Minutes(5),
// ...
});
metric.CreateAlarm(this, "TooManyMessagesAlarm", new cw.CreateAlarmOptions
{
ComparisonOperator = cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
Threshold = 100,
// ..
});
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/jsii-runtime-go"
cw "github.com/aws/aws-cdk-go/awscdk/v2/awscloudwatch"
sqs "github.com/aws/aws-cdk-go/awscdk/v2/awssqs"
)
queue := sqs.NewQueue(this, jsii.String("MyQueue"), &sqs.QueueProps{})
metric := queue.MetricApproximateNumberOfMessagesNotVisible(&cw.MetricOptions{
Label: jsii.String("Messages Visible (Approx)"),
Period: awscdk.Duration_Minutes(jsii.Number(5)),
})
metric.CreateAlarm(this, jsii.String("TooManyMessagesAlarm"), &cw.CreateAlarmOptions{
ComparisonOperator: cw.ComparisonOperator_GREATER_THAN_THRESHOLD,
Threshold: jsii.Number(100),
})
Wenn es für eine bestimmte Metrik keine Methode gibt, können Sie die allgemeine Metrikmethode verwenden, um den Metriknamen manuell anzugeben.
Metriken können auch zu CloudWatch Dashboards hinzugefügt werden. Siehe CloudWatch.
Netzwerkdatenverkehr
In vielen Fällen müssen Sie Berechtigungen für ein Netzwerk aktivieren, damit eine Anwendung funktioniert, z. B. wenn die Recheninfrastruktur auf die Persistenzschicht zugreifen muss. Ressourcen, die Verbindungen herstellen oder darauf warten, stellen Methoden zur Verfügung, die den Datenfluss ermöglichen, einschließlich der Festlegung von Sicherheitsgruppenregeln oder NetzwerkenACLs.
IConnectableRessourcen verfügen über eine connections
Eigenschaft, bei der es sich um das Gateway zur Konfiguration der Regeln für den Netzwerkverkehr handelt.
Mithilfe von allow
Methoden ermöglichen Sie den Datenfluss auf einem bestimmten Netzwerkpfad. Das folgende Beispiel aktiviert HTTPS Verbindungen zum Internet und eingehende Verbindungen von der Amazon EC2 Auto Scaling Scaling-Gruppefleet2
.
- TypeScript
-
import * as asg from '@aws-cdk/aws-autoscaling';
import * as ec2 from '@aws-cdk/aws-ec2';
const fleet1: asg.AutoScalingGroup = asg.AutoScalingGroup(/*...*/);
// Allow surfing the (secure) web
fleet1.connections.allowTo(new ec2.Peer.anyIpv4(), new ec2.Port({ fromPort: 443, toPort: 443 }));
const fleet2: asg.AutoScalingGroup = asg.AutoScalingGroup(/*...*/);
fleet1.connections.allowFrom(fleet2, ec2.Port.AllTraffic());
- JavaScript
-
const asg = require('@aws-cdk/aws-autoscaling');
const ec2 = require('@aws-cdk/aws-ec2');
const fleet1 = asg.AutoScalingGroup();
// Allow surfing the (secure) web
fleet1.connections.allowTo(new ec2.Peer.anyIpv4(), new ec2.Port({ fromPort: 443, toPort: 443 }));
const fleet2 = asg.AutoScalingGroup();
fleet1.connections.allowFrom(fleet2, ec2.Port.AllTraffic());
- Python
-
import aws_cdk.aws_autoscaling as asg
import aws_cdk.aws_ec2 as ec2
fleet1 = asg.AutoScalingGroup( ... )
# Allow surfing the (secure) web
fleet1.connections.allow_to(ec2.Peer.any_ipv4(),
ec2.Port(PortProps(from_port=443, to_port=443)))
fleet2 = asg.AutoScalingGroup( ... )
fleet1.connections.allow_from(fleet2, ec2.Port.all_traffic())
- Java
-
import software.amazon.awscdk.services.autoscaling.AutoScalingGroup;
import software.amazon.awscdk.services.ec2.Peer;
import software.amazon.awscdk.services.ec2.Port;
AutoScalingGroup fleet1 = AutoScalingGroup.Builder.create(this, "MyFleet")
/* ... */.build();
// Allow surfing the (secure) Web
fleet1.getConnections().allowTo(Peer.anyIpv4(),
Port.Builder.create().fromPort(443).toPort(443).build());
AutoScalingGroup fleet2 = AutoScalingGroup.Builder.create(this, "MyFleet2")
/* ... */.build();
fleet1.getConnections().allowFrom(fleet2, Port.allTraffic());
- C#
-
using cdk = Amazon.CDK;
using asg = Amazon.CDK.AWS.AutoScaling;
using ec2 = Amazon.CDK.AWS.EC2;
// Allow surfing the (secure) Web
var fleet1 = new asg.AutoScalingGroup(this, "MyFleet", new asg.AutoScalingGroupProps { /* ... */ });
fleet1.Connections.AllowTo(ec2.Peer.AnyIpv4(), new ec2.Port(new ec2.PortProps
{ FromPort = 443, ToPort = 443 });
var fleet2 = new asg.AutoScalingGroup(this, "MyFleet2", new asg.AutoScalingGroupProps { /* ... */ });
fleet1.Connections.AllowFrom(fleet2, ec2.Port.AllTraffic());
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/jsii-runtime-go"
autoscaling "github.com/aws/aws-cdk-go/awscdk/v2/awsautoscaling"
ec2 "github.com/aws/aws-cdk-go/awscdk/v2/awsec2"
)
fleet1 := autoscaling.NewAutoScalingGroup(this, jsii.String("MyFleet1"), &autoscaling.AutoScalingGroupProps{})
fleet1.Connections().AllowTo(ec2.Peer_AnyIpv4(),ec2.NewPort(&ec2.PortProps{ FromPort: jsii.Number(443), ToPort: jsii.Number(443) }),jsii.String("secure web"))
fleet2 := autoscaling.NewAutoScalingGroup(this, jsii.String("MyFleet2"), &autoscaling.AutoScalingGroupProps{})
fleet1.Connections().AllowFrom(fleet2, ec2.Port_AllTraffic(),jsii.String("all traffic"))
Bestimmten Ressourcen sind Standardports zugeordnet. Beispiele hierfür sind der Listener eines Load Balancers auf dem öffentlichen Port und die Ports, auf denen die Datenbank-Engine Verbindungen für Instances einer RDS Amazon-Datenbank akzeptiert. In solchen Fällen können Sie eine strenge Netzwerkkontrolle erzwingen, ohne den Port manuell angeben zu müssen. Verwenden Sie dazu die allowToDefaultPort
Methoden allowDefaultPortFrom
und (Python:allow_default_port_from
,allow_to_default_port
).
Das folgende Beispiel zeigt, wie Verbindungen von einer beliebigen IPV4 Adresse und eine Verbindung von einer Auto Scaling Scaling-Gruppe aus für den Zugriff auf eine Datenbank aktiviert werden.
- TypeScript
-
listener.connections.allowDefaultPortFromAnyIpv4('Allow public access');
fleet.connections.allowToDefaultPort(rdsDatabase, 'Fleet can access database');
- JavaScript
-
listener.connections.allowDefaultPortFromAnyIpv4('Allow public access');
fleet.connections.allowToDefaultPort(rdsDatabase, 'Fleet can access database');
- Python
-
listener.connections.allow_default_port_from_any_ipv4("Allow public access")
fleet.connections.allow_to_default_port(rds_database, "Fleet can access database")
- Java
-
listener.getConnections().allowDefaultPortFromAnyIpv4("Allow public access");
fleet.getConnections().AllowToDefaultPort(rdsDatabase, "Fleet can access database");
- C#
-
listener.Connections.AllowDefaultPortFromAnyIpv4("Allow public access");
fleet.Connections.AllowToDefaultPort(rdsDatabase, "Fleet can access database");
- Go
-
listener.Connections().AllowDefaultPortFromAnyIpv4(jsii.String("Allow public Access"))
fleet.Connections().AllowToDefaultPort(rdsDatabase, jsii.String("Fleet can access database"))
Behandlung von Ereignissen
Einige Ressourcen können als Ereignisquellen dienen. Verwenden Sie die addEventNotification
Methode (Python:add_event_notification
), um ein Ereignisziel für einen bestimmten Ereignistyp zu registrieren, der von der Ressource ausgegeben wird. Darüber hinaus bieten addXxxNotification
Methoden eine einfache Möglichkeit, einen Handler für gängige Ereignistypen zu registrieren.
Das folgende Beispiel zeigt, wie eine Lambda-Funktion ausgelöst wird, wenn ein Objekt zu einem Amazon S3 S3-Bucket hinzugefügt wird.
- TypeScript
-
import * as s3nots from '@aws-cdk/aws-s3-notifications';
const handler = new lambda.Function(this, 'Handler', { /*…*/ });
const bucket = new s3.Bucket(this, 'Bucket');
bucket.addObjectCreatedNotification(new s3nots.LambdaDestination(handler));
- JavaScript
-
const s3nots = require('@aws-cdk/aws-s3-notifications');
const handler = new lambda.Function(this, 'Handler', { /*…*/ });
const bucket = new s3.Bucket(this, 'Bucket');
bucket.addObjectCreatedNotification(new s3nots.LambdaDestination(handler));
- Python
-
import aws_cdk.aws_s3_notifications as s3_nots
handler = lambda_.Function(self, "Handler", ...)
bucket = s3.Bucket(self, "Bucket")
bucket.add_object_created_notification(s3_nots.LambdaDestination(handler))
- Java
-
import software.amazon.awscdk.services.s3.Bucket;
import software.amazon.awscdk.services.lambda.Function;
import software.amazon.awscdk.services.s3.notifications.LambdaDestination;
Function handler = Function.Builder.create(this, "Handler")/* ... */.build();
Bucket bucket = new Bucket(this, "Bucket");
bucket.addObjectCreatedNotification(new LambdaDestination(handler));
- C#
-
using lambda = Amazon.CDK.AWS.Lambda;
using s3 = Amazon.CDK.AWS.S3;
using s3Nots = Amazon.CDK.AWS.S3.Notifications;
var handler = new lambda.Function(this, "Handler", new lambda.FunctionProps { .. });
var bucket = new s3.Bucket(this, "Bucket");
bucket.AddObjectCreatedNotification(new s3Nots.LambdaDestination(handler));
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/jsii-runtime-go"
s3 "github.com/aws/aws-cdk-go/awscdk/v2/awss3"
s3nots "github.com/aws/aws-cdk-go/awscdk/v2/awss3notifications"
)
handler := lambda.NewFunction(this, jsii.String("MyFunction"), &lambda.FunctionProps{})
bucket := s3.NewBucket(this, jsii.String("Bucket"), &s3.BucketProps{})
bucket.AddObjectCreatedNotification(s3nots.NewLambdaDestination(handler), nil)
Richtlinien zur Entfernung
Für Ressourcen, die persistente Daten verwalten, wie Datenbanken, Amazon S3 S3-Buckets und ECR Amazon-Registries, gilt eine Entfernungsrichtlinie. Die Entfernungsrichtlinie gibt an, ob persistente Objekte gelöscht werden sollen, wenn der AWS CDK
Stapel, der sie enthält, zerstört wird. Die Werte, die die Entfernungsrichtlinie angeben, sind über die RemovalPolicy
Aufzählung im AWS CDK core
Modul verfügbar.
Neben Ressourcen, die Daten dauerhaft speichern, können auch Ressourcen eine habenremovalPolicy
, die für einen anderen Zweck verwendet wird. Beispielsweise verwendet eine Lambda-Funktionsversion ein removalPolicy
Attribut, um zu bestimmen, ob eine bestimmte Version beibehalten wird, wenn eine neue Version bereitgestellt wird. Diese haben im Vergleich zu den Entfernungsrichtlinien für einen Amazon S3 S3-Bucket oder eine DynamoDB-Tabelle unterschiedliche Bedeutungen und Standardeinstellungen.
Wert |
Bedeutung |
RemovalPolicy.RETAIN
|
Behält den Inhalt der Ressource bei, wenn der Stapel zerstört wird (Standard). Die Ressource ist aus dem Stapel verwaist und muss manuell gelöscht werden. Wenn Sie versuchen, den Stack erneut bereitzustellen, während die Ressource noch vorhanden ist, erhalten Sie aufgrund eines Namenskonflikts eine Fehlermeldung.
|
RemovalPolicy.DESTROY
|
Die Ressource wird zusammen mit dem Stapel zerstört.
|
AWS CloudFormation entfernt keine Amazon S3 S3-Buckets, die Dateien enthalten, auch wenn ihre Entfernungsrichtlinie auf DESTROY
eingestellt ist. Der Versuch, dies zu tun, ist ein AWS CloudFormation Fehler. Damit alle Dateien aus dem Bucket AWS CDK gelöscht werden, bevor er zerstört wird, setzen Sie die autoDeleteObjects
Eigenschaft des Buckets auftrue
.
Im Folgenden finden Sie ein Beispiel für die Erstellung eines Amazon S3 S3-Buckets mit RemovalPolicy
der Einstellung of DESTROY
und der autoDeleteOjbects
Einstellung auftrue
.
- TypeScript
-
import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';
export class CdkTestStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const bucket = new s3.Bucket(this, 'Bucket', {
removalPolicy: cdk.RemovalPolicy.DESTROY,
autoDeleteObjects: true
});
}
}
- JavaScript
-
const cdk = require('@aws-cdk/core');
const s3 = require('@aws-cdk/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,
autoDeleteObjects: true
});
}
}
module.exports = { CdkTestStack }
- Python
-
import aws_cdk.core as cdk
import aws_cdk.aws_s3 as s3
class CdkTestStack(cdk.stack):
def __init__(self, scope: cdk.Construct, id: str, **kwargs):
super().__init__(scope, id, **kwargs)
bucket = s3.Bucket(self, "Bucket",
removal_policy=cdk.RemovalPolicy.DESTROY,
auto_delete_objects=True)
- Java
-
software.amazon.awscdk.core.*;
import software.amazon.awscdk.services.s3.*;
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)
.autoDeleteObjects(true).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,
AutoDeleteObjects = true
});
}
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/jsii-runtime-go"
s3 "github.com/aws/aws-cdk-go/awscdk/v2/awss3"
)
s3.NewBucket(this, jsii.String("Bucket"), &s3.BucketProps{
RemovalPolicy: awscdk.RemovalPolicy_DESTROY,
AutoDeleteObjects: jsii.Bool(true),
})
Mithilfe der applyRemovalPolicy()
Methode können Sie eine Entfernungsrichtlinie auch direkt auf die zugrunde liegende AWS CloudFormation Ressource anwenden. Diese Methode ist für einige statusbehaftete Ressourcen verfügbar, die keine removalPolicy
Eigenschaft in den Requisiten ihrer L2-Ressource haben. Beispiele sind unter anderem:
-
AWS CloudFormation stapelt
-
Amazon-Cognito-Benutzerpools
-
Amazon DocumentDB DocumentDB-Datenbank-Instances
-
EC2Amazon-Volumen
-
Amazon OpenSearch Service-Domänen
-
FSxAmazon-Dateisysteme
-
SQSAmazon-Warteschlangen
- TypeScript
-
const resource = bucket.node.findChild('Resource') as cdk.CfnResource;
resource.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
- JavaScript
-
const resource = bucket.node.findChild('Resource');
resource.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
- Python
-
resource = bucket.node.find_child('Resource')
resource.apply_removal_policy(cdk.RemovalPolicy.DESTROY);
- Java
-
CfnResource resource = (CfnResource)bucket.node.findChild("Resource");
resource.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
- C#
-
var resource = (CfnResource)bucket.node.findChild('Resource');
resource.ApplyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
Das „ AWS CDK s“ RemovalPolicy
heißt übersetzt „s“. AWS CloudFormationDeletionPolicy
Die Standardeinstellung besteht jedoch AWS CDK darin, die Daten beizubehalten, was das Gegenteil der AWS CloudFormation Standardeinstellung ist.