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

这是 AWS CDK v2 开发者指南。较旧的 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

环境

环境是目标 AWS 账户 ,堆栈部署到 AWS 区域 该环境中。CDK 应用程序中的所有堆栈都与环境显式或隐式关联 ()。env

配置环境

对于生产堆栈,我们建议您使用env属性为应用程序中的每个堆栈明确指定环境。以下示例为其两个不同的堆栈指定了不同的环境。

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 提供的两个环境变量:CDK_DEFAULT_ACCOUNTCDK_DEFAULT_REGION。这些变量是根据使用--profile选项指定的 AWS 配置文件设置的,或者如果您未指定默认 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_ACCOUNTCDK_DEFAULT_REGION指定属性的 AWS CDK 区别。前者意味着堆栈应合成一个与环境无关的模板。在这样的堆栈中定义的构造不能使用有关其环境的任何信息。例如,你不能编写像 vpc.fromLookup (Pythonfrom_lookup:) 这样的代码if (stack.region === 'us-east-1')或使用需要查询你的账户的框架工具。 AWS 在您指定明确的环境之前,这些功能根本不起作用;要使用它们,必须指定env

当您使用CDK_DEFAULT_ACCOUNT和进入您的环境时CDK_DEFAULT_REGION,堆栈将部署在综合时由 AWS CDK CLI 确定的账户和区域中。这使依赖于环境的代码可以正常工作,但这也意味着合成后的模板可能会因其合成所在的机器、用户或会话而有所不同。在开发过程中,这种行为通常是可以接受的,甚至是可取的,但对于生产用途来说,它可能是一种反模式。

您可以使用任何有效的表达式随心所欲地进行设置env。例如,您可以编写堆栈以支持另外两个环境变量,以便在合成时覆盖账户和区域。我们CDK_DEPLOY_REGION在这里给它们CDK_DEPLOY_ACCOUNT起个名字,但你可以随心所欲地给它们起名字,因为它们不是由... 设置的 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。除前两个参数之外的任何参数都将传递给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将在调用批处理文件时创建。

然后,您可以编写其他调用 “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 %*

部署到多个环境时,请考虑是否要在部署失败后继续部署到其他环境。如果第一个生产环境不成功,以下示例将避免部署到第二个生产环境。

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 从此类堆栈中合成的模板将尝试对与环境相关的属性(例如stack.accountstack.region和 (stack.availabilityZonesPython:))使用部署时解析。availability_zones

使用部署cdk deploy与环境无关的堆栈时, AWS CDK CLI将使用指定的 AWS CLI 配置文件来确定部署位置。如果未指定配置文件,则使用默认配置文件。 AWS CDK CLI遵循类似于的协议, AWS CLI 用于确定在您的 AWS 账户中执行操作时要使用哪些 AWS 证书。有关详细信息,请参阅 AWS CDK 工具包(cdk命令)

在与环境无关的堆栈中,任何使用可用区的结构都将看到两个可用区,从而允许将堆栈部署到任何区域。

引导环境

您必须引导要部署 CDK 堆栈的每个环境。引导可以为部署环境做好准备。要了解更多信息,请参阅正在引导