これは v2 AWS CDK デベロッパーガイドです。旧版の CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
エスケープハッチ、raw オーバーライド、カスタムリソースを使用して、 AWS コンストラクトライブラリからコンストラクトをカスタマイズします。
エスケープハッチを使用する
AWS コンストラクトライブラリは、さまざまなレベルの抽象化のコンストラクトを提供します。
最も高いレベルでは、 AWS CDK アプリケーションとその中のスタックは、それ自体がクラウドインフラストラクチャ全体の抽象化、またはそのかなりのチャンクです。これらは、さまざまな環境やニーズに合わせてデプロイできるようにパラメータ化できます。
抽象化は、クラウドアプリケーションを設計および実装するための強力なツールです。 AWS CDK は、抽象化を使用して構築するだけでなく、新しい抽象化を作成する権限も提供します。既存のオープンソースの L2 および L3 コンストラクトをガイダンスとしながら、組織のベストプラクティスや意見を反映させた独自の L2 および L3 コンストラクトを構築することができます。
完璧な抽象化というものは存在せず、優れた抽象化であってもあらゆるユースケースを網羅できるわけではありません。開発中に、ニーズにほぼ適合するコンストラクトが見つかる場合もありますが、大なり小なりカスタマイズが必要になります。
このため、 AWS CDK にはコンストラクトモデルから抜け出す方法が用意されています。これには、下位レベルの抽象化への移行や、まったく異なるモデルへの移行が含まれます。エスケープハッチを使用すると、 AWS CDK パラダイムをエスケープし、ニーズに合わせてカスタマイズできます。その後、変更を新しいコンストラクトでラップすることで、基盤となる複雑さを抽象化し、他の開発者にクリーンな API を提供できます。
以下は、エスケープハッチを使用できる状況の例です。
-
AWS サービス機能は を通じて利用できますが AWS CloudFormation、L2 コンストラクトはありません。
-
AWS サービス機能は を通じて利用でき AWS CloudFormation、サービスの L2 コンストラクトがありますが、これらはまだ機能を公開していません。L2 コンストラクトは CDK チームによってキュレーションされるため、新機能をすぐに利用できない場合があります。
-
この機能は、 AWS CloudFormation を通じてはまだ利用できません。
機能が利用可能かどうかを判断するには AWS CloudFormation、AWS 「リソースタイプとプロパティタイプのリファレンス」を参照してください。
L1 コンストラクトのエスケープハッチを開発する
L2 コンストラクトがサービスで利用できない場合は、自動的に生成された L1 コンストラクトを使用できます。これらのリソースは、CfnBucket
や CfnRole
など、Cfn
で始まる名前で識別できます。同等の AWS CloudFormation リソースを使用するのとまったく同じようにインスタンス化します。
たとえば、分析を有効にして低レベルの Amazon S3 バケット L1 をインスタンス化するには、以下のようなものを記述します。
new s3.CfnBucket(this, 'amzn-s3-demo-bucket', {
analyticsConfigurations: [
{
id: 'Config',
// ...
}
]
});
対応する CfnXxx
クラスを持たないリソースを定義したい場合がまれにあるかもしれません。これは、リソース仕様でまだ公開されていない新しい AWS CloudFormation リソースタイプである可能性があります。このような場合は、cdk.CfnResource
を直接インスタンス化し、リソースタイプとプロパティを指定します。以下の例ではこれを示しています。
new cdk.CfnResource(this, 'amzn-s3-demo-bucket', {
type: 'AWS::S3::Bucket',
properties: {
// Note the PascalCase here! These are CloudFormation identifiers.
AnalyticsConfigurations: [
{
Id: 'Config',
// ...
}
]
}
});
L2 コンストラクトのエスケープハッチを開発する
L2 コンストラクトに機能がない場合や、問題を回避しようとしている場合は、L2 コンストラクト内にカプセル化されている L1 コンストラクトを変更できます。
すべての L2 コンストラクトは、対応する L1 コンストラクトを内包しています。たとえば、高レベルの Bucket
コンストラクトは、低レベルの CfnBucket
コンストラクトをラップしています。は AWS CloudFormation リソースに直接CfnBucket
対応するため、 で利用できるすべての機能が公開されます AWS CloudFormation。
L1 コンストラクトにアクセスするための基本的なアプローチは、construct.node.defaultChild
(Python: default_child
) を使用し、(必要に応じて) 適切な型にそれをキャストし、そのプロパティを変更することです。ここでも、Bucket
の例を見てみましょう。
// Get the CloudFormation resource
const cfnBucket = bucket.node.defaultChild as s3.CfnBucket;
// Change its properties
cfnBucket.analyticsConfiguration = [
{
id: 'Config',
// ...
}
];
このオブジェクトを使用して、 Metadata
や などの AWS CloudFormation オプションを変更することもできますUpdatePolicy
。
cfnBucket.cfnOptions.metadata = {
MetadataKey: 'MetadataValue'
};
アンエスケープハッチを使用する
には、抽象化レベルを上げる機能 AWS CDK も用意されています。抽象化レベルは「エスケープ解除」ハッチと呼びます。CfnBucket
などの L1 コンストラクトがある場合は、新しい L2 コンストラクト (この場合は Bucket
) を作成して、L1 コンストラクトをラップできます。
これは、L1 リソースを作成しつつ、L2 リソースを必要とするコンストラクトで使用する場合に便利です。また、L1 コンストラクトでは利用できない .grantXxxxx()
のような便利なメソッドを使用したい場合にも役立ちます。
より抽象度の高いレベルへの移行は、.fromCfnXxxxx()
と呼ばれる L2 クラスの静的メソッドを使用します。たとえば Amazon S3 バケットの場合は、Bucket.fromCfnBucket()
を使用します。L1 リソースが唯一のパラメータです。
b1 = new s3.CfnBucket(this, "buck09", { ... });
b2 = s3.Bucket.fromCfnBucket(b1);
L1 コンストラクトから作成された L2 コンストラクトは、リソース名、ARNs、またはルックアップから作成されたものと同様に、L1 リソースを参照するプロキシオブジェクトです。これらのコンストラクトを変更しても、最終的に合成される AWS CloudFormation テンプレートには影響しません (ただし、L1 リソースがあるため、代わりにそれを変更することはできます)。プロキシオブジェクトの詳細については、「AWS アカウントのリソースの参照」を参照してください。
混乱を避けるため、同じ L1 コンストラクトを参照する複数の L2 コンストラクトを作成しないでください。たとえば、前のセクションの手法を使用して Bucket
から CfnBucket
を抽出する場合、その CfnBucket
で Bucket.fromCfnBucket()
を呼び出すことで 2 番目の Bucket
インスタンスを作成することは避けてください。実際には期待どおりに機能しますが (合成される AWS::S3::Bucket
は 1 つだけです)、コードの保守が難しくなります。
raw オーバーライドを使用する
L1 コンストラクトに欠落しているプロパティがある場合は、raw オーバーライドを使用してすべてのタイピングをバイパスできます。これにより、合成されたプロパティを削除することもできます。
以下の例に示すように、いずれかの addOverride
メソッド (Python: add_override
) を使用します。
// 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');
カスタムリソースを使用する
この機能を使用できない場合 AWS CloudFormation、直接 API コールを通じてのみ、必要な API コールを行うために AWS CloudFormation カスタムリソースを記述する必要があります。を使用してカスタムリソース AWS CDK を記述し、通常のコンストラクトインターフェイスにラップできます。コンストラクトの利用者の観点から見ると、エクスペリエンスはネイティブに感じられます。
カスタムリソースを構築するには、リソースの CREATE
、UPDATE
、DELETE
ライフサイクルイベントに応答する Lambda 関数を書き込む必要があります。カスタムリソースが API を呼び出せるのが 1 回だけである場合には、AwsCustomResource
テーマが広すぎてここで完全にカバーすることはできませんが、以下のリンクから初めてみてください。
-
より完全な例については、CDK 標準ライブラリの「DnsValidatedCertificate」
クラスを参照してください。これはカスタムリソースとして実装されます。