側面 - AWS Cloud Development Kit (AWS CDK) v2

これは AWS CDK v2 デベロッパーガイドです。古い CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

側面

アスペクトは、特定のスコープ内のすべてのコンストラクトにオペレーションを適用する方法です。側面は、タグを追加するなどしてコンストラクトを変更できます。または、すべてのバケットが暗号化されていることを確認するなど、コンストラクトの状態について何かを検証することもできます。

同じスコープ内のコンストラクトとすべてのコンストラクトにアスペクトを適用するには、次の例に示すように、新しいアスペクトAspects.of(SCOPE).add()で を呼び出します。

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 は の側面を使用してリソース にタグを付けますが、フレームワークは他の目的にも使用できます。例えば、これを使用して、上位レベルのコンストラクトによって定義された AWS CloudFormation リソースを検証または変更できます。

アスペクトの詳細

アスペクトは訪問者パターン を採用します。アスペクトとは、次のインターフェイスを実装するクラスです。

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

JavaScript には言語機能としてインターフェイスはありません。したがって、アスペクトとは、操作対象のノードを受け入れるvisitメソッドを持つクラスのインスタンスのことです。

Python

Python には言語機能としてインターフェイスはありません。したがって、アスペクトとは、運用するノードを受け入れるvisitメソッドを持つクラスのインスタンスにすぎません。

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

を呼び出すとAspects.of(SCOPE).add(...)、コンストラクトは アスペクトの内部リストに アスペクトを追加します。リストは で取得できますAspects.of(SCOPE)

準備フェーズ 中に、 はコンストラクトとその子それぞれについて、 オブジェクトの visitメソッドを上位の順序で AWS CDK 呼び出します。

visit メソッドは、コンストラクト内の任意の内容を自由に変更できます。厳密に型指定された言語で、コンストラクト固有のプロパティやメソッドにアクセスする前に、受信したコンストラクトをより具体的なタイプにキャストします。

は定義後に自己完結型でイミュータブルであるため、アスペクトStagesStageコンストラクトの境界を越えて伝播されません。内のStageコンストラクトにアクセスする場合は、コンストラクト自体 (またはそれ以下) に側面を適用しますStage

次の例では、スタックで作成されたすべてのバケットでバージョニングが有効になっていることを確認します。アスペクトは、検証に失敗したコンストラクトにエラーアノテーションを追加します。これにより、synthオペレーションが失敗し、結果のクラウドアセンブリがデプロイされなくなります。

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