レイヤー 1 コンストラクト
L1 コンストラクトは AWS CDK の構成要素であり、Cfn というプレフィックスが付くため、他のコンストラクトと簡単に区別できます。例えば、AWS CDK の Amazon DynamoDB パッケージには、L2 コンストラクトである Table コンストラクトが含まれています。対応する L1 コンストラクトを CfnTable と呼び、これによって、CloudFormation DynamoDB Table を直接表します。通常、AWS CDK アプリケーションで L1 コンストラクトを直接使用することはありませんが、この最初のレイヤーにアクセスせずに AWS CDK を使用することは不可能です。ただし、ほとんどの場合、開発者が使い慣れている L2 および L3 コンストラクトは、L1 コンストラクトに大きく依存しているため、L1 コンストラクトは CloudFormation と AWS CDK 間の橋渡しをするものと考えると良いでしょう。
AWS CDK は、標準のコーディング言語を使用して CloudFormation テンプレートを生成することに特化しています。つまり、cdk synth CLI コマンドを実行し、CloudFormation テンプレートが生成されると、AWS CDK は仕事を終えます。利便性に配慮して cdk deploy コマンドが用意されていますが、これを実行すると、その処理は CloudFormation 内ですべて実行されます。CloudFormation で理解可能な形式に AWS CDK コードを変換する際に重要な役割を果たすのが、L1 コンストラクトなのです。
AWS CDK と CloudFormation 間における、L1 コンストラクトのライフサイクル
L1 コンストラクトを作成して使用するプロセスは、以下のステップで構成されます。
-
AWS CDK のビルドプロセスにより、CloudFormation の仕様が L1 コンストラクトの形式でプログラムコードに変換されます。
-
開発者が、AWS CDK アプリケーションの一部として L1 コンストラクトを直接または間接的に参照するコードを記述します。
-
開発者が、cdk synth コマンドを実行して、プログラムコードを CloudFormation 仕様 (テンプレート) で指定された形式に変換します。
-
開発者が、cdk deploy コマンドを実行して、こうしたテンプレート内の CloudFormation スタックを AWS アカウント環境にデプロイします。
簡単な演習を行いましょう。GitHub の AWS CDK オープンソースリポジトリpackages、aws-cdk-lib、aws-<servicename>、lib)。この例では Amazon S3 を選択しますが、どのサービスを使用しても動作します。そのパッケージのメイン index.ts ファイル
export * from './s3.generated';
ただし、対応するディレクトリのどこにも、s3.generated ファイルはありません。なぜなら、L1 コンストラクトは、AWS CDK ビルドプロセス中に CloudFormation リソース仕様に基づいて自動生成されるからです。そのため、対象のパッケージに AWS CDK ビルドコマンドを実行した後にのみ、パッケージ内に s3.generated が存在することになります。
AWS CloudFormation リソース仕様
AWS CloudFormation リソース仕様は、AWS の Infrastructure as Code (IAC) を定義するとともに、この仕様によって、CloudFormation テンプレート内のコードをどのように AWS アカウントのリソースに変換するかを決定するものです。この仕様には、リージョンごとのレベルで、JSON 形式provider::service::resource の形式に従い、一意のリソースタイプ名が付与されます。例えば、Amazon S3 バケットのリソースタイプには AWS::S3::Bucket という名前付き、Amazon S3 アクセスポイントのリソースタイプには AWS::S3::AccessPoint という名前が付きます。こうしたリソースタイプは、AWS CloudFormation リソース仕様で定義されている構文を使用して CloudFormation テンプレート内にレンダリングすることもできます。AWS CDK ビルドプロセスを実行すると、各リソースタイプも L1 コンストラクトに変換されます。
したがって、各 L1 コンストラクトは、対応する CloudFormation リソースがプログラムによってそのまま反映されたものです。CloudFormation テンプレートに適用するどのプロパティも、L1 コンストラクトのインスタンス化に使用でき、対応する L1 コンストラクトをインスタンス化する際にも、必要なすべての CloudFormation プロパティを引数に指定しなければなりません。次の表は、CloudFormation テンプレートに表された S3 バケットと、AWS CDK L1 コンストラクトとして定義した同じ S3 バケットを比較したものです。
CloudFormation テンプレート |
L1 コンストラクト |
|---|---|
|
|
ご覧のとおり、L1 コンストラクトは、CloudFormation リソースのコードを正確に示すマニフェストであり、ショートカットや単純化が行われないため、記述が必要なボイラープレートテキストの量はほぼ同じです。ただし、AWS CDK を使用する大きな利点の 1 つは、こうした CloudFormation 構文ボイラープレートの多くを排除しやすくなることです。これを可能にするために、有用なのが、L2 コンストラクトです。