这是 AWS CDK v2 开发者指南。旧版 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
您可以通过多种方式配置 AWS 环境,以便与一起使用 AWS Cloud Development Kit (AWS CDK)。根据您的具体需求,管理 AWS 环境的最佳方法会有所不同。
应用程序中的每个 CDK 堆栈最终都必须与环境相关联,才能确定堆栈的部署位置。
有关 AWS 环境的介绍,请参阅的环境 AWS CDK。
指定环境的方式
可以在凭据和配置文件中指定环境,也可以使用构造库中Stack
构造的env
属性 AWS 来指定环境。
凭证和配置文件
您可以使用 AWS Command Line Interface (AWS CLI) 来创建credentials
和存储、组织和管理您的 AWS 环境信息的config
文件。有关这些文件的更多信息,请参阅《AWS Command Line Interface User Guide》中的 Configuration and credential file settings。
存储在这些文件中的值按配置文件进行组织。您如何命名配置文件以及这些文件中的键值对将因所用配置编程访问权限的方法而异。要了解不同方法的更多信息,请参阅为配置安全证书 AWS CDK CLI。
通常, AWS CDK 解析credentials
文件中的 AWS 账户 信息以及config
文件中的 AWS 区域 信息。
配置好credentials
和config
文件后,可以指定要与之配合使用的环境 AWS CDK CLI 并通过环境变量。
堆栈构造的 env 属性
您可以使用 Stack
构造的 env
属性为每个堆栈指定环境。此属性定义了要使用的账户和区域。您可以将硬编码值传递给此属性,也可以传递 CDK 提供的环境变量。
要传递环境变量,请使用 AWS_DEFAULT_ACCOUNT
和 AWS_DEFAULT_REGION
环境变量。这些环境变量可以传递 credentials
和 config
文件中的值。您也可以使用 CDK 代码中的逻辑来确定这些环境变量的值。
环境优先级为 AWS CDK
如果您使用多种方法来指定环境,则会 AWS CDK 遵循以下优先级:
-
使用
Stack
构造的env
属性指定的硬编码值。 -
使用
Stack
构造 的env
属性指定的AWS_DEFAULT_ACCOUNT
和AWS_DEFAULT_REGION
环境变量。 -
与您的
credentials
和config
文件中的配置文件关联的环境信息并传递给 CDK CLI 使用--profile
选项。 -
来自
credentials
和config
文件的default
配置文件。
何时指定环境
使用 CDK 进行开发时,首先要定义 CDK 堆栈,其中包含代表资源的结构。 AWS 接下来,将每个 CDK 堆栈合成一个模板。 AWS CloudFormation 然后,将CloudFormation 模板部署到您的环境中。您指定环境的方式决定着何时应用您的环境信息,并可能影响 CDK 的行为和结果。
在模板合成时指定环境
当您使用 Stack
构造的 env
属性指定环境信息时,模板合成时将应用您的环境信息。运行cdk synth
或cdk
deploy
生成特定于环境 CloudFormation 的模板。
如果您在env
属性中使用环境变量,则必须在 CDK 中使用该--profile
选项 CLI 用于传入配置文件的命令,该配置文件包含您的凭据和配置文件中的环境信息。然后,模板合成时将应用此信息,以生成特定于环境的模板。
CloudFormation 模板中的环境信息优先于其他方法。例如,如果您使用 cdk deploy --profile
提供了不同的环境,则配置文件将被忽略。profile
以这种方式提供环境信息时,您可以在 CDK 应用程序中使用与环境相关的代码和逻辑。这也意味着,根据作为合成条件的机器、用户或会话,合成后的模板可能会有所不同。这种方法在开发过程中通常是可以接受或可取的,但不建议用于生产用途。
在堆栈部署时指定环境
如果你没有使用Stack
构造的env
属性来指定环境,那么 CDK CLI 将在合成时生成与环境无关 CloudFormation 的模板。然后,您可以使用 cdk deploy --profile
指定要部署到的环境。profile
如果您在部署与环境无关的模板时未指定配置文件,那么 CDK CLI 将在部署时尝试使用您的credentials
和config
文件default
配置文件中的环境值。
如果部署时没有环境信息,则 AWS CloudFormation 将在部署时尝试通过与环境相关的属性(例如stack.account
stack.region
、和stack.availabilityZones
)来解析环境信息。
对于与环境无关的堆栈,堆栈中的构造不能使用环境信息,您也不能使用需要环境信息的逻辑。例如,您不能编写类似 if (stack.region ====
'us-east-1')
的代码,也不能使用需要环境信息的构造方法,例如 Vpc.fromLookup
。要使用这些功能,必须使用 env
属性指定环境。
对于与环境无关的堆栈,任何使用可用区的构造都将看到两个可用区,从而允许将堆栈部署到任何区域。
如何使用来指定环境 AWS CDK
为每个堆栈指定硬编码环境
使用Stack
构造的env
属性为您的堆栈指定 AWS 环境值。以下是示例:
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 });
我们建议将此方法用于生产环境。通过以这种方式显式指定环境,您可以确保堆栈始终部署到特定环境中。
使用环境变量指定环境
AWS CDK 提供了两个可以在 CDK 代码中使用的环境变量:CDK_DEFAULT_ACCOUNT
和。CDK_DEFAULT_REGION
当您在堆栈实例的env
属性中使用这些环境变量时,可以使用 CDK 传递证书和配置文件中的环境信息 CLI --profile
选项。
以下示例演示了如何指定这些环境变量:
通过 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
}});
通过使用环境变量指定环境,可以将相同的 CDK 堆栈合成到 AWS CloudFormation 模板中以用于不同环境。这意味着您可以将相同的 CDK 堆栈部署到不同的 AWS 环境,而无需修改 CDK 代码。您只需要指定要在运行 cdk synth
时使用的配置文件即可。
当将同一个堆栈部署到不同的环境时,这种方法非常适合开发环境。但是,我们不建议在生产环境中使用这种方法,因为相同的 CDK 代码可能会合成不同的模板,具体取决于作为合成条件的机器、用户或会话。
使用 CDK 从凭证和配置文件指定环境 CLI
部署与环境无关的模板时,请将该--profile
选项与任何 CDK 一起使用 CLI 命令来指定要使用的配置文件。以下是使用 credentials
和 config
文件中定义的 prod
配置文件部署名为 myStack
的 CDK 堆栈的示例:
$
cdk deploy
myStack
--profileprod
有关该--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
:
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,
});
}
}
当我们跑步的时候cdk synth
,CDK CLI 生成一个 CloudFormation 模板,其中虚拟参数AWS::Region
作为存储桶区域的输出值。此参数将在部署时解析:
Outputs:
BucketRegion:
Value:
Ref: AWS::Region
要将此堆栈部署到凭证和配置文件的 dev
配置文件中指定的环境中,应运行以下命令:
$
cdk deploy CdkAppStack --profile dev
如果我们不指定配置文件,CDK CLI 将尝试在我们的凭据和配置文件中使用配置文件中的环境信息。default
在模板合成时使用逻辑确定环境信息
在本例中,我们将 stack
实例的 env
属性配置为使用有效的表达式。我们另外指定了两个环境变量,CDK_DEPLOY_ACCOUNT
和 CDK_DEPLOY_REGION
。这些环境变量可能会在合成时覆盖默认值(如有):
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
}});
用这种方式声明堆栈的环境后,我们可以编写一个简短的脚本或批处理文件,并从命令行参数设置变量,然后调用 cdk deploy
。示例如下:除前两个参数之外的任何参数都将传递到 cdk deploy
,以指定命令行选项或参数:
#!/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
使其可执行。
然后,我们可以编写使用 cdk-deploy-to
脚本的其他脚本,进而部署到特定环境。以下是示例:
#!/usr/bin/env bash
# cdk-deploy-to-test.sh
./cdk-deploy-to.sh 123457689 us-east-1 "$@"
以下是使用 cdk-deploy-to
脚本部署到多个环境的示例。如果第一次部署失败,则进程将停止:
#!/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 "$@"