これは AWS CDK v2 デベロッパーガイドです。古い v1 CDK は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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 環境変数を介して および を使用します。
Stack
コンストラクトの env
プロパティを使用して、各スタックの環境を指定できます。このプロパティは、使用するアカウントとリージョンを定義します。ハードコードされた値をこのプロパティに渡すことも、 が提供する環境変数を渡すこともできますCDK。
環境変数を渡すには、 AWS_DEFAULT_ACCOUNT
および AWS_DEFAULT_REGION
環境変数を使用します。これらの環境変数は、 credentials
および config
ファイルから値を渡すことができます。CDK コード内のロジックを使用して、これらの環境変数の値を決定することもできます。
環境を指定する複数の方法を使用する場合、 は次の優先順位 AWS CDK に従います。
-
Stack
コンストラクトの env
プロパティで指定されたハードコードされた値。
-
AWS_DEFAULT_ACCOUNT
および AWS_DEFAULT_REGION
環境変数は、 Stack
コンストラクトの env
プロパティで指定されます。
-
credentials
および config
ファイルからのプロファイルに関連付けられ、 に渡される環境情報 CDK CLI --profile
オプションを使用する。
-
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 つのアベイラビリティーゾーンが表示され、スタックを任意のリージョンにデプロイできます。
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コードが合成されるマシン、ユーザー、またはセッションに応じて異なるテンプレートを合成できるため、本番環境ではこのアプローチはお勧めしません。
環境に依存しないテンプレートをデプロイする場合は、 --profile
オプションを CDK CLI 使用するプロファイルを指定するコマンド。以下は、 credentials
および config
ファイルで定義されているprod
プロファイルmyStack
を使用して という名前のCDKスタックをデプロイする例です。
$
cdk deploy myStack
--profile prod
--profile
オプションの詳細については、他の とともに CDK CLI コマンドとオプションについては、「」を参照してくださいAWS CDK CLI コマンドリファレンス。
スタック内でコンストラクトを使用して定義するサービスは、デプロイ先のリージョンをサポートする必要があります。リージョン AWS のサービス ごとにサポートされている のリストについては、AWS 「リージョン別のサービス」を参照してください。
AWS CDK 指定した環境に を使用してスタックデプロイを実行するには、有効な AWS Identity and Access Management (IAM) 認証情報が必要です。
この例では、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: ®ion,
},
})
スタックの環境をこのように宣言すると、短いスクリプトまたはバッチファイルを記述し、コマンドライン引数から変数を設定し、 を呼び出します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 %*