これは AWS CDK v2 デベロッパーガイドです。古い CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
ランタイムのコンテキスト
コンテキスト値は、アプリ、スタック、またはコンストラクトに関連付けることのできるキーと値のペアです。これらは、 ファイル (通常はプロジェクトディレクトリcdk.context.json
の cdk.json
または ) またはコマンドラインからアプリケーションに提供されます。
CDK Toolkit は、コンテキストを使用して、合成中に AWS アカウントから取得した値をキャッシュします。値には、アカウントのアベイラビリティーゾーン、または Amazon EC2 インスタンスで現在利用可能な Amazon マシンイメージ (AMI) IDs が含まれます。これらの値は AWS アカウントによって提供されるため、CDK アプリケーションの実行間で変更される可能性があります。これにより、意図しない変更の原因となる可能性があります。CDK Toolkit のキャッシュ動作は、新しい値を受け入れるまで、CDK アプリケーションのこれらの値を「フリーズ」します。
コンテキストキャッシュのない次のシナリオを想像してみてください。Amazon EC2 インスタンスの AMI として「最新の Amazon Linux」を指定し、この AMI の新しいバージョンがリリースされたとします。次に、次に CDK スタックをデプロイするときに、既にデプロイされているインスタンスが古い (「間違った」) AMI を使用しているため、アップグレードする必要があります。アップグレードすると、既存のすべてのインスタンスが新しいインスタンスに置き換えられ、予期しない望ましくない可能性があります。
代わりに、CDK はアカウントの使用可能な AMIs をプロジェクトの cdk.context.json
ファイルに記録し、保存された値を将来の合成オペレーションに使用します。これにより、AMIs のリストは変更の潜在的なソースではなくなります。また、スタックが常に同じ AWS CloudFormation テンプレートに合成されるようにすることもできます。
すべてのコンテキスト値が AWS 環境からキャッシュされるわけではありません。 機能フラグ はコンテキスト値でもあります。アプリケーションまたはコンストラクトで使用する独自のコンテキスト値を作成することもできます。
コンテキストキーは文字列です。値は、数値、文字列、配列、オブジェクトなど、JSON でサポートされている任意のタイプにすることができます。
ヒント
コンストラクトが独自のコンテキスト値を作成する場合は、ライブラリのパッケージ名をキーに組み込み、他のパッケージのコンテキスト値と競合しないようにします。
多くのコンテキスト値が特定の AWS 環境に関連付けられており、特定の CDK アプリを複数の環境にデプロイできます。このような値のキーには、異なる環境の値が競合しないように、 AWS アカウントとリージョンが含まれます。
次のコンテキストキーは、アカウントとリージョンを含む AWS CDK、 で使用される形式を示しています。
availability-zones:account=123456789012:region=eu-central-1
重要
キャッシュされたコンテキスト値は、書き込むことができるコンストラクトを含め、 AWS CDK とそのコンストラクトによって管理されます。ファイルを手動で編集して、キャッシュされたコンテキスト値を追加または変更しないでください。ただし、キャッシュされている値を確認するために、cdk.context.json
ときどき を確認すると便利です。キャッシュされた値を表さないコンテキスト値は、 のcontext
キーの下に保存する必要がありますcdk.json
。これにより、キャッシュされた値がクリアされたときにクリアされません。
コンテキスト値のソース
コンテキスト値は、次の 6 つの異なる方法で AWS CDK アプリに提供できます。
-
現在の AWS アカウントから自動的に。
-
cdk コマンドへの --contextオプションを使用します。(これらの値は常に文字列です。)
-
プロジェクトの
cdk.context.json
ファイル。 -
プロジェクトの
cdk.json
ファイルのcontext
キー。 -
~/.cdk.json
ファイルのcontext
キー。 -
construct.node.setContext()
メソッドを使用して AWS CDK アプリで。
プロジェクトファイルは、 AWS アカウントから取得したコンテキスト値を AWS CDK キャッシュする場所cdk.context.json
です。この方法により、新しいアベイラビリティーゾーンの導入など、デプロイに予期しない変更が加えられるのを回避できます。 AWS CDK は、リストされている他のファイルにはコンテキストデータを書き込みません。
重要
これらはアプリケーションの状態の一部cdk.json
であるため、アプリケーションの残りのソースコードとともにソース管理にコミットcdk.context.json
する必要があります。そうしないと、他の環境 (CI パイプラインなど) にデプロイすると、一貫性のない結果が得られる可能性があります。
コンテキスト値は、それらを作成したコンストラクトに限定されます。子コンストラクトには表示されますが、親や兄弟には表示されません。 AWS CDK Toolkit ( cdk コマンド) によって設定されたコンテキスト値は、自動的に、ファイルから、または --contextオプションから設定できます。これらのソースのコンテキスト値は、 App
コンストラクトに暗黙的に設定されます。したがって、アプリケーション内のすべてのスタックのすべてのコンストラクトに表示されます。
アプリケーションは、 construct.node.tryGetContext
メソッドを使用してコンテキスト値を読み取ることができます。リクエストされたエントリが現在のコンストラクトまたはその親のいずれにも見つからない場合、結果は ですundefined
。(または、None
Python など、言語と同等の結果が得られる可能性があります)。
context メソッド
は、 AWS CDK アプリケーションが環境から AWS コンテキスト情報を取得できるようにするいくつかのコンテキストメソッド AWS CDK をサポートしています。例えば、Stack.availabilityZones メソッドを使用して、特定の AWS アカウントとリージョンで使用できるアベイラビリティーゾーンのリストを取得できます。
コンテキストメソッドは次のとおりです。
- HostedZone.fromLookup
-
アカウントのホストゾーンを取得します。
- stack.availabilityZones
-
サポートされているアベイラビリティーゾーンを取得します。
- StringParameter.valueFromLookup
-
現在のリージョンの Amazon EC2 Systems Manager パラメータストアから値を取得します。
- Vpc.fromLookup
-
アカウント内の既存の Amazon Virtual Private Cloud を取得します。
- LookupMachineImage
-
Amazon Virtual Private Cloud の NAT インスタンスで使用するマシンイメージを検索します。
必要なコンテキスト値が使用できない場合、 AWS CDK アプリケーションはコンテキスト情報が欠落していることを CDK Toolkit に通知します。次に、 CLI は現在の AWS アカウントに情報をクエリし、結果のコンテキスト情報を cdk.context.json
ファイルに保存します。次に、コンテキスト値を使用して AWS CDK アプリケーションを再度実行します。
コンテキストの表示と管理
cdk context コマンドを使用して、 cdk.context.json
ファイル内の情報を表示および管理します。この情報を表示するには、オプションなしで cdk context コマンドを使用します。出力は次のようになります。
Context found in cdk.json: ┌───┬─────────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────┐ │ # │ Key │ Value │ ├───┼─────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤ │ 1 │ availability-zones:account=123456789012:region=eu-central-1 │ [ "eu-central-1a", "eu-central-1b", "eu-central-1c" ] │ ├───┼─────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤ │ 2 │ availability-zones:account=123456789012:region=eu-west-1 │ [ "eu-west-1a", "eu-west-1b", "eu-west-1c" ] │ └───┴─────────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────┘ Runcdk context --reset KEY_OR_NUMBER
to remove a context key. If it is a cached value, it will be refreshed on the nextcdk synth
.
コンテキスト値を削除するには、値に対応するキーまたは数値cdk context --resetを指定して を実行します。次の例では、前の例の 2 番目のキーに対応する値を削除します。この値は、欧州 (アイルランド) リージョンのアベイラビリティーゾーンのリストを表します。
cdk context --reset 2
Context value availability-zones:account=123456789012:region=eu-west-1 reset. It will be refreshed on the next SDK synthesis run.
したがって、Amazon Linux AMI の最新バージョンに更新する場合は、前の例を使用してコンテキスト値の制御された更新を行い、リセットします。次に、アプリを合成して再度デプロイします。
cdk synth
アプリケーションの保存されたコンテキスト値をすべてクリアするには、cdk context --clear次のように を実行します。
cdk context --clear
に保存されているコンテキスト値のみがリセットまたはクリアcdk.context.json
できます。 AWS CDK は他のコンテキスト値には影響しません。したがって、これらのコマンドを使用してコンテキスト値がリセットされないように保護するために、値を にコピーできますcdk.json
。
AWS CDK ツールキット--context
フラグ
合成またはデプロイ中にランタイムコンテキスト値を CDK アプリケーションに渡すには、 --context
(-c
略) オプションを使用します。
cdk synth --context key=value MyStack
複数のコンテキスト値を指定するには、--contextオプションを何度でも繰り返し、毎回 1 つのキーと値のペアを指定します。
cdk synth --context key1=value1 --context key2=value2 MyStack
複数のスタックを合成すると、指定されたコンテキスト値がすべてのスタックに渡されます。個々のスタックに異なるコンテキスト値を指定するには、値に異なるキーを使用するか、複数の cdk synth または cdk deploy コマンドを使用します。
コマンドラインから渡されるコンテキスト値は、常に文字列です。通常、値が他のタイプである場合は、コードを変換または解析する準備を整える必要があります。文字列以外のコンテキスト値が他の方法 ( など) で提供されている場合がありますcdk.context.json
。この種の値が期待どおりに動作することを確認するには、変換する前に値が文字列であることを確認します。
例
AWS CDK コンテキストを使用して既存の Amazon VPC を使用する例を次に示します。
cdk diff を使用して、コマンドラインでコンテキスト値を渡すことの効果を確認できます。
cdk diff -c vpcid=vpc-0cb9c31031d0d3e22
Stack ExistsvpcStack
Outputs
[+] Output publicsubnets publicsubnets: {"Value":"subnet-06e0ea7dd302d3e8f,subnet-01fc0acfb58f3128f"}
結果のコンテキスト値は、次に示すように表示できます。
cdk context -j
{ "vpc-provider:account=123456789012:filter.vpc-id=vpc-0cb9c31031d0d3e22:region=us-east-1": { "vpcId": "vpc-0cb9c31031d0d3e22", "availabilityZones": [ "us-east-1a", "us-east-1b" ], "privateSubnetIds": [ "subnet-03ecfc033225be285", "subnet-0cded5da53180ebfa" ], "privateSubnetNames": [ "Private" ], "privateSubnetRouteTableIds": [ "rtb-0e955393ced0ada04", "rtb-05602e7b9f310e5b0" ], "publicSubnetIds": [ "subnet-06e0ea7dd302d3e8f", "subnet-01fc0acfb58f3128f" ], "publicSubnetNames": [ "Public" ], "publicSubnetRouteTableIds": [ "rtb-00d1fdfd823c82289", "rtb-04bb1969b42969bcb" ] } }