View a markdown version of this page

Sumber daya dan AWS CDK - AWS Kit Pengembangan Cloud (AWS CDK) v2

Ini adalah Panduan Pengembang AWS CDK v2. CDK v1 yang lebih lama memasuki pemeliharaan pada 1 Juni 2022 dan mengakhiri dukungan pada 1 Juni 2023.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Sumber daya dan AWS CDK

Sumber daya adalah apa yang Anda konfigurasikan untuk menggunakan AWS layanan dalam aplikasi Anda. Sumber daya adalah fitur dari AWS CloudFormation. Dengan mengonfigurasi sumber daya dan propertinya dalam AWS CloudFormation template, Anda dapat menerapkan ke AWS CloudFormation untuk menyediakan sumber daya Anda. Dengan AWS Cloud Development Kit (AWS CDK), Anda dapat mengkonfigurasi sumber daya melalui konstruksi. Anda kemudian menerapkan aplikasi CDK Anda, yang melibatkan sintesis AWS CloudFormation template dan penerapan AWS CloudFormation untuk menyediakan sumber daya Anda.

Mengkonfigurasi sumber daya menggunakan konstruksi

Seperti dijelaskan dalam Konstruk AWS si CDK, AWS CDK menyediakan perpustakaan kelas konstruksi yang kaya, yang disebut konstruksi, yang mewakili semua sumber daya. AWS

Untuk membuat instance sumber daya menggunakan konstruksi yang sesuai, masukkan cakupan sebagai argumen pertama, ID logis konstruksi, dan satu set properti konfigurasi (props). Misalnya, berikut cara membuat antrian Amazon SQS dengan enkripsi AWS KMS menggunakan konstruk dari sqs.Queue Construct Library AWS .

contoh
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, })

Beberapa alat peraga konfigurasi bersifat opsional, dan dalam banyak kasus memiliki nilai default. Dalam beberapa kasus, semua alat peraga bersifat opsional, dan argumen terakhir dapat dihilangkan seluruhnya.

Atribut sumber daya

Sebagian besar sumber daya di AWS Construct Library mengekspos atribut, yang diselesaikan pada waktu penerapan oleh AWS CloudFormation. Atribut diekspos dalam bentuk properti pada kelas sumber daya dengan nama tipe sebagai awalan. Contoh berikut menunjukkan cara mendapatkan URL antrian Amazon SQS menggunakan properti queueUrl (Python:queue_url).

contoh
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

Lihat Token dan AWS CDK untuk informasi tentang bagaimana CDK mengkodekan AWS atribut penerapan waktu sebagai string.

Referensi sumber daya

Saat mengonfigurasi sumber daya, Anda sering harus mereferensikan properti sumber daya lain. Berikut ini adalah beberapa contohnya:

  • Sumber daya Amazon Elastic Container Service (Amazon ECS) memerlukan referensi ke cluster tempat ia berjalan.

  • Distri CloudFront busi Amazon memerlukan referensi ke bucket Amazon Simple Storage Service (Amazon S3) yang berisi kode sumber.

Anda dapat mereferensikan sumber daya dengan salah satu cara berikut:

  • Dengan meneruskan sumber daya yang ditentukan dalam aplikasi CDK Anda, baik dalam tumpukan yang sama atau di tumpukan yang berbeda

  • Dengan meneruskan objek proxy yang mereferensikan sumber daya yang ditentukan di AWS akun Anda, dibuat dari pengenal unik sumber daya (seperti ARN)

Jika properti konstruksi mewakili konstruksi untuk sumber daya lain, tipenya adalah tipe antarmuka konstruksi. Misalnya, konstruksi Amazon ECS mengambil properti cluster tipeecs.ICluster. Contoh lain, adalah CloudFront konstruksi distribusi yang mengambil properti sourceBucket (Python:source_bucket) tipes3.IBucket.

Anda dapat langsung meneruskan objek sumber daya apa pun dari jenis yang tepat yang ditentukan dalam aplikasi AWS CDK yang sama. Contoh berikut mendefinisikan cluster Amazon ECS dan kemudian menggunakannya untuk menentukan layanan Amazon ECS.

contoh
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, })

Mereferensikan sumber daya dalam tumpukan yang berbeda

Anda dapat merujuk ke sumber daya dalam tumpukan yang berbeda, asalkan didefinisikan dalam aplikasi yang sama. Tumpukan dapat berada di AWS lingkungan yang sama atau berbeda (akun dan wilayah). Pola berikut umumnya digunakan:

  • Simpan referensi ke konstruk sebagai atribut dari tumpukan yang menghasilkan sumber daya. (Untuk mendapatkan referensi ke tumpukan konstruksi saat ini, gunakanStack.of(this).)

  • Berikan referensi ini ke konstruktor tumpukan yang mengkonsumsi sumber daya sebagai parameter atau properti. Tumpukan yang dikonsumsi kemudian meneruskannya sebagai properti ke konstruksi apa pun yang membutuhkannya.

Contoh berikut mendefinisikan tumpukanstack1. Tumpukan ini mendefinisikan bucket Amazon S3 dan menyimpan referensi ke konstruksi bucket sebagai atribut tumpukan. Kemudian aplikasi mendefinisikan tumpukan kedua,stack2, yang menerima bucket saat instantiasi. stack2mungkin, misalnya, menentukan Tabel AWS Glue yang menggunakan bucket untuk penyimpanan data.

contoh
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});

Jika AWS CDK menentukan bahwa sumber daya berada di lingkungan yang sama, tetapi dalam tumpukan yang berbeda, CDK secara otomatis mensintesis AWS CloudFormation ekspor dalam tumpukan produksi dan Fn::ImportValue di tumpukan konsumsi untuk mentransfer informasi itu dari satu tumpukan ke tumpukan lainnya. Ini adalah referensi yang kuat—perilaku default. Anda dapat mengontrol kekuatan referensi cross-stack untuk menghindari kebuntuan ketergantungan.

Kekuatan referensi

Setiap referensi cross-stack memiliki kekuatan yang menentukan CloudFormation mekanisme yang digunakan dan kopling antar tumpukan:

Ku at (default)

Tumpukan produksi membuat CloudFormation ekspor dan menggunakan tumpukan konsumsiFn::ImportValue. Ini berarti tumpukan produksi tidak dapat diperbarui untuk menghapus ekspor sementara konsumen masih mengimpornya. CloudFormation memberlakukan kendala ini.

Lemah

Tumpukan konsumsi digunakan Fn::GetStackOutput untuk membaca output langsung dari tumpukan produksi. Tidak ada kopling ekspor yang dibuat; tumpukan mana pun dapat diperbarui atau dihapus secara independen.

Keduanya

Negara transisi untuk bermigrasi dari kuat ke lemah. Tumpukan produksi mempertahankan ekspornya (sehingga konsumen kuat yang ada tidak rusak), sementara tumpukan konsumsi beralih keFn::GetStackOutput.

Kebuntuan ketergantungan (pelukan mematikan)

Referensi yang kuat dapat membuat kebuntuan yang mencegah pembaruan tumpukan. Ini terjadi karena CloudFormation tidak dapat menghapus ekspor sementara tumpukan lain masih mengimpornya—dan tumpukan konsumsi tidak dapat diperbarui untuk berhenti mengimpor sampai ekspor sudah ada. Anda mungkin melihat kesalahan seperti:

Export Stack1:ExportsOutputFnGetAtt-****** cannot be deleted as it is in use by Stack2

Ini biasanya terjadi ketika Anda mencoba menghapus sumber daya bersama atau merestrukturisasi tumpukan Anda. Referensi yang lemah menghindari masalah ini sepenuhnya, karena mereka tidak menciptakan ekspor.

Mengontrol kekuatan referensi

Anda dapat mengontrol kekuatan referensi di tiga cakupan: seluruh aplikasi, per sumber daya, atau per penggunaan.

App-wide default

Setel kunci konteks berikut cdk.json untuk mengubah default untuk semua referensi cross-stack di aplikasi:

{ "context": { "@aws-cdk/core:defaultCrossStackReferences": "weak" } }
Per-resource

Ganti kekuatan untuk semua referensi yang menunjuk ke sumber daya tertentu menggunakan: CrossStackReferences.of(resource).produce(strength)

contoh
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)

Semua referensi ke bucket dari tumpukan lain sekarang akan digunakan Fn::GetStackOutput terlepas dari default seluruh aplikasi.

Per-usage

Mengganti kekuatan referensi tunggal pada titik konsumsi menggunakan: Stack.consumeReference()

contoh
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, })

Gunakan Stack.consumeListReference() untuk referensi daftar string.

Penggantian cakupan

Anda juga dapat mengatur kekuatan referensi untuk subpohon konstruksi menggunakan. CrossStackReferences.of(scope).consume(strength) Semua referensi cross-stack yang dikonsumsi dalam lingkup itu akan menggunakan kekuatan yang ditentukan.

Bermigrasi dari referensi kuat ke referensi lemah

Jika Anda sudah menerapkan tumpukan dengan referensi kuat, Anda tidak dapat beralih langsung ke lemah— CloudFormation akan gagal karena ekspor masih digunakan. Sebagai gantinya, gunakan migrasi dua fase melalui keadaan BOTH transisi.

API mana yang akan digunakan tergantung pada tujuan Anda:

  • Menghapus satu referensi (tetapi menjaga tumpukan dan sumber daya tetap di tempatnya) —gunakan hanya Stack.consumeReference() untuk melemahkan penggunaan spesifik itu.

  • Menghapus atau merestrukturisasi sumber daya produksi —gunakan CrossStackReferences.of(producer).produce() untuk melemahkan semua referensi yang menunjuk ke sumber daya itu sekaligus.

Kedua pendekatan mengikuti pola dua fase yang sama yang dijelaskan di bawah ini. Contoh-contoh menunjukkan pendekatan per sumber daya. Untuk per penggunaan, bungkus referensi dengan Stack.consumeReference(ref, ReferenceStrength.BOTH) di Fase 1 dan Stack.consumeReference(ref, ReferenceStrength.WEAK) di Fase 2.

Tahap 1: Terapkan dengan KED UANYA

Ganti kekuatan referensi keBOTH. Ini membuat tumpukan konsumsi mulai menggunakanFn::GetStackOutput, tetapi menyimpan ekspor di tumpukan produksi sehingga transisi aman:

contoh
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)

Terapkan kedua tumpukan.

Tahap 2: Terapkan dengan WE AK

Sekarang tidak ada konsumen yang menggunakannyaFn::ImportValue, ekspor dapat dihapus dengan aman. Beralih keWEAK:

contoh
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)

Terapkan kedua tumpukan. Ekspor dihapus dan referensi sekarang sepenuhnya lemah.

Setelah migrasi ini, Anda dapat dengan bebas menghapus, memindahkan, atau merestrukturisasi sumber daya tanpa menekan pelukan mematikan.

Solusi manual (warisan)

Jika Anda belum menggunakan kontrol kekuatan referensi, Anda dapat mengatasi kebuntuan secara manual. Hapus penggunaan sumber daya bersama dari tumpukan konsumsi. Kemudian secara manual tambahkan ekspor yang sama ke tumpukan produksi menggunakan ID logis yang sama persis dengan ekspor yang dihasilkan secara otomatis. Terapkan kedua tumpukan untuk menghapus. Fn::ImportValue Kemudian hapus ekspor manual (dan sumber daya bersama jika tidak lagi diperlukan) dan gunakan kedua tumpukan lagi. exportValue()Metode tumpukan adalah cara mudah untuk membuat ekspor manual untuk tujuan ini.

Referensikan sumber daya di Anda AWS akun

Misalkan Anda ingin menggunakan sumber daya yang sudah tersedia di AWS akun Anda di aplikasi AWS CDK Anda. Ini mungkin sumber daya yang didefinisikan melalui konsol, AWS SDK, langsung dengan AWS CloudFormation, atau dalam aplikasi AWS CDK yang berbeda. Anda dapat mengubah ARN sumber daya (atau atribut pengenal lainnya, atau grup atribut) menjadi objek proxy. Objek proxy berfungsi sebagai referensi ke sumber daya dengan memanggil metode pabrik statis pada kelas sumber daya.

Saat Anda membuat proxy seperti itu, sumber daya eksternal tidak menjadi bagian dari aplikasi AWS CDK Anda. Oleh karena itu, perubahan yang Anda buat pada proxy di aplikasi AWS CDK Anda tidak memengaruhi sumber daya yang digunakan. Namun, proxy dapat diteruskan ke metode AWS CDK apa pun yang memerlukan sumber daya jenis itu.

Contoh berikut menunjukkan cara mereferensikan bucket berdasarkan bucket yang ada dengan ARNarn:aws:s3:::amzn-s3-demo-bucket1, dan Amazon Virtual Private Cloud berdasarkan VPC yang ada yang memiliki ID tertentu.

contoh
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"), })

Mari kita lihat lebih dekat Vpc.fromLookup() metode ini. Karena ec2.Vpc konstruksinya rumit, ada banyak cara Anda mungkin ingin memilih VPC yang akan digunakan dengan aplikasi CDK Anda. Untuk mengatasi hal ini, konstruksi VPC memiliki metode fromLookup statis (Python:from_lookup) yang memungkinkan Anda mencari VPC Amazon yang diinginkan dengan menanyakan AWS akun Anda pada waktu sintesis.

Untuk menggunakanVpc.fromLookup(), sistem yang mensintesis tumpukan harus memiliki akses ke akun yang memiliki Amazon VPC. Ini karena CDK Toolkit menanyakan akun untuk menemukan Amazon VPC yang tepat pada waktu sintesis.

Selanjutnya, hanya Vpc.fromLookup() berfungsi di tumpukan yang ditentukan dengan akun dan wilayah eksplisit (lihat Lingkungan untuk AWS CDK). Jika AWS CDK mencoba mencari VPC Amazon dari tumpukan agnostik lingkungan, CDK Toolkit tidak tahu lingkungan mana yang harus ditanyakan untuk menemukan VPC.

Anda harus memberikan Vpc.fromLookup() atribut yang cukup untuk mengidentifikasi VPC secara unik di AWS akun Anda. Misalnya, hanya ada satu VPC default, jadi cukup untuk menentukan VPC sebagai default.

contoh
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), })

Anda juga dapat menggunakan tags properti untuk menanyakan VPC berdasarkan tag. Anda dapat menambahkan tag ke Amazon VPC pada saat pembuatannya dengan menggunakan AWS CloudFormation atau AWS CDK. Anda dapat mengedit tag kapan saja setelah pembuatan menggunakan AWS Management Console, AWS CLI, atau AWS SDK. Selain tag apa pun yang Anda tambahkan sendiri, AWS CDK secara otomatis menambahkan tag berikut ke semua VPC yang dibuatnya.

  • Nama — Nama VPC.

  • aws-cdk:subnet-name — Nama subnet.

  • aws-cdk:subnet-type — Jenis subnet: Publik, Pribadi, atau Terisolasi.

contoh
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")}, })

Hasil dari Vpc.fromLookup() di-cache dalam cdk.context.json file proyek. (Lihat Nilai konteks dan AWS CDK.) Masukkan file ini ke kontrol versi sehingga aplikasi Anda akan terus merujuk ke Amazon VPC yang sama. Ini berfungsi bahkan jika Anda kemudian mengubah atribut VPC Anda dengan cara yang akan menghasilkan VPC yang berbeda dipilih. Hal ini sangat penting jika Anda menerapkan stack di lingkungan yang tidak memiliki akses ke AWS akun yang mendefinisikan VPC, seperti CDK Pipelines.

Meskipun Anda dapat menggunakan sumber daya eksternal di mana pun Anda menggunakan sumber daya serupa yang ditentukan di aplikasi AWS CDK Anda, Anda tidak dapat memodifikasinya. Misalnya, memanggil addToResourcePolicy (Python:add_to_resource_policy) pada eksternal s3.Bucket tidak melakukan apa-apa.

Nama fisik sumber daya

Nama logis sumber daya di AWS CloudFormation berbeda dari nama sumber daya yang ditampilkan di Konsol AWS Manajemen setelah digunakan oleh AWS CloudFormation. AWS CDK menyebut nama-nama akhir ini nama fisik.

Misalnya, AWS CloudFormation mungkin membuat bucket Amazon S3 dengan ID logis Stack2MyBucket4DD88B4F dan nama fisikstack2MyBucket4dd88b4f-iuv1rbv9z3to.

Anda dapat menentukan nama fisik saat membuat konstruksi yang mewakili sumber daya dengan menggunakan properti<resourceType>Name. Contoh berikut membuat bucket Amazon S3 dengan nama fisikamzn-s3-demo-bucket.

contoh
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"), })

Menetapkan nama fisik ke sumber daya memiliki beberapa kelemahan. AWS CloudFormation Yang paling penting, setiap perubahan pada sumber daya yang digunakan yang memerlukan penggantian sumber daya, seperti perubahan pada properti sumber daya yang tidak dapat diubah setelah pembuatan, akan gagal jika sumber daya memiliki nama fisik yang ditetapkan. Jika Anda berakhir dalam keadaan itu, satu-satunya solusi adalah menghapus AWS CloudFormation tumpukan, lalu gunakan aplikasi AWS CDK lagi. Lihat AWS CloudFormation dokumentasi untuk detailnya.

Dalam beberapa kasus, seperti saat membuat aplikasi AWS CDK dengan referensi lintas lingkungan, nama fisik diperlukan agar AWS CDK berfungsi dengan benar. Dalam kasus tersebut, jika Anda tidak ingin repot-repot membuat nama fisik sendiri, Anda dapat membiarkan AWS CDK menamainya untuk Anda. Untuk melakukannya, gunakan nilai khususPhysicalName.GENERATE_IF_NEEDED, sebagai berikut.

contoh
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(), })

Meneruskan pengidentifikasi sumber daya unik

Bila memungkinkan, Anda harus meneruskan sumber daya dengan referensi, seperti yang dijelaskan di bagian sebelumnya. Namun, ada kasus di mana Anda tidak punya pilihan lain selain merujuk ke sumber daya dengan salah satu atributnya. Contoh kasus penggunaan meliputi:

  • Ketika Anda menggunakan AWS CloudFormation sumber daya tingkat rendah.

  • Ketika Anda perlu mengekspos sumber daya ke komponen runtime dari aplikasi AWS CDK, seperti ketika merujuk ke fungsi Lambda melalui variabel lingkungan.

Pengidentifikasi ini tersedia sebagai atribut pada sumber daya, seperti berikut ini.

contoh
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

Pengikatan Java AWS CDK menggunakan metode getter untuk atribut.

bucket.getBucketName() lambdaFunc.getFunctionArn() securityGroup.getGroupArn()
C#
bucket.BucketName lambdaFunc.FunctionArn securityGroup.GroupArn
Go
bucket.BucketName() fn.FunctionArn()

Contoh berikut menunjukkan cara meneruskan nama bucket yang dihasilkan ke fungsi AWS Lambda.

contoh
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()}, })

Memberikan izin antar sumber daya

Higher-level konstruksi membuat izin hak istimewa paling kecil dapat dicapai dengan menawarkan API sederhana berbasis maksud untuk menyatakan persyaratan izin. Misalnya, banyak konstruksi menawarkan metode pemberian yang dapat Anda gunakan untuk memberikan izin kepada entitas (seperti peran IAM atau pengguna) untuk bekerja dengan sumber daya, tanpa harus membuat pernyataan izin IAM secara manual.

Metode hibah tersedia melalui kelas Grants (seperti BucketGrants untuk bucket Amazon S3). Kelas-kelas ini bekerja dengan konstruksi L1 dan L2. Konstruksi L2 mengekspos grants properti untuk kenyamanan, tetapi Anda juga dapat membuat kelas Grants langsung dari konstruksi L1. Anda dapat menggabungkan kelas Grants dengan Mixins untuk mendapatkan L2-like kenyamanan pada konstruksi L1.

Contoh berikut membuat izin untuk mengizinkan peran eksekusi fungsi Lambda untuk membaca dan menulis objek ke bucket Amazon S3 tertentu. Jika bucket Amazon S3 dienkripsi dengan kunci AWS KMS, metode ini juga memberikan izin pada peran eksekusi fungsi Lambda untuk mendekripsi dengan kunci.

contoh
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() { // ... }

Metode hibah mengembalikan iam.Grant objek. Gunakan success atribut Grant objek untuk menentukan apakah hibah diterapkan secara efektif (misalnya, mungkin tidak diterapkan pada sumber daya eksternal). Anda juga dapat menggunakan metode assertSuccess (Python:assert_success) Grant objek untuk menegakkan bahwa hibah berhasil diterapkan.

Jika metode hibah tertentu tidak tersedia untuk kasus penggunaan tertentu, Anda dapat menggunakan metode hibah generik untuk menentukan hibah baru dengan daftar tindakan tertentu.

Contoh berikut menunjukkan cara memberikan akses fungsi Lambda ke tindakan Amazon DynamoDBCreateBackup.

contoh
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"))

Banyak sumber daya, seperti fungsi Lambda, memerlukan peran untuk diasumsikan saat mengeksekusi kode. Properti konfigurasi memungkinkan Anda untuk menentukaniam.IRole. Jika tidak ada peran yang ditentukan, fungsi secara otomatis membuat peran khusus untuk penggunaan ini. Anda kemudian dapat menggunakan metode hibah pada sumber daya untuk menambahkan pernyataan ke peran.

Metode hibah dibuat menggunakan API tingkat rendah untuk penanganan dengan kebijakan IAM. Kebijakan dimodelkan sebagai PolicyDocument objek. Tambahkan pernyataan langsung ke peran (atau peran terlampir konstruksi) menggunakan addToRolePolicy metode (Python:add_to_role_policy), atau ke kebijakan sumber daya (seperti Bucket kebijakan) menggunakan metode addToResourcePolicy (Python:add_to_resource_policy).

Metrik dan alarm sumber daya

Banyak sumber daya memancarkan CloudWatch metrik yang dapat digunakan untuk mengatur dasbor dan alarm pemantauan. Higher-level konstruksi memiliki metode metrik yang memungkinkan Anda mengakses metrik tanpa mencari nama yang benar untuk digunakan.

Contoh berikut menunjukkan cara menentukan alarm ketika antri ApproximateNumberOfMessagesNotVisible an Amazon SQS melebihi 100.

contoh
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), })

Jika tidak ada metode untuk metrik tertentu, Anda dapat menggunakan metode metrik umum untuk menentukan nama metrik secara manual.

Metrik juga dapat ditambahkan ke CloudWatch dasbor. Lihat CloudWatch.

Lalu lintas jaringan

Dalam banyak kasus, Anda harus mengaktifkan izin pada jaringan agar aplikasi dapat bekerja, seperti ketika infrastruktur komputasi perlu mengakses lapisan persistensi. Sumber daya yang membuat atau mendengarkan koneksi mengekspos metode yang mengaktifkan aliran lalu lintas, termasuk menyetel aturan grup keamanan atau ACL jaringan.

Sumber daya iConnectable memiliki connections properti yang merupakan gateway ke konfigurasi aturan lalu lintas jaringan.

Anda mengaktifkan data mengalir pada jalur jaringan tertentu dengan menggunakan allow metode. Contoh berikut memungkinkan koneksi HTTPS ke web dan koneksi masuk dari grup fleet2 Amazon EC2 Auto Scaling.

contoh
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"))

Sumber daya tertentu memiliki port default yang terkait dengannya. Contohnya termasuk pendengar penyeimbang beban pada port publik, dan port tempat mesin database menerima koneksi untuk instance database Amazon RDS. Dalam kasus seperti itu, Anda dapat menerapkan kontrol jaringan yang ketat tanpa harus menentukan port secara manual. Untuk melakukannya, gunakan allowToDefaultPort metode allowDefaultPortFrom dan (Python:allow_default_port_from,allow_to_default_port).

Contoh berikut menunjukkan cara mengaktifkan koneksi dari alamat IPV4 apa pun, dan koneksi dari grup Auto Scaling untuk mengakses database.

contoh
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"))

Penanganan acara

Beberapa sumber daya dapat bertindak sebagai sumber acara. Gunakan addEventNotification metode (Python:add_event_notification) untuk mendaftarkan target peristiwa ke jenis peristiwa tertentu yang dipancarkan oleh sumber daya. Selain itu, addXxxNotification metode menawarkan cara sederhana untuk mendaftarkan handler untuk jenis acara umum.

Contoh berikut menunjukkan cara memicu fungsi Lambda saat objek ditambahkan ke bucket Amazon S3.

contoh
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)

Kebijakan penghapusan

Sumber daya yang memelihara data persisten, seperti database, bucket Amazon S3, dan registri Amazon ECR, memiliki kebijakan penghapusan. Kebijakan penghapusan menunjukkan apakah akan menghapus objek persisten ketika tumpukan AWS CDK yang berisi objek tersebut dihancurkan. Nilai-nilai yang menentukan kebijakan penghapusan tersedia melalui RemovalPolicy enumerasi dalam modul AWS CDKcore.

catatan

Sumber daya selain yang menyimpan data secara terus-menerus mungkin juga memiliki sumber daya removalPolicy yang digunakan untuk tujuan yang berbeda. Misalnya, versi fungsi Lambda menggunakan removalPolicy atribut untuk menentukan apakah versi tertentu dipertahankan ketika versi baru diterapkan. Ini memiliki arti dan default yang berbeda dibandingkan dengan kebijakan penghapusan pada bucket Amazon S3 atau tabel DynamoDB.

Nilai Arti

RemovalPolicy.RETAIN

Simpan isi sumber daya saat menghancurkan tumpukan (default). Sumber daya menjadi yatim piatu dari tumpukan dan harus dihapus secara manual. Jika Anda mencoba menerapkan ulang tumpukan sementara sumber daya masih ada, Anda akan menerima pesan kesalahan karena konflik nama.

RemovalPolicy.DESTROY

Sumber daya akan dihancurkan bersama dengan tumpukan.

AWS CloudFormation tidak menghapus bucket Amazon S3 yang berisi file meskipun kebijakan penghapusannya disetel keDESTROY. Mencoba melakukannya adalah AWS CloudFormation kesalahan. Agar AWS CDK menghapus semua file dari bucket sebelum menghancurkannya, setel autoDeleteObjects properti bucket ketrue.

Berikut ini adalah contoh membuat bucket Amazon S3 dengan RemovalPolicy dari DESTROY dan diset autoDeleteOjbects el ketrue.

contoh
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), })

Anda juga dapat menerapkan kebijakan penghapusan langsung ke AWS CloudFormation sumber daya yang mendasarinya melalui applyRemovalPolicy() metode ini. Metode ini tersedia pada beberapa sumber daya stateful yang tidak memiliki removalPolicy properti di alat peraga sumber daya L2 mereka. Contohnya meliputi hal berikut:

  • AWS CloudFormation tumpukan

  • Kumpulan pengguna Amazon Cognito

  • Instans database Amazon DocumentDB

  • Volume Amazon EC2

  • Dom OpenSearch ain Layanan Amazon

  • Sistem file Amazon FSx

  • Antrean Amazon SQS

contoh
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);
catatan

AWS CDK RemovalPolicy diterjemahkan menjadi AWS CloudFormation'sDeletionPolicy. Namun, default di AWS CDK adalah mempertahankan data, yang merupakan kebalikan dari AWS CloudFormation default.