Ini adalah Panduan Pengembang AWS CDK v2. CDKV1 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.
Kustomisasi konstruksi dari AWS Construct Library
Sesuaikan konstruksi dari AWS Construct Library melalui escape hatch, raw override, dan custom resource.
Gunakan palka pelarian
The AWS Construct Library menyediakan konstruksi dari berbagai tingkat abstraksi.
Pada tingkat tertinggi, AWS CDK aplikasi Anda dan tumpukan di dalamnya sendiri merupakan abstraksi dari seluruh infrastruktur cloud Anda, atau bagian signifikan darinya. Mereka dapat diparameterisasi untuk menerapkannya di lingkungan yang berbeda atau untuk kebutuhan yang berbeda.
Abstraksi adalah alat yang ampuh untuk merancang dan mengimplementasikan aplikasi cloud. AWS CDK Ini memberi Anda kekuatan tidak hanya untuk membangun dengan abstraksinya, tetapi juga untuk membuat abstraksi baru. Menggunakan konstruksi L2 dan L3 open-source yang ada sebagai panduan, Anda dapat membangun konstruksi L2 dan L3 Anda sendiri untuk mencerminkan praktik dan pendapat terbaik organisasi Anda sendiri.
Tidak ada abstraksi yang sempurna, dan bahkan abstraksi yang baik tidak dapat mencakup setiap kasus penggunaan yang mungkin. Selama pengembangan, Anda mungkin menemukan konstruksi yang hampir sesuai dengan kebutuhan Anda, membutuhkan kustomisasi kecil atau besar.
Untuk alasan ini, AWS CDK menyediakan cara untuk keluar dari model konstruksi. Ini termasuk pindah ke abstraksi tingkat yang lebih rendah atau ke model yang berbeda sepenuhnya. Escape hatch memungkinkan Anda lolos dari AWS CDK paradigma dan menyesuaikannya dengan cara yang sesuai dengan kebutuhan Anda. Kemudian, Anda dapat membungkus perubahan Anda dalam konstruksi baru untuk mengabstraksikan kompleksitas yang mendasarinya dan memberikan pembersihan API bagi pengembang lain.
Berikut ini adalah contoh situasi di mana Anda dapat menggunakan palka pelarian:
-
Fitur AWS layanan tersedia melalui AWS CloudFormation, tetapi tidak ada konstruksi L2 untuk itu.
-
Fitur AWS layanan tersedia melalui AWS CloudFormation, dan ada konstruksi L2 untuk layanan ini, tetapi ini belum mengekspos fitur tersebut. Karena konstruksi L2 dikuratori oleh CDK tim, mereka mungkin tidak segera tersedia untuk fitur baru.
-
Fitur ini belum tersedia AWS CloudFormation sama sekali.
Untuk menentukan apakah fitur tersedia melalui AWS CloudFormation, lihat Referensi Jenis AWS Sumber Daya dan Properti.
Kembangkan lubang keluar untuk konstruksi L1
Jika konstruksi L2 tidak tersedia untuk layanan, Anda dapat menggunakan konstruksi L1 yang dihasilkan secara otomatis. Sumber daya ini dapat dikenali dari namanya dimulai denganCfn
, seperti CfnBucket
atauCfnRole
. Anda membuat instance persis seperti Anda akan menggunakan sumber daya yang setara AWS CloudFormation .
Misalnya, untuk membuat instance bucket Amazon S3 L1 tingkat rendah dengan analitik diaktifkan, Anda akan menulis sesuatu seperti berikut ini.
- TypeScript
-
new s3.CfnBucket(this, 'amzn-s3-demo-bucket', {
analyticsConfigurations: [
{
id: 'Config',
// ...
}
]
});
- JavaScript
-
new s3.CfnBucket(this, 'amzn-s3-demo-bucket', {
analyticsConfigurations: [
{
id: 'Config'
// ...
}
]
});
- Python
-
s3.CfnBucket(self, "amzn-s3-demo-bucket",
analytics_configurations: [
dict(id="Config",
# ...
)
]
)
- Java
-
CfnBucket.Builder.create(this, "amzn-s3-demo-bucket")
.analyticsConfigurations(Arrays.asList(java.util.Map.of( // Java 9 or later
"id", "Config", // ...
))).build();
- C#
-
new CfnBucket(this, 'amzn-s3-demo-bucket', new CfnBucketProps {
AnalyticsConfigurations = new Dictionary<string, string>
{
["id"] = "Config",
// ...
}
});
Mungkin ada kasus yang jarang terjadi di mana Anda ingin mendefinisikan sumber daya yang tidak memiliki CfnXxx
kelas yang sesuai. Ini bisa menjadi jenis sumber daya baru yang belum dipublikasikan dalam spesifikasi AWS CloudFormation sumber daya. Dalam kasus seperti ini, Anda dapat membuat instance cdk.CfnResource
secara langsung dan menentukan jenis sumber daya dan properti. Seperti yang ditunjukkan dalam contoh berikut.
- TypeScript
-
new cdk.CfnResource(this, 'amzn-s3-demo-bucket', {
type: 'AWS::S3::Bucket',
properties: {
// Note the PascalCase here! These are CloudFormation identifiers.
AnalyticsConfigurations: [
{
Id: 'Config',
// ...
}
]
}
});
- JavaScript
-
new cdk.CfnResource(this, 'amzn-s3-demo-bucket', {
type: 'AWS::S3::Bucket',
properties: {
// Note the PascalCase here! These are CloudFormation identifiers.
AnalyticsConfigurations: [
{
Id: 'Config'
// ...
}
]
}
});
- Python
-
cdk.CfnResource(self, 'amzn-s3-demo-bucket',
type="AWS::S3::Bucket",
properties=dict(
# Note the PascalCase here! These are CloudFormation identifiers.
"AnalyticsConfigurations": [
{
"Id": "Config",
# ...
}
]
}
)
- Java
-
CfnResource.Builder.create(this, "amzn-s3-demo-bucket")
.type("AWS::S3::Bucket")
.properties(java.util.Map.of( // Map.of requires Java 9 or later
// Note the PascalCase here! These are CloudFormation identifiers
"AnalyticsConfigurations", Arrays.asList(
java.util.Map.of("Id", "Config", // ...
))))
.build();
- C#
-
new CfnResource(this, "amzn-s3-demo-bucket", new CfnResourceProps
{
Type = "AWS::S3::Bucket",
Properties = new Dictionary<string, object>
{ // Note the PascalCase here! These are CloudFormation identifiers
["AnalyticsConfigurations"] = new Dictionary<string, string>[]
{
new Dictionary<string, string> {
["Id"] = "Config"
}
}
}
});
Kembangkan lubang keluar untuk konstruksi L2
Jika konstruksi L2 tidak memiliki fitur atau Anda mencoba mengatasi masalah, Anda dapat memodifikasi konstruksi L1 yang dienkapsulasi oleh konstruksi L2.
Semua konstruksi L2 berisi di dalamnya konstruksi L1 yang sesuai. Misalnya, Bucket
konstruksi tingkat tinggi membungkus konstruksi tingkat rendah. CfnBucket
Karena CfnBucket
sesuai langsung dengan AWS CloudFormation sumber daya, ia mengekspos semua fitur yang tersedia melalui AWS CloudFormation.
Pendekatan dasar untuk mendapatkan akses ke konstruksi L1 adalah dengan menggunakan (construct.node.defaultChild
Python:default_child
), melemparkannya ke tipe yang tepat (jika perlu), dan memodifikasi propertinya. Sekali lagi, mari kita ambil contoh dari aBucket
.
- TypeScript
-
// Get the CloudFormation resource
const cfnBucket = bucket.node.defaultChild as s3.CfnBucket;
// Change its properties
cfnBucket.analyticsConfiguration = [
{
id: 'Config',
// ...
}
];
- JavaScript
-
// Get the CloudFormation resource
const cfnBucket = bucket.node.defaultChild;
// Change its properties
cfnBucket.analyticsConfiguration = [
{
id: 'Config'
// ...
}
];
- Python
-
# Get the CloudFormation resource
cfn_bucket = bucket.node.default_child
# Change its properties
cfn_bucket.analytics_configuration = [
{
"id": "Config",
# ...
}
]
- Java
-
// Get the CloudFormation resource
CfnBucket cfnBucket = (CfnBucket)bucket.getNode().getDefaultChild();
cfnBucket.setAnalyticsConfigurations(
Arrays.asList(java.util.Map.of( // Java 9 or later
"Id", "Config", // ...
));
- C#
-
// Get the CloudFormation resource
var cfnBucket = (CfnBucket)bucket.Node.DefaultChild;
cfnBucket.AnalyticsConfigurations = new List<object> {
new Dictionary<string, string>
{
["Id"] = "Config",
// ...
}
};
Anda juga dapat menggunakan objek ini untuk mengubah AWS CloudFormation opsi seperti Metadata
danUpdatePolicy
.
- TypeScript
-
cfnBucket.cfnOptions.metadata = {
MetadataKey: 'MetadataValue'
};
- JavaScript
-
cfnBucket.cfnOptions.metadata = {
MetadataKey: 'MetadataValue'
};
- Python
-
cfn_bucket.cfn_options.metadata = {
"MetadataKey": "MetadataValue"
}
- Java
-
cfnBucket.getCfnOptions().setMetadata(java.util.Map.of( // Java 9+
"MetadataKey", "Metadatavalue"));
- C#
-
cfnBucket.CfnOptions.Metadata = new Dictionary<string, object>
{
["MetadataKey"] = "Metadatavalue"
};
Gunakan palka yang tidak bisa melarikan diri
Ini AWS CDK juga menyediakan kemampuan untuk naik tingkat abstraksi, yang mungkin kita sebut sebagai palka “un-escape”. Jika Anda memiliki konstruksi L1, sepertiCfnBucket
, Anda dapat membuat konstruksi L2 baru (Bucket
dalam hal ini) untuk membungkus konstruksi L1.
Ini nyaman ketika Anda membuat sumber daya L1 tetapi ingin menggunakannya dengan konstruksi yang membutuhkan sumber daya L2. Ini juga membantu ketika Anda ingin menggunakan metode kenyamanan seperti .grantXxxxx()
itu tidak tersedia pada konstruksi L1.
Anda pindah ke tingkat abstraksi yang lebih tinggi menggunakan metode statis pada kelas L2 yang disebut .fromCfnXxxxx()
—misalnya, untuk bucket Amazon Bucket.fromCfnBucket()
S3. Sumber daya L1 adalah satu-satunya parameter.
- TypeScript
-
b1 = new s3.CfnBucket(this, "buck09", { ... });
b2 = s3.Bucket.fromCfnBucket(b1);
- JavaScript
-
b1 = new s3.CfnBucket(this, "buck09", { ...} );
b2 = s3.Bucket.fromCfnBucket(b1);
- Python
-
b1 = s3.CfnBucket(self, "buck09", ...)
b2 = s3.from_cfn_bucket(b1)
- Java
-
CfnBucket b1 = CfnBucket.Builder.create(this, "buck09")
// ....
.build();
IBucket b2 = Bucket.fromCfnBucket(b1);
- C#
-
var b1 = new CfnBucket(this, "buck09", new CfnBucketProps { ... });
var v2 = Bucket.FromCfnBucket(b1);
Konstruksi L2 yang dibuat dari konstruksi L1 adalah objek proxy yang merujuk ke sumber daya L1, mirip dengan yang dibuat dari nama sumber daya,, atau pencarian. ARNs Modifikasi pada konstruksi ini tidak memengaruhi AWS CloudFormation
template akhir yang disintesis (karena Anda memiliki sumber daya L1, Anda dapat memodifikasinya sebagai gantinya). Untuk informasi selengkapnya tentang objek proxy, lihatMereferensikan sumber daya di akun Anda AWS.
Untuk menghindari kebingungan, jangan membuat beberapa konstruksi L2 yang merujuk ke konstruksi L1 yang sama. Misalnya, jika Anda mengekstrak CfnBucket
dari Bucket
menggunakan teknik di bagian sebelumnya, Anda tidak boleh membuat Bucket
instance kedua Bucket.fromCfnBucket()
dengan memanggilnyaCfnBucket
. Ini benar-benar berfungsi seperti yang Anda harapkan (hanya satu yang AWS::S3::Bucket
disintesis) tetapi itu membuat kode Anda lebih sulit untuk dipertahankan.
Gunakan penggantian mentah
Jika ada properti yang hilang dari konstruksi L1, Anda dapat melewati semua pengetikan menggunakan penggantian mentah. Ini juga memungkinkan untuk menghapus properti yang disintesis.
Gunakan salah satu addOverride
metode (Python:add_override
) metode, seperti yang ditunjukkan pada contoh berikut.
- TypeScript
-
// Get the CloudFormation resource
const cfnBucket = bucket.node.defaultChild as s3.CfnBucket;
// Use dot notation to address inside the resource template fragment
cfnBucket.addOverride('Properties.VersioningConfiguration.Status', 'NewStatus');
cfnBucket.addDeletionOverride('Properties.VersioningConfiguration.Status');
// use index (0 here) to address an element of a list
cfnBucket.addOverride('Properties.Tags.0.Value', 'NewValue');
cfnBucket.addDeletionOverride('Properties.Tags.0');
// addPropertyOverride is a convenience function for paths starting with "Properties."
cfnBucket.addPropertyOverride('VersioningConfiguration.Status', 'NewStatus');
cfnBucket.addPropertyDeletionOverride('VersioningConfiguration.Status');
cfnBucket.addPropertyOverride('Tags.0.Value', 'NewValue');
cfnBucket.addPropertyDeletionOverride('Tags.0');
- JavaScript
-
// Get the CloudFormation resource
const cfnBucket = bucket.node.defaultChild ;
// Use dot notation to address inside the resource template fragment
cfnBucket.addOverride('Properties.VersioningConfiguration.Status', 'NewStatus');
cfnBucket.addDeletionOverride('Properties.VersioningConfiguration.Status');
// use index (0 here) to address an element of a list
cfnBucket.addOverride('Properties.Tags.0.Value', 'NewValue');
cfnBucket.addDeletionOverride('Properties.Tags.0');
// addPropertyOverride is a convenience function for paths starting with "Properties."
cfnBucket.addPropertyOverride('VersioningConfiguration.Status', 'NewStatus');
cfnBucket.addPropertyDeletionOverride('VersioningConfiguration.Status');
cfnBucket.addPropertyOverride('Tags.0.Value', 'NewValue');
cfnBucket.addPropertyDeletionOverride('Tags.0');
- Python
-
# Get the CloudFormation resource
cfn_bucket = bucket.node.default_child
# Use dot notation to address inside the resource template fragment
cfn_bucket.add_override("Properties.VersioningConfiguration.Status", "NewStatus")
cfn_bucket.add_deletion_override("Properties.VersioningConfiguration.Status")
# use index (0 here) to address an element of a list
cfn_bucket.add_override("Properties.Tags.0.Value", "NewValue")
cfn_bucket.add_deletion_override("Properties.Tags.0")
# addPropertyOverride is a convenience function for paths starting with "Properties."
cfn_bucket.add_property_override("VersioningConfiguration.Status", "NewStatus")
cfn_bucket.add_property_deletion_override("VersioningConfiguration.Status")
cfn_bucket.add_property_override("Tags.0.Value", "NewValue")
cfn_bucket.add_property_deletion_override("Tags.0")
- Java
-
// Get the CloudFormation resource
CfnBucket cfnBucket = (CfnBucket)bucket.getNode().getDefaultChild();
// Use dot notation to address inside the resource template fragment
cfnBucket.addOverride("Properties.VersioningConfiguration.Status", "NewStatus");
cfnBucket.addDeletionOverride("Properties.VersioningConfiguration.Status");
// use index (0 here) to address an element of a list
cfnBucket.addOverride("Properties.Tags.0.Value", "NewValue");
cfnBucket.addDeletionOverride("Properties.Tags.0");
// addPropertyOverride is a convenience function for paths starting with "Properties."
cfnBucket.addPropertyOverride("VersioningConfiguration.Status", "NewStatus");
cfnBucket.addPropertyDeletionOverride("VersioningConfiguration.Status");
cfnBucket.addPropertyOverride("Tags.0.Value", "NewValue");
cfnBucket.addPropertyDeletionOverride("Tags.0");
- C#
-
// Get the CloudFormation resource
var cfnBucket = (CfnBucket)bucket.node.defaultChild;
// Use dot notation to address inside the resource template fragment
cfnBucket.AddOverride("Properties.VersioningConfiguration.Status", "NewStatus");
cfnBucket.AddDeletionOverride("Properties.VersioningConfiguration.Status");
// use index (0 here) to address an element of a list
cfnBucket.AddOverride("Properties.Tags.0.Value", "NewValue");
cfnBucket.AddDeletionOverride("Properties.Tags.0");
// addPropertyOverride is a convenience function for paths starting with "Properties."
cfnBucket.AddPropertyOverride("VersioningConfiguration.Status", "NewStatus");
cfnBucket.AddPropertyDeletionOverride("VersioningConfiguration.Status");
cfnBucket.AddPropertyOverride("Tags.0.Value", "NewValue");
cfnBucket.AddPropertyDeletionOverride("Tags.0");
Gunakan sumber daya khusus
Jika fitur tidak tersedia melalui AWS CloudFormation, tetapi hanya melalui API panggilan langsung, Anda harus menulis Sumber Daya AWS CloudFormation Kustom untuk melakukan API panggilan yang Anda butuhkan. Anda dapat menggunakan AWS CDK untuk menulis sumber daya khusus dan membungkusnya menjadi antarmuka konstruksi biasa. Dari perspektif konsumen konstruksi Anda, pengalaman itu akan terasa asli.
Membangun sumber daya khusus melibatkan penulisan fungsi Lambda yang merespons peristiwa sumber daya CREATE
UPDATE
, dan DELETE
siklus hidup. Jika sumber daya kustom Anda hanya perlu melakukan satu API panggilan, pertimbangkan untuk menggunakan AwsCustomResource. Ini memungkinkan untuk melakukan SDK panggilan sewenang-wenang selama AWS CloudFormation penerapan. Jika tidak, Anda harus menulis fungsi Lambda Anda sendiri untuk melakukan pekerjaan yang perlu Anda selesaikan.
Subjek terlalu luas untuk dibahas sepenuhnya di sini, tetapi tautan berikut akan membantu Anda memulai: