这是 AWS CDK v2 开发者指南。旧版 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在部署时,使用 AWS Cloud Development Kit (AWS CDK) 应用程序中的 AWS CloudFormation 参数将自定义值输入到您的合成 CloudFormation模板中。
有关简介,请参阅参数和 AWS CDK。
在 CDK 应用程序中定义参数
使用 CfnParameter
类定义参数。您至少需要为大多数参数指定至少一个类型和描述,尽管两者在技术上都是可选的。当提示用户在 AWS CloudFormation 控制台中输入参数值时,就会显示描述。有关可用类型的更多信息,请参阅 Types。
注意
您可以在任何作用域内定义参数。但是,我们建议在堆栈级别定义参数,以便在重构代码时它们的逻辑 ID 不会发生变化。
const uploadBucketName = new CfnParameter(this, "uploadBucketName", {
type: "String",
description: "The name of the Amazon S3 bucket where uploaded files will be stored."});
使用参数
CfnParameter
实例通过令牌将其值公开给 CDK 应用程序。像所有令牌一样,参数的令牌在合成时进行解析。但是它解析为对 AWS CloudFormation 模板中定义的参数的引用(将在部署时解析),而不是对具体值的引用。
您可以将令牌作为 Token
类的实例进行检索,也可以检索为字符串、字符串列表或数字编码。您的选择取决于要与参数一起使用的类或方法所需的值类型。
属性 | 有点价值 |
---|---|
value |
Token 类实例 |
valueAsList |
表示为字符串列表的标记 |
valueAsNumber |
以数字表示的代币 |
valueAsString |
表示为字符串的标记 |
例如,要在 Bucket
定义中使用参数:
const bucket = new Bucket(this, "amzn-s3-demo-bucket",
{ bucketName: uploadBucketName.valueAsString});
部署包含参数的 CDK 应用程序
通过 AWS CloudFormation 控制台部署生成的 AWS CloudFormation 模板时,系统将提示您提供每个参数的值。
您也可以使用 CDK 提供参数值 CLI cdk deploy
命令,或者通过在 CDK 项目的堆栈文件中指定参数值。
使用提供参数值 cdk deploy
当你使用 CDK 进行部署时 CLI cdk deploy
命令,则可以在部署时使用--parameters
选项提供参数值。
以下是 cdk deploy
命令结构的示例:
$
cdk deploy
stack-logical-id
--parametersstack-name
:parameter-name
=parameter-value
如果 CDK 应用程序包含单个堆栈,则无需在 --parameters
选项中提供堆栈逻辑 ID 参数或
值。CDK CLI 将自动查找并提供这些值。以下是为 CDK 应用程序中单个堆栈的 stack-name
uploadBucketName
参数指定 uploadbucket
值的示例:
$
cdk deploy --parameters
uploadBucketName
=uploadbucket
通过 cdk 部署为多堆栈应用程序提供参数值
以下是中的 CDK 应用程序示例 TypeScript 它包含两个 CDK 堆栈。每个堆栈都包含一个 Amazon S3 存储桶实例和用于设置 Amazon S3 存储桶名称的参数:
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
// Define the CDK app
const app = new cdk.App();
// First stack
export class MyFirstStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Set a default parameter name
const bucketNameParam = new cdk.CfnParameter(this, 'bucketNameParam', {
type: 'String',
default: 'myfirststackdefaultbucketname'
});
// Define an S3 bucket
new s3.Bucket(this, 'MyFirstBucket', {
bucketName: bucketNameParam.valueAsString
});
}
}
// Second stack
export class MySecondStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Set a default parameter name
const bucketNameParam = new cdk.CfnParameter(this, 'bucketNameParam', {
type: 'String',
default: 'mysecondstackdefaultbucketname'
});
// Define an S3 bucket
new s3.Bucket(this, 'MySecondBucket', {
bucketName: bucketNameParam.valueAsString
});
}
}
// Instantiate the stacks
new MyFirstStack(app, 'MyFirstStack', {
stackName: 'MyFirstDeployedStack',
});
new MySecondStack(app, 'MySecondStack', {
stackName: 'MySecondDeployedStack',
});
对于包含多个堆栈的 CDK 应用程序,您可以执行以下操作:
-
使用参数部署一个堆栈:要从多堆栈应用程序部署单个堆栈,请提供堆栈逻辑 ID 作为参数。
以下是使用
mynewbucketname
作为bucketNameParam
的参数值部署MySecondStack
的示例:$
cdk deploy
MySecondStack
--parametersbucketNameParam
='mynewbucketname'
-
部署所有堆栈并为每个堆栈指定参数值:提供
'*'
通配符或--all
选项,以部署所有堆栈。在单个命令中多次提供--parameters
选项,以指定每个堆栈的参数值。以下是示例:$
cdk deploy
'*'
--parametersMyFirstDeployedStack
:bucketNameParam
='mynewfirststackbucketname'
--parametersMySecondDeployedStack
:bucketNameParam
='mynewsecondstackbucketname'
-
部署所有堆栈并为单个堆栈指定参数值:提供
'*'
通配符或--all
选项,以部署所有堆栈。然后,在--parameters
选项中指定要为其定义参数的堆栈。以下是在 CDK 应用程序中部署所有堆栈并为堆栈指定参数值的示例。MySecondDeployedStack
AWS CloudFormation 所有其他堆栈都将部署并使用默认参数值:$
cdk deploy
'*'
--parametersMySecondDeployedStack
:bucketNameParam
='mynewbucketname'
$
cdk deploy
--all
--parametersMySecondDeployedStack
:bucketNameParam
='mynewbucketname'
使用提供参数值 cdk deploy 适用于带有嵌套堆栈的应用程序
CDK CLI 使用包含嵌套堆栈的应用程序时的行为与多堆栈应用程序类似。主要区别在于,如果要部署所有嵌套堆栈,请使用 '**'
通配符。'*'
通配符会部署所有堆栈,但不会部署嵌套堆栈。'**'
通配符会部署所有堆栈,包括嵌套堆栈。
以下是在为一个嵌套堆栈指定参数值的同时部署嵌套堆栈的示例:
$
cdk deploy
'**'
--parametersMultiStackCdkApp/SecondStack
:bucketNameParam
='mysecondstackbucketname'
有关 cdk deploy
命令选项的更多信息,请参阅 cdk deploy。