Aspek dan AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

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.

Aspek dan AWS CDK

Aspek adalah cara untuk menerapkan operasi ke semua konstruksi dalam lingkup tertentu. Aspek dapat memodifikasi konstruksi, seperti dengan menambahkan tag. Atau bisa memverifikasi sesuatu tentang status konstruksi, seperti memastikan bahwa semua ember dienkripsi.

Untuk menerapkan aspek ke konstruksi dan semua konstruksi dalam lingkup yang sama, panggil Aspects.of(SCOPE).add()dengan aspek baru, seperti yang ditunjukkan pada contoh berikut.

TypeScript
Aspects.of(myConstruct).add(new SomeAspect(...));
JavaScript
Aspects.of(myConstruct).add(new SomeAspect(...));
Python
Aspects.of(my_construct).add(SomeAspect(...))
Java
Aspects.of(myConstruct).add(new SomeAspect(...));
C#
Aspects.Of(myConstruct).add(new SomeAspect(...));
Go
awscdk.Aspects_Of(stack).Add(awscdk.NewTag(...))

AWS CDK Menggunakan aspek untuk menandai sumber daya, tetapi kerangka kerja juga dapat digunakan untuk tujuan lain. Misalnya, Anda dapat menggunakannya untuk memvalidasi atau mengubah AWS CloudFormation sumber daya yang ditentukan untuk Anda oleh konstruksi tingkat yang lebih tinggi.

Aspek secara detail

Aspek menggunakan pola pengunjung. Aspek adalah kelas yang mengimplementasikan antarmuka berikut.

TypeScript
interface IAspect { visit(node: IConstruct): void;}
JavaScript

JavaScript tidak memiliki antarmuka sebagai fitur bahasa. Oleh karena itu, sebuah aspek hanyalah sebuah instance dari kelas yang memiliki visit metode yang menerima node yang akan dioperasikan.

Python

Python tidak memiliki antarmuka sebagai fitur bahasa. Oleh karena itu, sebuah aspek hanyalah sebuah instance dari kelas yang memiliki visit metode yang menerima node yang akan dioperasikan.

Java
public interface IAspect { public void visit(Construct node); }
C#
public interface IAspect { void Visit(IConstruct node); }
Go
type IAspect interface { Visit(node constructs.IConstruct) }

Saat Anda meneleponAspects.of(SCOPE).add(...), konstruksi menambahkan aspek ke daftar aspek internal. Anda dapat memperoleh daftar denganAspects.of(SCOPE).

Selama fase persiapan, AWS CDK panggilan visit metode objek untuk konstruksi dan masing-masing anaknya dalam urutan top-down.

visitMetode ini bebas untuk mengubah apa pun dalam konstruksi. Dalam bahasa yang diketik dengan kuat, lemparkan konstruksi yang diterima ke tipe yang lebih spesifik sebelum mengakses properti atau metode khusus konstruksi.

Aspek tidak menyebar melintasi batas-batas Stage konstruksi, karena mandiri dan Stages tidak dapat diubah setelah definisi. Terapkan aspek pada Stage konstruksi itu sendiri (atau lebih rendah) jika Anda ingin mereka mengunjungi konstruksi di dalam. Stage

Contoh

Contoh berikut memvalidasi bahwa semua bucket yang dibuat di tumpukan mengaktifkan versi. Aspek menambahkan anotasi kesalahan ke konstruksi yang gagal validasi. Hal ini mengakibatkan synth operasi gagal dan mencegah penerapan rakitan cloud yang dihasilkan.

TypeScript
class BucketVersioningChecker implements IAspect { public visit(node: IConstruct): void { // See that we're dealing with a CfnBucket if (node instanceof s3.CfnBucket) { // Check for versioning property, exclude the case where the property // can be a token (IResolvable). if (!node.versioningConfiguration || (!Tokenization.isResolvable(node.versioningConfiguration) && node.versioningConfiguration.status !== 'Enabled')) { Annotations.of(node).addError('Bucket versioning is not enabled'); } } } } // Later, apply to the stack Aspects.of(stack).add(new BucketVersioningChecker());
JavaScript
class BucketVersioningChecker { visit(node) { // See that we're dealing with a CfnBucket if ( node instanceof s3.CfnBucket) { // Check for versioning property, exclude the case where the property // can be a token (IResolvable). if (!node.versioningConfiguration || !Tokenization.isResolvable(node.versioningConfiguration) && node.versioningConfiguration.status !== 'Enabled')) { Annotations.of(node).addError('Bucket versioning is not enabled'); } } } } // Later, apply to the stack Aspects.of(stack).add(new BucketVersioningChecker());
Python
@jsii.implements(cdk.IAspect) class BucketVersioningChecker: def visit(self, node): # See that we're dealing with a CfnBucket if isinstance(node, s3.CfnBucket): # Check for versioning property, exclude the case where the property # can be a token (IResolvable). if (not node.versioning_configuration or not Tokenization.is_resolvable(node.versioning_configuration) and node.versioning_configuration.status != "Enabled"): Annotations.of(node).add_error('Bucket versioning is not enabled') # Later, apply to the stack Aspects.of(stack).add(BucketVersioningChecker())
Java
public class BucketVersioningChecker implements IAspect { @Override public void visit(Construct node) { // See that we're dealing with a CfnBucket if (node instanceof CfnBucket) { CfnBucket bucket = (CfnBucket)node; Object versioningConfiguration = bucket.getVersioningConfiguration(); if (versioningConfiguration == null || !Tokenization.isResolvable(versioningConfiguration.toString()) && !versioningConfiguration.toString().contains("Enabled")) Annotations.of(bucket.getNode()).addError("Bucket versioning is not enabled"); } } } // Later, apply to the stack Aspects.of(stack).add(new BucketVersioningChecker());
C#
class BucketVersioningChecker : Amazon.Jsii.Runtime.Deputy.DeputyBase, IAspect { public void Visit(IConstruct node) { // See that we're dealing with a CfnBucket if (node is CfnBucket) { var bucket = (CfnBucket)node; if (bucket.VersioningConfiguration is null || !Tokenization.IsResolvable(bucket.VersioningConfiguration) && !bucket.VersioningConfiguration.ToString().Contains("Enabled")) Annotations.Of(bucket.Node).AddError("Bucket versioning is not enabled"); } } } // Later, apply to the stack Aspects.Of(stack).add(new BucketVersioningChecker());