これは 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
メソッドは、コンストラクト内の任意の内容を自由に変更できます。厳密に型指定された言語で、コンストラクト固有のプロパティやメソッドにアクセスする前に、受信したコンストラクトをより具体的なタイプにキャストします。
は定義後に自己完結型でイミュータブルであるため、アスペクトStages
はStage
コンストラクトの境界を越えて伝播されません。内の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());