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.
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.
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);
AWS CDK RemovalPolicy diterjemahkan menjadi AWS CloudFormation'sDeletionPolicy. Namun, default di AWS CDK adalah mempertahankan data, yang merupakan kebalikan dari AWS CloudFormation default.