Dies ist das AWS CDK v2 Developer Guide. Für das ältere CDK v1 wurde am 1. Juni 2022 die Wartung abgeschlossen und der Support endete am 1. Juni 2023.
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 von AWS Diensten in Ihren Anwendungen konfigurieren. Ressourcen sind eine Funktion von AWS CloudFormation. Indem Sie Ressourcen und ihre Eigenschaften in einer AWS CloudFormation Vorlage konfigurieren, können Sie sie für AWS CloudFormation die Bereitstellung Ihrer Ressourcen bereitstellen. 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 AWS CloudFormation zur Bereitstellung Ihrer Ressourcen bereitstellen.
Wie in AWS CDK-Konstrukten beschrieben, bietet das AWS CDK eine umfangreiche Klassenbibliothek von Konstrukten, sogenannten Konstrukten, die alle Ressourcen repräsentieren. AWS
Um eine Instanz einer Ressource mithilfe des entsprechenden Konstrukts 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 mithilfe des Konstrukts aus der sqs.Queue Construct Library eine Amazon SQS-Warteschlange mit AWS KMS-Verschlüsselung. AWS
Beispiel
- 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 durch 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 die URL einer Amazon SQS-Warteschlange mithilfe der Eigenschaft queueUrl (Python:queue_url) abgerufen wird.
Beispiel
- 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
Unter Tokens and the AWS CDK finden Sie Informationen darüber, wie das AWS CDK Attribute zur Bereitstellungszeit als Zeichenfolgen codiert.
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 (Amazon ECS) -Ressource benötigt einen Verweis auf den Cluster, auf dem sie ausgeführt wird.
-
Eine CloudFront Amazon-Distribution erfordert einen Verweis auf den Amazon Simple Storage Service (Amazon S3) -Bucket, 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 entweder im selben Stack oder in einem anderen übergeben
-
Indem Sie ein Proxyobjekt übergeben, das auf eine in Ihrem AWS Konto definierte Ressource verweist und aus einer eindeutigen Kennung der Ressource (z. B. einem ARN) erstellt wurde
Wenn die Eigenschaft eines Konstrukts ein Konstrukt für eine andere Ressource darstellt, entspricht ihr Typ dem Schnittstellentyp des Konstrukts. Das Amazon ECS-Konstrukt nimmt beispielsweise eine Eigenschaft vom Typ cluster anecs.ICluster. Ein anderes Beispiel ist das CloudFront Distributionskonstrukt, das eine Eigenschaft sourceBucket (Python:source_bucket) des Typs 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 Amazon ECS-Cluster und verwendet ihn dann, um einen Amazon ECS-Service zu definieren.
Beispiel
- 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,
})
Referenzierung von Ressourcen in einem anderen Stack
Sie können auf Ressourcen in einem anderen Stack verweisen, sofern sie in derselben App definiert sind. Die Stacks können sich in derselben oder in unterschiedlichen AWS Umgebungen (Konten und Regionen) 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 Stapel 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 verwendet. Der konsumierende Stack übergibt sie dann als Eigenschaft an jedes Konstrukt, das sie benötigt.
Das folgende Beispiel definiert einen Stapelstack1. Dieser Stack definiert einen Amazon 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. stack2könnte zum Beispiel eine AWS Glue Table definieren, die den Bucket zur Datenspeicherung verwendet.
Beispiel
- 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 das AWS CDK feststellt, dass sich die Ressource in derselben Umgebung, aber in einem anderen Stapel befindet, synthetisiert es automatisch AWS CloudFormation Exporte im produzierenden Stack und im verbrauchenden Stack, um diese Informationen von einem Stack auf den anderen zu übertragen. Fn::ImportValue Dies ist eine starke Referenz — das Standardverhalten. Sie können die Stärke von stapelübergreifenden Verweisen steuern, um Deadlocks bei Abhängigkeiten zu vermeiden.
Referenzstärke
Jede stapelübergreifende Referenz hat eine Stärke, die den verwendeten CloudFormation Mechanismus und die Kopplung zwischen den Stacks bestimmt:
- Stark (Standardeinstellung)
-
Der produzierende Stapel erstellt einen CloudFormation Export und der verbrauchende Stack verwendet ihnFn::ImportValue. Das bedeutet, dass der produzierende Stack nicht aktualisiert werden kann, um den Export zu entfernen, solange ein Verbraucher ihn noch importiert. CloudFormation erzwingt diese Einschränkung.
- Schwach
-
Der verbrauchende Stack verwendet Fn::GetStackOutput es, um Ausgaben direkt vom produzierenden Stack zu lesen. Es wird keine Exportkopplung erstellt; jeder Stack kann unabhängig voneinander aktualisiert oder gelöscht werden.
- Beides
-
Ein Übergangsstaat für die Migration von stark zu schwach. Der produzierende Stack behält seinen Export bei (damit die bestehenden starken Verbraucher nicht kaputt gehen), während der konsumierende Stack dazu Fn::GetStackOutput wechselt.
Der Stillstand der Abhängigkeit (tödliche Umarmung)
Starke Verweise können zu einem Deadlock führen, der Stack-Updates verhindert. Das passiert, weil ein Export CloudFormation nicht entfernt werden kann, während ein anderer Stack ihn noch importiert — und der verbrauchende Stack kann nicht so aktualisiert werden, dass der Import beendet wird, bis der Export bereits existiert. Möglicherweise wird eine Fehlermeldung wie die folgende angezeigt:
Export Stack1:ExportsOutputFnGetAtt-****** cannot be deleted as it is in use by Stack2
Dies tritt häufig auf, wenn Sie versuchen, eine gemeinsam genutzte Ressource zu entfernen oder Ihre Stapel umzustrukturieren. Schwache Referenzen vermeiden dieses Problem vollständig, da sie keine Exporte erstellen.
Steuerung der Referenzstärke
Sie können die Referenzstärke in drei Bereichen steuern: App-weit, pro Ressource oder pro Nutzung.
App-wide Standard
Geben Sie den folgenden Kontextschlüssel eincdk.json, um den Standard für alle stapelübergreifenden Referenzen in der App zu ändern:
{
"context": {
"@aws-cdk/core:defaultCrossStackReferences": "weak"
}
}
Per-resource
Überschreiben Sie die Stärke für alle Referenzen, die auf eine bestimmte Ressource verweisen, indem SieCrossStackReferences.of(resource).produce(strength):
Beispiel
- TypeScript
-
declare const bucket: s3.Bucket;
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK);
- JavaScript
-
const { CrossStackReferences, ReferenceStrength } = require('aws-cdk-lib');
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK);
- Python
-
from aws_cdk import CrossStackReferences, ReferenceStrength
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK)
- Java
-
import software.amazon.awscdk.CrossStackReferences;
import software.amazon.awscdk.ReferenceStrength;
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK);
- C#
-
using Amazon.CDK;
CrossStackReferences.Of(bucket).Produce(ReferenceStrength.WEAK);
- Go
-
import "github.com/aws/aws-cdk-go/awscdk/v2"
awscdk.CrossStackReferences_Of(bucket).Produce(awscdk.ReferenceStrength_WEAK)
Alle Verweise auf bucket andere Stapel werden jetzt Fn::GetStackOutput unabhängig von der App-weiten Standardeinstellung verwendet.
Per-usage
Überschreibt die Stärke einer einzelnen Referenz zum Zeitpunkt des Verbrauchs mit: Stack.consumeReference()
Beispiel
- TypeScript
-
declare const topic: sns.Topic;
const consumer = new Stack(app, 'Consumer', {
env: { account: '123456789012', region: 'us-east-1' },
});
new sns.Subscription(consumer, 'Subscription', {
topic: sns.Topic.fromTopicArn(consumer, 'Topic',
Stack.consumeReference(topic.topicArn, ReferenceStrength.WEAK)),
endpoint: 'https://example.com/webhook',
protocol: sns.SubscriptionProtocol.HTTPS,
});
- JavaScript
-
const { Stack, ReferenceStrength } = require('aws-cdk-lib');
const sns = require('aws-cdk-lib/aws-sns');
const subscriptions = require('aws-cdk-lib/aws-sns-subscriptions');
const consumer = new Stack(app, 'Consumer', {
env: { account: '123456789012', region: 'us-east-1' },
});
new sns.Subscription(consumer, 'Subscription', {
topic: sns.Topic.fromTopicArn(consumer, 'Topic',
Stack.consumeReference(topic.topicArn, ReferenceStrength.WEAK)),
endpoint: 'https://example.com/webhook',
protocol: sns.SubscriptionProtocol.HTTPS,
});
- Python
-
from aws_cdk import Stack, ReferenceStrength
import aws_cdk.aws_sns as sns
consumer = Stack(app, "Consumer",
env=core.Environment(account="123456789012", region="us-east-1")
)
sns.Subscription(consumer, "Subscription",
topic=sns.Topic.from_topic_arn(consumer, "Topic",
Stack.consume_reference(topic.topic_arn, ReferenceStrength.WEAK)),
endpoint="https://example.com/webhook",
protocol=sns.SubscriptionProtocol.HTTPS
)
- Java
-
import software.amazon.awscdk.Stack;
import software.amazon.awscdk.ReferenceStrength;
import software.amazon.awscdk.services.sns.*;
Stack consumer = new Stack(app, "Consumer", StackProps.builder()
.env(Environment.builder().account("123456789012").region("us-east-1").build())
.build());
Subscription.Builder.create(consumer, "Subscription")
.topic(Topic.fromTopicArn(consumer, "Topic",
Stack.consumeReference(topic.getTopicArn(), ReferenceStrength.WEAK)))
.endpoint("https://example.com/webhook")
.protocol(SubscriptionProtocol.HTTPS)
.build();
- C#
-
using Amazon.CDK;
using Amazon.CDK.AWS.SNS;
var consumer = new Stack(app, "Consumer", new StackProps
{
Env = new Amazon.CDK.Environment { Account = "123456789012", Region = "us-east-1" }
});
new Subscription(consumer, "Subscription", new SubscriptionProps
{
Topic = Topic.FromTopicArn(consumer, "Topic",
Stack.ConsumeReference(topic.TopicArn, ReferenceStrength.WEAK)),
Endpoint = "https://example.com/webhook",
Protocol = SubscriptionProtocol.HTTPS
});
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/aws-cdk-go/awscdk/v2/awssns"
"github.com/aws/jsii-runtime-go"
)
consumer := awscdk.NewStack(app, jsii.String("Consumer"), &awscdk.StackProps{
Env: &awscdk.Environment{Account: jsii.String("123456789012"), Region: jsii.String("us-east-1")},
})
awssns.NewSubscription(consumer, jsii.String("Subscription"), &awssns.SubscriptionProps{
Topic: awssns.Topic_FromTopicArn(consumer, jsii.String("Topic"),
awscdk.Stack_ConsumeReference(topic.TopicArn(), awscdk.ReferenceStrength_WEAK)),
Endpoint: jsii.String("https://example.com/webhook"),
Protocol: awssns.SubscriptionProtocol_HTTPS,
})
Wird Stack.consumeListReference() für Verweise auf Zeichenkettenlisten verwendet.
Bereichsbezogene Überschreibung
Sie können die Referenzstärke für einen Teilbaum von Konstrukten auch mithilfe von. CrossStackReferences.of(scope).consume(strength) Für alle innerhalb dieses Bereichs verwendeten stapelübergreifenden Referenzen wird die angegebene Stärke verwendet.
Migration von starken zu schwachen Referenzen
Wenn Sie bereits Stacks mit starken Referenzen bereitgestellt haben, können Sie nicht direkt zu schwachen Referenzen wechseln. Dies CloudFormation würde fehlschlagen, da der Export noch verwendet wird. Verwenden Sie stattdessen eine zweiphasige Migration durch den BOTH Übergangszustand.
Welche API Sie verwenden sollten, hängt von Ihrem Ziel ab:
-
Eine einzelne Referenz entfernen (aber beide Stapel und die Ressource beibehalten) — verwenden Sie, um nur diese Stack.consumeReference() bestimmte Verwendung zu schwächen.
-
Entfernung oder Umstrukturierung der produzierenden Ressource — Mit dieser Option werden alle ReferenzenCrossStackReferences.of(producer).produce(), die auf diese Ressource verweisen, gleichzeitig geschwächt.
Beide Ansätze folgen demselben zweiphasigen Muster, das unten beschrieben wird. Die Beispiele zeigen den ressourcenspezifischen Ansatz. Schließen Sie den Verweis pro Nutzung Stack.consumeReference(ref, ReferenceStrength.BOTH) in Phase 1 und Stack.consumeReference(ref, ReferenceStrength.WEAK) Phase 2 ein.
Phase 1: Mit BEIDEN bereitstellen
Schalten Sie die Referenzstärke aufBOTH. Dadurch beginnt der Stack, der die Daten verbrauchtFn::GetStackOutput, der Export bleibt jedoch im produzierenden Stack, sodass der Übergang sicher ist:
Beispiel
- TypeScript
-
declare const bucket: s3.Bucket;
CrossStackReferences.of(bucket).produce(ReferenceStrength.BOTH);
- JavaScript
-
const { CrossStackReferences, ReferenceStrength } = require('aws-cdk-lib');
CrossStackReferences.of(bucket).produce(ReferenceStrength.BOTH);
- Python
-
from aws_cdk import CrossStackReferences, ReferenceStrength
CrossStackReferences.of(bucket).produce(ReferenceStrength.BOTH)
- Java
-
import software.amazon.awscdk.CrossStackReferences;
import software.amazon.awscdk.ReferenceStrength;
CrossStackReferences.of(bucket).produce(ReferenceStrength.BOTH);
- C#
-
using Amazon.CDK;
CrossStackReferences.Of(bucket).Produce(ReferenceStrength.BOTH);
- Go
-
import "github.com/aws/aws-cdk-go/awscdk/v2"
awscdk.CrossStackReferences_Of(bucket).Produce(awscdk.ReferenceStrength_BOTH)
Stellen Sie beide Stapel bereit.
Phase 2: Mit WEAK bereitstellen
Da der Export nun nicht mehr vom Verbraucher verwendet wirdFn::ImportValue, kann er problemlos entfernt werden. Wechseln Sie zuWEAK:
Beispiel
- TypeScript
-
declare const bucket: s3.Bucket;
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK);
- JavaScript
-
const { CrossStackReferences, ReferenceStrength } = require('aws-cdk-lib');
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK);
- Python
-
from aws_cdk import CrossStackReferences, ReferenceStrength
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK)
- Java
-
import software.amazon.awscdk.CrossStackReferences;
import software.amazon.awscdk.ReferenceStrength;
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK);
- C#
-
using Amazon.CDK;
CrossStackReferences.Of(bucket).Produce(ReferenceStrength.WEAK);
- Go
-
import "github.com/aws/aws-cdk-go/awscdk/v2"
awscdk.CrossStackReferences_Of(bucket).Produce(awscdk.ReferenceStrength_WEAK)
Stellen Sie beide Stacks bereit. Der Export wurde entfernt und die Referenz ist jetzt völlig schwach.
Nach dieser Migration können Sie die Ressource nach Belieben entfernen, verschieben oder umstrukturieren, ohne sich dabei tödlich umarmen zu müssen.
Manuelle Problemumgehung (veraltet)
Wenn Sie die Steuerung der Referenzstärke noch nicht verwenden, können Sie den Deadlock manuell umgehen. Entfernen Sie die Nutzung der gemeinsam genutzten Ressource aus dem verbrauchenden Stack. Fügen Sie dann manuell denselben Export zum produzierenden Stapel hinzu und verwenden Sie dabei genau dieselbe logische ID wie beim automatisch generierten Export. Stellen Sie beide Stapel bereit, um den zu entfernen. Fn::ImportValue 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.
Referenzieren von Ressourcen in Ihrem AWS Konto
Angenommen, Sie möchten eine Ressource verwenden, die bereits in Ihrem AWS Konto in Ihrer AWS CDK-App verfügbar ist. Dies kann eine Ressource sein, die über die Konsole, ein AWS SDK, direkt mit AWS CloudFormation oder in einer anderen AWS CDK-Anwendung definiert wurde. Sie können den ARN der Ressource (oder ein anderes identifizierendes Attribut oder eine Gruppe von Attributen) in ein Proxyobjekt 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 ein Bucket auf der Grundlage eines vorhandenen Buckets mit dem ARN und auf eine Amazon Virtual Private Cloudarn:aws:s3:::amzn-s3-demo-bucket1, die auf einer vorhandenen VPC mit einer bestimmten ID basiert, referenziert wird.
Beispiel
- TypeScript
-
// Construct a proxy for a bucket by its name (must be same account)
s3.Bucket.fromBucketName(this, 'MyBucket', 'amzn-s3-demo-bucket1');
// Construct a proxy for a bucket by its full ARN (can be another account)
s3.Bucket.fromBucketArn(this, 'MyBucket', '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, 'MyBucket', 'amzn-s3-demo-bucket1');
// Construct a proxy for a bucket by its full ARN (can be another account)
s3.Bucket.fromBucketArn(this, 'MyBucket', '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, "MyBucket", "amzn-s3-demo-bucket1")
# Construct a proxy for a bucket by its full ARN (can be another account)
s3.Bucket.from_bucket_arn(self, "MyBucket", "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, "MyBucket", "amzn-s3-demo-bucket1");
// Construct a proxy for a bucket by its full ARN (can be another account)
Bucket.fromBucketArn(this, "MyBucket",
"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, "MyBucket", "amzn-s3-demo-bucket1");
// Construct a proxy for a bucket by its full ARN (can be another account)
Bucket.FromBucketArn(this, "MyBucket", "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("MyBucket"), 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("MyBucket"), 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 wir uns die Vpc.fromLookup() Methode genauer an. Da das ec2.Vpc Konstrukt komplex ist, gibt es viele Möglichkeiten, die VPC auszuwählen, die mit Ihrer CDK-App verwendet werden soll. Um dies zu beheben, verfügt das VPC-Konstrukt über eine fromLookup statische Methode (Python:from_lookup), mit der Sie die gewünschte Amazon-VPC nachschlagen können, indem Sie Ihr AWS Konto bei der Synthese abfragen.
Um es verwenden zu könnenVpc.fromLookup(), muss das System, das den Stack synthetisiert, Zugriff auf das Konto haben, dem die Amazon VPC gehört. Das liegt daran, dass das CDK Toolkit das Konto abfragt, um zum Zeitpunkt der Synthese die richtige Amazon-VPC zu finden.
Außerdem Vpc.fromLookup() funktioniert es nur in Stacks, die mit einem expliziten Konto und einer Region definiert sind (siehe Umgebungen für das CDK). AWS Wenn das AWS CDK versucht, eine Amazon-VPC von einem umgebungsunabhängigen Stack aus zu suchen, weiß das CDK Toolkit nicht, welche Umgebung abgefragt werden muss, um die VPC zu finden.
Sie müssen Vpc.fromLookup() Attribute angeben, die ausreichen, um eine VPC in Ihrem Konto eindeutig zu identifizieren. AWS Beispielsweise kann es immer nur eine Standard-VPC geben, daher reicht es aus, die VPC als Standard-VPC anzugeben.
Beispiel
- 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 VPCs nach Tags abzufragen. Sie können der Amazon-VPC zum Zeitpunkt ihrer Erstellung Tags hinzufügen, indem Sie AWS CloudFormation oder das AWS CDK verwenden. Sie können Tags jederzeit nach der Erstellung mithilfe der AWS Management Console, der AWS CLI oder eines AWS SDK bearbeiten. Zusätzlich zu allen Tags, die Sie selbst hinzufügen, fügt das AWS CDK automatisch die folgenden Tags zu allen VPCs hinzu, die es erstellt.
-
Name — Der Name der VPC.
-
aws-cdk:subnet-name — Der Name des Subnetzes.
-
aws-cdk:subnet-type — Der Typ des Subnetzes: Öffentlich, Privat oder Isoliert.
Beispiel
- 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 dieselbe Amazon VPC verweist. Dies funktioniert auch dann, wenn Sie später die Attribute Ihrer VPCs so ändern, dass eine andere VPC ausgewählt wird. Dies ist besonders wichtig, wenn Sie den Stack in einer Umgebung bereitstellen, die keinen Zugriff auf das AWS Konto hat, das die VPC definiert, wie z. B. CDK-Pipelines.
Sie können eine externe Ressource zwar überall dort verwenden, wo Sie eine ähnliche Ressource verwenden würden, die in Ihrer AWS CDK-App definiert ist, aber Sie können sie nicht ändern. Zum Beispiel bewirkt das Aufrufen von addToResourcePolicy (Python:add_to_resource_policy) auf einer externen Seite s3.Bucket nichts.
Physikalische Namen der Ressource
Die logischen Namen der Ressourcen in AWS CloudFormation unterscheiden sich von den Namen der Ressourcen, die in der AWS Managementkonsole angezeigt werden, nachdem sie bereitgestellt wurden AWS CloudFormation. Das AWS CDK nennt diese endgültigen Namen physische Namen.
AWS CloudFormation Könnte beispielsweise den Amazon S3-Bucket mit der logischen ID Stack2MyBucket4DD88B4F und dem physischen Namen stack2MyBucket4dd88b4f-iuv1rbv9z3to erstellen.
Sie können einen physischen Namen angeben, wenn Sie Konstrukte erstellen, die Ressourcen darstellen, indem Sie die Eigenschaft <resourceType>Name verwenden. Im folgenden Beispiel wird ein Amazon S3-Bucket mit dem physischen Namen amzn-s3-demo-bucket erstellt.
Beispiel
- TypeScript
-
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: 'amzn-s3-demo-bucket',
});
- JavaScript
-
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: 'amzn-s3-demo-bucket'
});
- Python
-
bucket = s3.Bucket(self, "MyBucket", bucket_name="amzn-s3-demo-bucket")
- Java
-
Bucket bucket = Bucket.Builder.create(this, "MyBucket")
.bucketName("amzn-s3-demo-bucket").build();
- C#
-
var bucket = new Bucket(this, "MyBucket", new BucketProps { BucketName = "amzn-s3-demo-bucket" });
- Go
-
bucket := s3.NewBucket(this, jsii.String("MyBucket"), &s3.BucketProps{
BucketName: jsii.String("amzn-s3-demo-bucket"),
})
Das Zuweisen physischer Namen zu Ressourcen hat einige Nachteile in AWS CloudFormation. Am wichtigsten ist, dass alle Änderungen an bereitgestellten Ressourcen, die einen Ressourcenaustausch 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 enden, 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 Referenzen, sind physische Namen erforderlich, damit das AWS CDK ordnungsgemäß funktioniert. Wenn Sie sich in diesen Fällen nicht selbst einen physischen Namen ausdenken möchten, können Sie ihn vom AWS CDK für Sie benennen lassen. Verwenden Sie dazu den speziellen Wert PhysicalName.GENERATE_IF_NEEDED wie folgt.
Beispiel
- TypeScript
-
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: core.PhysicalName.GENERATE_IF_NEEDED,
});
- JavaScript
-
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: core.PhysicalName.GENERATE_IF_NEEDED
});
- Python
-
bucket = s3.Bucket(self, "MyBucket",
bucket_name=core.PhysicalName.GENERATE_IF_NEEDED)
- Java
-
Bucket bucket = Bucket.Builder.create(this, "MyBucket")
.bucketName(PhysicalName.GENERATE_IF_NEEDED).build();
- C#
-
var bucket = new Bucket(this, "MyBucket", new BucketProps
{ BucketName = PhysicalName.GENERATE_IF_NEEDED });
- Go
-
bucket := s3.NewBucket(this, jsii.String("MyBucket"), &s3.BucketProps{
BucketName: awscdk.PhysicalName_GENERATE_IF_NEEDED(),
})
Übergabe eindeutiger Ressourcenbezeichner
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 auf eine Ressource anhand eines ihrer Attribute zu verweisen. Zu den Beispielanwendungsfä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 Identifikatoren sind als Attribute für die Ressourcen verfügbar, z. B. die folgenden.
Beispiel
- 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 Java-CDK-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-Namen an eine AWS Lambda-Funktion übergeben wird.
Beispiel
- 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
Higher-level Konstrukte ermöglichen das Erreichen von Berechtigungen mit den geringsten Rechten, indem sie einfache, absichtsbasierte APIs zum Ausdrücken von Berechtigungsanforderungen anbieten. Viele Konstrukte bieten beispielsweise Erteilungsmethoden, mit denen Sie einer Entität (z. B. einer IAM-Rolle oder einem Benutzer) die Berechtigung zum Arbeiten mit der Ressource erteilen können, ohne dass IAM-Berechtigungsanweisungen manuell erstellt werden müssen.
Grant-Methoden sind über Grants-Klassen verfügbar (z. B. BucketGrants für Amazon S3-Buckets). Diese Klassen funktionieren sowohl mit L1- als auch mit L2-Konstrukten. L2-Konstrukte stellen der Einfachheit halber eine grants Eigenschaft zur Verfügung, aber Sie können eine Grants-Klasse auch direkt aus einem L1-Konstrukt erstellen. Sie können Grants-Klassen mit Mixins kombinieren, um L1-Konstrukte einfacher zu handhaben L2-like .
Im folgenden Beispiel werden die Berechtigungen erstellt, die es der Ausführungsrolle einer Lambda-Funktion ermöglichen, Objekte in einen bestimmten Amazon S3-Bucket zu lesen und zu schreiben. Wenn der Amazon S3-Bucket mit einem AWS KMS-Schlüssel verschlüsselt ist, gewährt diese Methode der Ausführungsrolle der Lambda-Funktion auch Berechtigungen zur Entschlüsselung mit dem Schlüssel.
Beispiel
- TypeScript
-
if (bucket.grants.readWrite(func).success) {
// ...
}
- JavaScript
-
if ( bucket.grants.readWrite(func).success) {
// ...
}
- Python
-
if bucket.grants.read_write(func).success:
# ...
- Java
-
if (bucket.getGrants().readWrite(func).getSuccess()) {
// ...
}
- C#
-
if (bucket.Grants.ReadWrite(func).Success)
{
// ...
}
- Go
-
if *bucket.Grants().ReadWrite(function, nil).Success() {
// ...
}
Die Grant-Methoden geben ein iam.Grant Objekt zurück. Ermitteln Sie anhand des success Attributs des Grant Objekts, ob der Zuschuss tatsächlich gewährt wurde (z. B. wurde er möglicherweise nicht für externe Ressourcen gewährt). Sie können auch die assertSuccess (Python:assert_success) -Methode des Grant Objekts verwenden, um sicherzustellen, dass der Zuschuss erfolgreich gewährt wurde.
Wenn eine bestimmte Gewährungsmethode für den jeweiligen Anwendungsfall nicht verfügbar ist, können Sie eine generische Gewährungsmethode verwenden, um eine neue Gewährung mit einer bestimmten Liste von Aktionen zu definieren.
Das folgende Beispiel zeigt, wie einer Lambda-Funktion Zugriff auf die Amazon CreateBackup DynamoDB-Aktion gewährt wird.
Beispiel
- TypeScript
-
table.grants.actions(func, 'dynamodb:CreateBackup');
- JavaScript
-
table.grants.actions(func, 'dynamodb:CreateBackup');
- Python
-
table.grants.actions(func, "dynamodb:CreateBackup")
- Java
-
table.getGrants().actions(func, "dynamodb:CreateBackup");
- C#
-
table.Grants.Actions(func, "dynamodb:CreateBackup");
- Go
-
table := dynamodb.NewTable(this, jsii.String("MyTable"), &dynamodb.TableProps{})
table.Grants().Actions(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 diese Verwendung. Sie können dann Grant-Methoden für die Ressourcen verwenden, um der Rolle Anweisungen hinzuzufügen.
Die Grant-Methoden werden mithilfe von APIs auf niedrigerer Ebene für den Umgang mit IAM-Richtlinien erstellt. 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) hinzu, oder mit der addToRolePolicy Methode (Python:) zur Bucket Richtlinie einer Ressource addToResourcePolicy (z. B. einer Richtlinieadd_to_resource_policy).
Metriken und Alarme für Ressourcen
Viele Ressourcen geben CloudWatch Metriken aus, die zur Einrichtung von Überwachungs-Dashboards und Alarmen verwendet werden können. Higher-level Konstrukte verfügen über Metrikmethoden, 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 Amazon SQS-Warteschlange 100 überschreitet.
Beispiel
- 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 in einem Netzwerk aktivieren, damit eine Anwendung funktioniert, z. B. wenn die Recheninfrastruktur auf die Persistenzschicht zugreifen muss. Ressourcen, die Verbindungen herstellen oder auf diese warten, stellen Methoden zur Verfügung, die den Verkehrsfluss ermöglichen, einschließlich der Festlegung von Sicherheitsgruppenregeln oder Netzwerk-ACLs.
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IConnectable.htmlIConnectable-Ressourcen verfügen über eine connections Eigenschaft, die als Schnittstelle zur Konfiguration der Netzwerkverkehrsregeln dient.
Mithilfe allow von 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-Gruppefleet2.
Beispiel
- 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 am öffentlichen Port und die Ports, auf denen die Datenbank-Engine Verbindungen für Instances einer Amazon RDS-Datenbank akzeptiert. In solchen Fällen können Sie eine strenge Netzwerkkontrolle durchsetzen, 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-Gruppe für den Zugriff auf eine Datenbank aktiviert werden.
Beispiel
- 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-Bucket hinzugefügt wird.
Beispiel
- 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
Ressourcen, die persistente Daten verwalten, wie Datenbanken, Amazon S3-Buckets und Amazon ECR-Register, haben eine Entfernungsrichtlinie. Die Entfernungsrichtlinie gibt an, ob persistente Objekte gelöscht werden sollen, wenn der AWS CDK-Stack, der sie enthält, zerstört wird. Die Werte, die die Entfernungsrichtlinie angeben, sind über die RemovalPolicy Aufzählung im AWS core CDK-Modul verfügbar.
Neben den Ressourcen, die Daten dauerhaft speichern, gibt es möglicherweise auch eineremovalPolicy, 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 andere Bedeutungen und Standardwerte als die Entfernungsrichtlinie für einen Amazon S3-Bucket oder eine DynamoDB-Tabelle.
| Wert |
Bedeutung |
|
RemovalPolicy.RETAIN
|
Behalten Sie den Inhalt der Ressource bei, wenn Sie den Stack zerstören (Standardeinstellung). 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-Buckets, die Dateien enthalten, auch wenn ihre Entfernungsrichtlinie auf DESTROY festgelegt ist. Der Versuch, dies zu tun, ist ein AWS CloudFormation Fehler. Damit das AWS CDK alle Dateien aus dem Bucket löscht, bevor es ihn zerstört, setzen Sie die autoDeleteObjects Eigenschaft des Buckets auftrue.
Im Folgenden finden Sie ein Beispiel für die Erstellung eines Amazon S3-Buckets mit RemovalPolicy den Werten von DESTROY und autoDeleteOjbects auftrue.
Beispiel
- 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),
})
Sie können mithilfe der applyRemovalPolicy() Methode auch eine Entfernungsrichtlinie 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 Stapel
-
Amazon-Cognito-Benutzerpools
-
Amazon DocumentDB-Datenbank-Instances
-
Amazon EC2-Volumes
-
Amazon OpenSearch Service-Domänen
-
Amazon FSx-Dateisysteme
-
Amazon-SQS-Warteschlangen
Beispiel
- 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 RemovalPolicy bedeutet „s“. AWS CloudFormation DeletionPolicy Die Standardeinstellung in AWS CDK besteht jedoch darin, die Daten beizubehalten, was das Gegenteil der Standardeinstellung ist. AWS CloudFormation