環境 - AWS Cloud Development Kit (AWS CDK) v2

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

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

環境

環境はターゲット AWS アカウント であり、スタック AWS リージョン がデプロイされます。CDK アプリのすべてのスタックは、環境 () に明示的または暗黙的に関連付けられていますenv

環境の設定

本稼働スタックの場合は、 envプロパティを使用して、アプリケーション内の各スタックの環境を明示的に指定することをお勧めします。次の例では、2 つの異なるスタックに異なる環境を指定します。

TypeScript
const envEU = { account: '2383838383', region: 'eu-west-1' }; const envUSA = { account: '8373873873', region: 'us-west-2' }; new MyFirstStack(app, 'first-stack-us', { env: envUSA }); new MyFirstStack(app, 'first-stack-eu', { env: envEU });
JavaScript
const envEU = { account: '2383838383', region: 'eu-west-1' }; const envUSA = { account: '8373873873', region: 'us-west-2' }; new MyFirstStack(app, 'first-stack-us', { env: envUSA }); new MyFirstStack(app, 'first-stack-eu', { env: envEU });
Python
env_EU = cdk.Environment(account="8373873873", region="eu-west-1") env_USA = cdk.Environment(account="2383838383", region="us-west-2") MyFirstStack(app, "first-stack-us", env=env_USA) MyFirstStack(app, "first-stack-eu", env=env_EU)
Java
public class MyApp { // Helper method to build an environment static Environment makeEnv(String account, String region) { return Environment.builder() .account(account) .region(region) .build(); } public static void main(final String argv[]) { App app = new App(); Environment envEU = makeEnv("8373873873", "eu-west-1"); Environment envUSA = makeEnv("2383838383", "us-west-2"); new MyFirstStack(app, "first-stack-us", StackProps.builder() .env(envUSA).build()); new MyFirstStack(app, "first-stack-eu", StackProps.builder() .env(envEU).build()); app.synth(); } }
C#
Amazon.CDK.Environment makeEnv(string account, string region) { return new Amazon.CDK.Environment { Account = account, Region = region }; } var envEU = makeEnv(account: "8373873873", region: "eu-west-1"); var envUSA = makeEnv(account: "2383838383", region: "us-west-2"); new MyFirstStack(app, "first-stack-us", new StackProps { Env=envUSA }); new MyFirstStack(app, "first-stack-eu", new StackProps { Env=envEU });

前の例に示すように、ターゲットアカウントとリージョンをハードコーディングすると、スタックは常にその特定のアカウントとリージョンにデプロイされます。スタックを別のターゲットにデプロイ可能にするために、合成時にターゲットを決定するために、スタックは AWS CDK CLI が提供する 2 つの環境変数 CDK_DEFAULT_ACCOUNTおよび を使用できますCDK_DEFAULT_REGION。これらの変数は、 AWS --profileオプションを使用して指定されたプロファイル、または指定しない場合はデフォルトの AWS プロファイルに基づいて設定されます。

次のコードフラグメントは、 スタックの AWS CDK CLI から渡されたアカウントとリージョンにアクセスする方法を示しています。

TypeScript

Node の process オブジェクト経由で環境変数にアクセスします。

注記

process で使用するには、 DefinitelyTypedモジュールが必要です TypeScript。 はこのモジュールcdk initをインストールします。ただし、追加前に作成されたプロジェクトを使用している場合、または を使用してプロジェクトを設定していない場合は、このモジュールを手動でインストールする必要がありますcdk init

npm install @types/node
new MyDevStack(app, 'dev', { env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }});
JavaScript

Node の process オブジェクト経由で環境変数にアクセスします。

new MyDevStack(app, 'dev', { env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }});
Python

os モジュールのenvironディクショナリを使用して環境変数にアクセスします。

import os MyDevStack(app, "dev", env=cdk.Environment( account=os.environ["CDK_DEFAULT_ACCOUNT"], region=os.environ["CDK_DEFAULT_REGION"]))
Java

System.getenv() を使用して、環境変数の値を取得します。

public class MyApp { // Helper method to build an environment static Environment makeEnv(String account, String region) { account = (account == null) ? System.getenv("CDK_DEFAULT_ACCOUNT") : account; region = (region == null) ? System.getenv("CDK_DEFAULT_REGION") : region; return Environment.builder() .account(account) .region(region) .build(); } public static void main(final String argv[]) { App app = new App(); Environment envEU = makeEnv(null, null); Environment envUSA = makeEnv(null, null); new MyDevStack(app, "first-stack-us", StackProps.builder() .env(envUSA).build()); new MyDevStack(app, "first-stack-eu", StackProps.builder() .env(envEU).build()); app.synth(); } }
C#

System.Environment.GetEnvironmentVariable() を使用して、環境変数の値を取得します。

Amazon.CDK.Environment makeEnv(string account=null, string region=null) { return new Amazon.CDK.Environment { Account = account ?? System.Environment.GetEnvironmentVariable("CDK_DEFAULT_ACCOUNT"), Region = region ?? System.Environment.GetEnvironmentVariable("CDK_DEFAULT_REGION") }; } new MyDevStack(app, "dev", new StackProps { Env = makeEnv() });

リージョンコード AWS リージョン を使用して を指定します。リストについては、「リージョンエンドポイント」を参照してください。

は、envプロパティをまったく指定しないことと、 CDK_DEFAULT_ACCOUNTと を使用してプロパティを指定することを AWS CDK 区別しますCDK_DEFAULT_REGION。前者は、スタックが環境に依存しないテンプレートを合成する必要があることを意味します。このようなスタックで定義されているコンストラクトは、その環境に関する情報を使用できません。例えば、 のようなコードを記述if (stack.region === 'us-east-1')したり、 AWS アカウントをクエリする必要がある Vpc.fromLookup (Python: from_lookup) のようなフレームワーク機能を使用したりすることはできません。これらの機能は、明示的な環境を指定するまで機能しません。それらを使用するには、 を指定する必要がありますenv

CDK_DEFAULT_ACCOUNT と を使用して環境を渡すとCDK_DEFAULT_REGION、スタックは合成時に AWS CDK CLI によって決定されたアカウントとリージョンにデプロイされます。これにより、環境に依存するコードが機能しますが、合成されたテンプレートは、合成されたマシン、ユーザー、またはセッションによって異なる可能性もあります。この動作は、多くの場合、開発中に許容できる、または望ましいことですが、本番稼働用のアンチパターンである可能性もあります。

ただしenv、任意の有効な式を使用して を設定できます。例えば、合成時にアカウントとリージョンを上書きできるように、2 つの追加の環境変数をサポートするようにスタックを記述できます。これらを CDK_DEPLOY_ACCOUNTCDK_DEPLOY_REGION呼びますが、 で設定されていないため、任意の名前を付けることができます AWS CDK。次のスタックの環境では、設定されている場合は代替の環境変数が使用されます。設定されていない場合は、 が提供するデフォルトの環境にフォールバックします AWS CDK。

TypeScript
new MyDevStack(app, 'dev', { env: { account: process.env.CDK_DEPLOY_ACCOUNT || process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEPLOY_REGION || process.env.CDK_DEFAULT_REGION }});
JavaScript
new MyDevStack(app, 'dev', { env: { account: process.env.CDK_DEPLOY_ACCOUNT || process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEPLOY_REGION || process.env.CDK_DEFAULT_REGION }});
Python
MyDevStack(app, "dev", env=cdk.Environment( account=os.environ.get("CDK_DEPLOY_ACCOUNT", os.environ["CDK_DEFAULT_ACCOUNT"]), region=os.environ.get("CDK_DEPLOY_REGION", os.environ["CDK_DEFAULT_REGION"])
Java
public class MyApp { // Helper method to build an environment static Environment makeEnv(String account, String region) { account = (account == null) ? System.getenv("CDK_DEPLOY_ACCOUNT") : account; region = (region == null) ? System.getenv("CDK_DEPLOY_REGION") : region; account = (account == null) ? System.getenv("CDK_DEFAULT_ACCOUNT") : account; region = (region == null) ? System.getenv("CDK_DEFAULT_REGION") : region; return Environment.builder() .account(account) .region(region) .build(); } public static void main(final String argv[]) { App app = new App(); Environment envEU = makeEnv(null, null); Environment envUSA = makeEnv(null, null); new MyDevStack(app, "first-stack-us", StackProps.builder() .env(envUSA).build()); new MyDevStack(app, "first-stack-eu", StackProps.builder() .env(envEU).build()); app.synth(); } }
C#
Amazon.CDK.Environment makeEnv(string account=null, string region=null) { return new Amazon.CDK.Environment { Account = account ?? System.Environment.GetEnvironmentVariable("CDK_DEPLOY_ACCOUNT") ?? System.Environment.GetEnvironmentVariable("CDK_DEFAULT_ACCOUNT"), Region = region ?? System.Environment.GetEnvironmentVariable("CDK_DEPLOY_REGION") ?? System.Environment.GetEnvironmentVariable("CDK_DEFAULT_REGION") }; } new MyDevStack(app, "dev", new StackProps { Env = makeEnv() });

スタックの環境をこのように宣言すると、次のような短いスクリプトまたはバッチファイルを記述して、コマンドライン引数から変数を設定してから を呼び出すことができますcdk deploy。最初の 2 つを超える引数は に渡cdk deployされ、コマンドラインオプションまたはスタックを指定するために使用できます。

macOS/Linux
#!/usr/bin/env bash if [[ $# -ge 2 ]]; then export CDK_DEPLOY_ACCOUNT=$1 export CDK_DEPLOY_REGION=$2 shift; shift npx cdk deploy "$@" exit $? else echo 1>&2 "Provide account and region as first two args." echo 1>&2 "Additional args are passed through to cdk deploy." exit 1 fi

スクリプトを として保存しcdk-deploy-to.shchmod +x cdk-deploy-to.shを実行して実行できるようにします。

Windows
@findstr /B /V @ %~dpnx0 > %~dpn0.ps1 && powershell -ExecutionPolicy Bypass %~dpn0.ps1 %* @exit /B %ERRORLEVEL% if ($args.length -ge 2) { $env:CDK_DEPLOY_ACCOUNT, $args = $args $env:CDK_DEPLOY_REGION, $args = $args npx cdk deploy $args exit $lastExitCode } else { [console]::error.writeline("Provide account and region as first two args.") [console]::error.writeline("Additional args are passed through to cdk deploy.") exit 1 }

スクリプトの Windows バージョンは、 を使用して PowerShell macOS /Linux バージョンと同じ機能を提供します。また、コマンドラインから簡単に呼び出せるように、バッチファイルとして実行できるようにする手順も含まれています。として保存する必要がありますcdk-deploy-to.bat。ファイルはcdk-deploy-to.ps1、バッチファイルが呼び出されたときに作成されます。

その後、「deploy-to」スクリプトを呼び出す追加のスクリプトを作成して、特定の環境にデプロイできます (スクリプトごとに複数の環境でも)。

macOS/Linux
#!/usr/bin/env bash # cdk-deploy-to-test.sh ./cdk-deploy-to.sh 123457689 us-east-1 "$@"
Windows
@echo off rem cdk-deploy-to-test.bat cdk-deploy-to 135792469 us-east-1 %*

複数の環境にデプロイする場合は、デプロイが失敗した後も他の環境にデプロイを継続するかどうかを検討してください。次の例では、最初の本番環境が成功しなかった場合に 2 番目の本番環境へのデプロイを回避します。

macOS/Linux
#!/usr/bin/env bash # cdk-deploy-to-prod.sh ./cdk-deploy-to.sh 135792468 us-west-1 "$@" || exit ./cdk-deploy-to.sh 246813579 eu-west-1 "$@"
Windows
@echo off rem cdk-deploy-to-prod.bat cdk-deploy-to 135792469 us-west-1 %* || exit /B cdk-deploy-to 245813579 eu-west-1 %*

開発者は引き続き通常の cdk deploy コマンドを使用して、開発のために自分の AWS 環境にデプロイできます。

スタックをインスタンス化するときに環境を指定しない場合、スタックは環境に依存しない . AWS CloudFormation templates と呼ばれます。このようなスタックから合成されたテンプレートは、stack.account、、 stack.region stack.availabilityZones (Python: ) などの環境関連の属性でデプロイ時の解決を使用しようとしますavailability_zones

cdk deploy を使用して環境に依存しないスタックをデプロイする場合、 AWS CDK CLIは指定された AWS CLI プロファイルを使用してデプロイ先を決定します。プロファイルが指定されていない場合は、デフォルトのプロファイルが使用されます。は、 AWS CDK CLIと同様のプロトコルに従って AWS CLI 、 AWS アカウントでオペレーションを実行するときに使用する AWS 認証情報を決定します。詳細については、「AWS CDK ツールキット (cdkコマンド)」を参照してください。

環境に依存しないスタックでは、アベイラビリティーゾーンを使用するすべてのコンストラクトに 2 つのアベイラビリティーゾーンが表示され、スタックを任意のリージョンにデプロイできます。

環境のブートストラップ

CDK スタックをデプロイする各環境をブートストラップする必要があります。ブートストラップは環境をデプロイする準備をします。詳細については、「ブートストラッピング」を参照してください。