で使用する環境を設定する AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

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

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

で使用する環境を設定する AWS CDK

AWS 環境は、 で使用するように複数の方法で設定できます AWS Cloud Development Kit (AWS CDK)。環境を管理する AWS 最適な方法は、特定のニーズによって異なります。

アプリケーション内の各CDKスタックは、最終的に環境に関連付けられ、スタックがデプロイされる場所を決定する必要があります。

AWS 環境の概要については、「」を参照してくださいの環境 AWS CDK

環境を から指定できる場所

環境は、認証情報と設定ファイルで指定することも、 AWS コンストラクトライブラリの Stack コンストラクトの envプロパティを使用して指定することもできます。

認証情報と設定ファイル

AWS Command Line Interface (AWS CLI) を使用して、 AWS 環境情報を保存、整理、管理する credentialsおよび config ファイルを作成できます。これらのファイルの詳細については、 ユーザーガイドの「設定と認証情報ファイルの設定」を参照してください。 AWS Command Line Interface

これらのファイルに保存されている値は、プロファイル によって整理されます。これらのファイル内のプロファイルとキーと値のペアに名前を付ける方法は、プログラムによるアクセスを設定する方法によって異なります。さまざまな方法の詳細については、「」を参照してくださいのセキュリティ認証情報を設定する AWS CDKCLI

一般に、 はcredentialsファイルからの AWS アカウント 情報とconfigファイルからの AWS リージョン 情報を AWS CDK 解決します。

credentials および config ファイルを設定したら、 で使用する環境を指定できます。 AWS CDK CLI 環境変数を介して および を使用します。

スタックコンストラクトの env プロパティ

Stack コンストラクトの envプロパティを使用して、各スタックの環境を指定できます。このプロパティは、使用するアカウントとリージョンを定義します。ハードコードされた値をこのプロパティに渡すことも、 が提供する環境変数を渡すこともできますCDK。

環境変数を渡すには、 AWS_DEFAULT_ACCOUNTおよび AWS_DEFAULT_REGION環境変数を使用します。これらの環境変数は、 credentialsおよび config ファイルから値を渡すことができます。CDK コード内のロジックを使用して、これらの環境変数の値を決定することもできます。

での環境の優先順位 AWS CDK

環境を指定する複数の方法を使用する場合、 は次の優先順位 AWS CDK に従います。

  1. Stack コンストラクトの envプロパティで指定されたハードコードされた値。

  2. AWS_DEFAULT_ACCOUNT および AWS_DEFAULT_REGION 環境変数は、 Stack コンストラクトの envプロパティで指定されます。

  3. credentials および config ファイルからのプロファイルに関連付けられ、 に渡される環境情報 CDK CLI --profile オプションを使用する。

  4. credentials および config ファイルからのdefaultプロファイル。

環境を指定するタイミング

を使用して開発するときはCDK、まず、 AWS リソースを表すコンストラクトを含むCDKスタックを定義します。次に、各CDKスタックを AWS CloudFormation テンプレートに合成します。次に、CloudFormation テンプレートを環境にデプロイします。環境を指定する方法によって、環境情報がいつ適用され、CDK動作や結果に影響するかが決まります。

テンプレート合成で環境を指定する

Stack コンストラクトの envプロパティを使用して環境情報を指定すると、環境情報はテンプレート合成に適用されます。cdk synth または を実行すると、環境固有の CloudFormation テンプレートcdk deployが生成されます。

env プロパティ内で環境変数を使用する場合は、 で --profileオプションを使用する必要があります。 CDKCLI 認証情報と設定ファイルから環境情報を含むプロファイルを渡すコマンド。その後、この情報はテンプレート合成に適用され、環境固有のテンプレートが作成されます。

CloudFormation テンプレート内の環境情報は、他の方法よりも優先されます。例えば、 で別の環境を指定するとcdk deploy --profile profile、プロファイルは無視されます。

この方法で環境情報を提供すると、CDKアプリケーション内で環境依存のコードとロジックを使用できます。つまり、合成されたテンプレートは、合成されるマシン、ユーザー、またはセッションに基づいて異なる可能性があります。このアプローチは、開発時に許容または望ましいことがよくありますが、本番稼働での使用にはお勧めしません。

スタックデプロイ時の環境を指定する

Stack コンストラクトの envプロパティを使用して環境を指定しない場合、 CDKCLI は、合成時に環境に依存しない CloudFormation テンプレートを生成します。その後、 を使用して、デプロイ先の環境を指定できますcdk deploy --profile profile

環境に依存しないテンプレートをデプロイするときにプロファイルを指定しない場合、 CDKCLI は、デプロイ時に credentialsおよび configファイルのdefaultプロファイルから環境値を使用しようとします。

デプロイ時に環境情報が利用できない場合、 AWS CloudFormation はstack.account、、、 などの環境関連の属性を使用してstack.region、デプロイ時の環境情報の解決を試みますstack.availabilityZones

環境に依存しないスタックの場合、スタック内のコンストラクトは環境情報を使用できず、環境情報を必要とするロジックを使用することはできません。例えば、 のようなコードを記述if (stack.region ==== 'us-east-1')したり、 などの環境情報を必要とするコンストラクトメソッドを使用することはできませんVpc.fromLookup。これらの機能を使用するには、 envプロパティで環境を指定する必要があります。

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

で環境を指定する方法 AWS CDK

スタックごとにハードコードされた環境を指定する

Stack コンストラクトの envプロパティを使用して、スタックの AWS 環境値を指定します。以下に例を示します。

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 });
Go
env_EU := awscdk.Environment{ Account: jsii.String("8373873873"), Region: jsii.String("eu-west-1"), } env_USA := awscdk.Environment{ Account: jsii.String("2383838383"), Region: jsii.String("us-west-2"), } MyFirstStack(app, "first-stack-us", &awscdk.StackProps{ Env: &env_USA, }) MyFirstStack(app, "first-stack-eu", &awscdk.StackProps{ Env: &env_EU, })

本番環境では、このアプローチをお勧めします。この方法で環境を明示的に指定することで、スタックが常に特定の環境にデプロイされるようにできます。

環境変数を使用して環境を指定する

AWS CDK には、CDKコード内で使用できる CDK_DEFAULT_ACCOUNTと の 2 つの環境変数が用意されていますCDK_DEFAULT_REGION。スタックインスタンスの env プロパティ内でこれらの環境変数を使用すると、 を使用して認証情報と設定ファイルから環境情報を渡すことができます。 CDKCLI --profile オプション。

これらの環境変数を指定する方法の例を次に示します。

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() });
Go
import "os" MyDevStack(app, "dev", &awscdk.StackProps{ Env: &awscdk.Environment{ Account: jsii.String(os.Getenv("CDK_DEFAULT_ACCOUNT")), Region: jsii.String(os.Getenv("CDK_DEFAULT_REGION")), }, })

環境変数を使用して環境を指定することで、同じCDKスタックを異なる環境の AWS CloudFormation テンプレートに合成できます。つまり、CDKコードを変更しなくても、同じCDKスタックを異なる AWS 環境にデプロイできます。を実行するときに使用するプロファイルのみを指定する必要がありますcdk synth

このアプローチは、同じスタックを異なる環境にデプロイする場合の開発環境に最適です。ただし、同じCDKコードが合成されるマシン、ユーザー、またはセッションに応じて異なるテンプレートを合成できるため、本番環境ではこのアプローチはお勧めしません。

を使用して認証情報と設定ファイルから環境を指定する CDK CLI

環境に依存しないテンプレートをデプロイする場合は、 --profileオプションを CDK CLI 使用するプロファイルを指定するコマンド。以下は、 credentials および config ファイルで定義されているprodプロファイルmyStackを使用して という名前のCDKスタックをデプロイする例です。

$ cdk deploy myStack --profile prod

--profile オプションの詳細については、他の とともに CDK CLI コマンドとオプションについては、「」を参照してくださいAWS CDK CLI   コマンドリファレンス

で環境を設定する際の考慮事項 AWS CDK

スタック内でコンストラクトを使用して定義するサービスは、デプロイ先のリージョンをサポートする必要があります。リージョン AWS のサービス ごとにサポートされている のリストについては、AWS 「リージョン別のサービス」を参照してください。

AWS CDK 指定した環境に を使用してスタックデプロイを実行するには、有効な AWS Identity and Access Management (IAM) 認証情報が必要です。

CDK スタックから環境に依存しない CloudFormation テンプレートを合成する

この例では、CDKスタックから環境に依存しない CloudFormation テンプレートを作成します。その後、このテンプレートを任意の環境にデプロイできます。

CDK スタックの例を次に示します。このスタックは、Amazon S3 バケットとバケットのリージョンの CloudFormation スタック出力を定義します。この例では、 envは定義されていません。

TypeScript
export class CdkAppStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Create the S3 bucket const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', { removalPolicy: cdk.RemovalPolicy.DESTROY, }); // Create an output for the bucket's Region new cdk.CfnOutput(this, 'BucketRegion', { value: bucket.env.region, }); } }
JavaScript
class CdkAppStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); // Create the S3 bucket const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', { removalPolicy: cdk.RemovalPolicy.DESTROY, }); // Create an output for the bucket's Region new cdk.CfnOutput(this, 'BucketRegion', { value: bucket.env.region, }); } }
Python
class CdkAppStack(cdk.Stack): def __init__(self, scope: cdk.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) # Create the S3 bucket bucket = s3.Bucket(self, 'amzn-s3-demo-bucket', removal_policy=cdk.RemovalPolicy.DESTROY ) # Create an output for the bucket's Region cdk.CfnOutput(self, 'BucketRegion', value=bucket.env.region )
Java
public class CdkAppStack extends Stack { public CdkAppStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // Create the S3 bucket Bucket bucket = Bucket.Builder.create(this, "amzn-s3-demo-bucket") .removalPolicy(RemovalPolicy.DESTROY) .build(); // Create an output for the bucket's Region CfnOutput.Builder.create(this, "BucketRegion") .value(this.getRegion()) .build(); } }
C#
namespace MyCdkApp { public class CdkAppStack : Stack { public CdkAppStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Create the S3 bucket var bucket = new Bucket(this, "amzn-s3-demo-bucket", new BucketProps { RemovalPolicy = RemovalPolicy.DESTROY }); // Create an output for the bucket's Region new CfnOutput(this, "BucketRegion", new CfnOutputProps { Value = this.Region }); } } }
Go
func NewCdkAppStack(scope constructs.Construct, id string, props *CdkAppStackProps) awscdk.Stack { stack := awscdk.NewStack(scope, &id, &props.StackProps) // Create the S3 bucket bucket := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{ RemovalPolicy: awscdk.RemovalPolicy_DESTROY, }) // Create an output for the bucket's Region awscdk.NewCfnOutput(stack, jsii.String("BucketRegion"), &awscdk.CfnOutputProps{ Value: stack.Region(), }) return stack }

を実行するとcdk synth、 CDKCLI は、バケットのリージョンの出力値AWS::Regionとして擬似パラメータを持つ CloudFormation テンプレートを生成します。このパラメータはデプロイ時に解決されます。

Outputs: BucketRegion: Value: Ref: AWS::Region

このスタックを認証情報と設定ファイルのdevプロファイルで指定された環境にデプロイするには、以下を実行します。

$ cdk deploy CdkAppStack --profile dev

プロファイルを指定しない場合、 CDKCLI は、認証情報と設定ファイルのdefaultプロファイルから環境情報を使用しようとします。

ロジックを使用してテンプレート合成時の環境情報を決定する

この例では、インスタンスの envプロパティを有効な式を使用するstackように設定しています。2 つの追加の環境変数、 CDK_DEPLOY_ACCOUNTと を指定しますCDK_DEPLOY_REGION。これらの環境変数が存在する場合、合成時のデフォルトを上書きできます。

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() });
Go
var account, region string var b bool if account, b = os.LookupEnv("CDK_DEPLOY_ACCOUNT"); !b || len(account) == 0 { account = os.Getenv("CDK_DEFAULT_ACCOUNT") } if region, b = os.LookupEnv("CDK_DEPLOY_REGION"); !b || len(region) == 0 { region = os.Getenv("CDK_DEFAULT_REGION") } MyDevStack(app, "dev", &awscdk.StackProps{ Env: &awscdk.Environment{ Account: &account, Region: &region, }, })

スタックの環境をこのように宣言すると、短いスクリプトまたはバッチファイルを記述し、コマンドライン引数から変数を設定し、 を呼び出します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.sh、 を実行して実行可能chmod +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、バッチファイルが呼び出されると作成されます。

その後、スクリプトを使用して特定の環境にデプロイする追加のcdk-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 %*

cdk-deploy-to スクリプトを使用して複数の環境にデプロイする例を次に示します。最初のデプロイが失敗すると、プロセスは停止します。

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 %*