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

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

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

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

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

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

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

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

認証情報と設定ファイルで環境を指定するか、 Stack コンストラクトライブラリの コンストラクトの AWS 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 および Stack コンストラクトの envプロパティで指定されたAWS_DEFAULT_REGION環境変数。

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

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

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

CDK を使用して開発する場合、まず CDK スタックを定義します。このスタックには、 AWS リソースを表すコンストラクトが含まれます。次に、各 CDK スタックを AWS CloudFormation テンプレートに合成します。次に、CloudFormation テンプレートを環境にデプロイします。環境を指定すると、環境情報が適用されるタイミングが決まり、CDK の動作と結果に影響する可能性があります。

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

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

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

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

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

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

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

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

デプロイ時に環境情報が利用できない場合、 は、、stack.region、 などの環境関連の属性を使用してstack.account、デプロイ時に環境情報の解決を試み AWS CloudFormation ます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プロパティ内でこれらの環境変数を使用すると、CDK CLI--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

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

$ cdk deploy myStack --profile prod

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

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

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

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

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, 'myBucket', { 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, 'myBucket', { 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, 'myBucket', 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, "myBucket") .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, "myBucket", 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("myBucket"), &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、CDK はバケットのリージョンの出力値AWS::Regionとして 擬似パラメータを含む CloudFormation テンプレートCLIを生成します。このパラメータはデプロイ時に解決されます。

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

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

$ cdk deploy CdkAppStack --profile dev

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

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

この例では、有効な式を使用するようにstackインスタンスの envプロパティを設定します。と の 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.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 バージョンは、macOS /Linux バージョンと同じ機能 PowerShell を提供するために を使用します。 macOS また、コマンドラインから簡単に呼び出せるように、バッチファイルとして実行できるようにする手順も含まれています。として保存する必要があります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 %*