Menyesuaikan konstruksi dari Construct Library AWS - AWS Cloud Development Kit (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.

Menyesuaikan konstruksi dari Construct Library AWS

Sesuaikan konstruksi dari AWS Construct Library melalui escape hatch, raw override, dan custom resource.

Menggunakan 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. Melarikan diri memungkinkan Anda melarikan diri 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 menyediakan API bersih untuk 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 tim CDK, 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, 'MyBucket', { analyticsConfigurations: [ { id: 'Config', // ... } ] });
JavaScript
new s3.CfnBucket(this, 'MyBucket', { analyticsConfigurations: [ { id: 'Config' // ... } ] });
Python
s3.CfnBucket(self, "MyBucket", analytics_configurations: [ dict(id="Config", # ... ) ] )
Java
CfnBucket.Builder.create(this, "MyBucket") .analyticsConfigurations(Arrays.asList(java.util.Map.of( // Java 9 or later "id", "Config", // ... ))).build();
C#
new CfnBucket(this, 'MyBucket', 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, 'MyBucket', { type: 'AWS::S3::Bucket', properties: { // Note the PascalCase here! These are CloudFormation identifiers. AnalyticsConfigurations: [ { Id: 'Config', // ... } ] } });
JavaScript
new cdk.CfnResource(this, 'MyBucket', { type: 'AWS::S3::Bucket', properties: { // Note the PascalCase here! These are CloudFormation identifiers. AnalyticsConfigurations: [ { Id: 'Config' // ... } ] } });
Python
cdk.CfnResource(self, 'MyBucket', type="AWS::S3::Bucket", properties=dict( # Note the PascalCase here! These are CloudFormation identifiers. "AnalyticsConfigurations": [ { "Id": "Config", # ... } ] } )
Java
CfnResource.Builder.create(this, "MyBucket") .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, "MyBucket", 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.defaultChildPython: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" };

Palka yang tidak bisa melarikan diri

Ini AWS CDK juga menyediakan kemampuan untuk naik level abstraksi, yang mungkin kita sebut sebagai palka “un-escape”. Jika Anda memiliki konstruksi L1, sepertiCfnBucket, Anda dapat membuat konstruksi L2 baru (Bucketdalam 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 dibuat dari konstruksi L1 adalah objek proxy yang merujuk ke sumber daya L1, mirip dengan yang dibuat dari nama sumber daya, ARN, atau pencarian. 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.

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

Sumber daya khusus

Jika fitur tidak tersedia melalui AWS CloudFormation, tetapi hanya melalui panggilan API langsung, Anda harus menulis Sumber Daya AWS CloudFormation Kustom untuk membuat panggilan API 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 akan terasa asli.

Membangun sumber daya khusus melibatkan penulisan fungsi Lambda yang merespons peristiwa sumber daya CREATEUPDATE, dan DELETE siklus hidup. Jika sumber daya kustom Anda hanya perlu melakukan satu panggilan API, pertimbangkan untuk menggunakan AwsCustomResource. Hal ini memungkinkan untuk melakukan panggilan SDK arbitrer selama penerapan. AWS CloudFormation 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: