这是 AWS CDK v2 开发者指南。旧版 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在部署堆 AWS Cloud Development Kit (AWS CDK) 栈之前,必须先对其进行合成。堆栈合成是从 CDK 堆栈生成 AWS CloudFormation 模板和部署工件的过程。模板和构件称为云程序集。部署云程序集后即可在 AWS上预置资源。有关部署的工作原理的更多信息,请参阅 AWS CDK 部署的工作原理。
合成和引导如何协同工作
为了正确部署 CDK 应用程序,合成期间生成的 CloudFormation 模板必须正确指定引导期间创建的资源。因此,引导和合成必须相辅相成,才能成功部署:
-
Bootstrapping 是设置部署 AWS 环境的一次性过程。 AWS CDK 它在您的环境中配置 CDK 用于部署的特定 AWS 资源。这些资源通常被称为引导资源。有关引导的说明,请参阅引导您的环境以用于 AWS CDK。
-
CloudFormation 综合过程中生成的模板包含有关要使用哪些引导程序资源的信息。在合成过程中,CDK CLI 不知道你的 AWS 环境是如何被引导的。相反,CDK CLI 根据您为每个 CDK 堆栈配置的合成器生成 CloudFormation 模板。要成功部署,合成器必须生成引用要使用的正确引导程序资源的 CloudFormation 模板。
CDK 自带能够协同工作的默认合成器和引导配置。如果您对其中一个进行自定义,则必须对另一个应用相关的自定义。
如何配置 CDK 堆栈合成
您可以使用 Stack
实例的 synthesizer
属性配置 CDK 堆栈合成。此属性指定如何合成 CDK 堆栈。您提供实现 IStackSynthesizer
或 IReusableStackSynthesizer
的类的实例。每次将资源添加到堆栈或合成堆栈时,都会调用其方法。以下是在堆栈中使用此属性的基本示例:
new MyStack(this, 'MyStack', {
// stack properties
synthesizer: new DefaultStackSynthesizer({
// synthesizer properties
}),
});
您还可以使用 App
实例的 defaultStackSynthesizer
属性为 CDK 应用程序中的所有 CDK 堆栈配置合成器:
import { App, Stack, DefaultStackSynthesizer } from 'aws-cdk-lib';
const app = new App({
// Configure for all stacks in this app
defaultStackSynthesizer: new DefaultStackSynthesizer({
/* ... */
}),
});
默认情况下,这些用 AWS CDK 途DefaultStackSynthesizer
。如果您未配置合成器,则将使用此合成器。
如果您不修改引导,例如更改引导堆栈或模板,则不必修改堆栈合成。您甚至不必提供合成器。CDK 将使用默认 DefaultStackSynthesizer
类配置 CDK 堆栈合成,以便与引导堆栈正确交互。
如何合成 CDK 堆栈
要合成 CDK 堆栈,请使用 AWS CDK 命令行界面 (AWS CDK CLI) cdk synth
命令。有关此命令的更多信息,包括可与此命令一起使用的选项,请参阅 cdk synthesize。
如果 CDK 应用程序包含单个堆栈,或者要合成所有堆栈,则无需提供 CDK 堆栈名称作为参数。默认情况下,CDK CLI 会将你的 CDK 堆栈合成模板。 AWS CloudFormation
每个堆栈的 json
格式的模板将保存到 cdk.out
目录中。如果您的应用程序包含单个堆栈,则会将 yaml
格式的模板打印到 stdout
中。以下是示例:
$
cdk synth
Resources: CDKMetadata: Type: AWS::CDK::Metadata Properties: Analytics: v2:deflate64:H4sIAAAAAAAA/unique-identifier
Metadata: aws:cdk:path: CdkAppStack/CDKMetadata/Default Condition: CDKMetadataAvailable...
如果 CDK 应用程序包含多个堆栈,则可以提供堆栈的逻辑 ID 以合成单个堆栈。以下是示例:
$
cdk synth
MyStackName
如果你没有合成堆栈然后运行cdk deploy
,那么 CDK CLI 将在部署前自动合成您的堆栈。
合成的默认工作原理
IDs 在您的 AWS CloudFormation 模板中逻辑生成
当你合成 CDK 堆栈以生成 CloudFormation 模板时,逻辑 IDs 是从以下来源生成的,格式为:<construct-path><construct-ID><unique-hash>
-
构造路径:指向 CDK 应用程序中构造的完整路径。此路径不包括 L1 构造的 ID(始终为
Resource
或Default
)以及它所属的顶级堆栈的 ID。 -
构造 ID:实例化构造时作为第二个参数提供的 ID。
-
唯一哈希 — 使用确定性哈希算法 AWS CDK 生成 8 个字符的唯一哈希。此唯一哈希值有助于确保模板中的逻辑 ID 值是唯一的。此哈希值生成的确定性行为可确保每次执行合成时,为每个构造生成的逻辑 ID 值保持不变。只有在您修改特定的构造值(例如构造的 ID 或其路径)时,哈希值才会改变。
逻辑 IDs 的最大长度为 255 个字符。因此,如有必要, AWS CDK 将截断构造路径和构造 ID,以保持在该限制之内。
以下是定义 Amazon Simple Storage Service(Amazon S3)存储桶的示例构造。在本例中,我们将 myBucket
作为构造的 ID 传递:
import * as cdk from 'aws-cdk-lib';
import { Construct} from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
export class MyCdkAppStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Define the S3 bucket
new s3.Bucket(this, 'myBucket', {
versioned: true,
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
}
}
运行 cdk synth
时,会生成格式为 myBucket
的逻辑 ID。以下是生成的 AWS CloudFormation 模板中此资源的示例:unique-hash
Resources:
myBucket5AF9C99B:
Type: AWS::S3::Bucket
Properties:
VersioningConfiguration:
Status: Enabled
UpdateReplacePolicy: Delete
DeletionPolicy: Delete
Metadata:
aws:cdk:path: S3BucketAppStack/myBucket/Resource
下面是名为 Bar
的自定义构造的示例,它会定义 Amazon S3 存储桶。Bar
构造在其路径中包含自定义构造 Foo
:
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
// Define the Bar construct
export class Bar extends Construct {
constructor(scope: Construct, id: string) {
super(scope, id);
// Define an S3 bucket inside of Bar
new s3.Bucket(this, 'Bucket', {
versioned: true,
removalPolicy: cdk.RemovalPolicy.DESTROY,
} );
}
}
// Define the Foo construct
export class Foo extends Construct {
constructor(scope: Construct, id: string) {
super(scope, id);
// Create an instance of Bar inside Foo
new Bar(this, 'Bar');
}
}
// Define the CDK stack
export class MyCustomAppStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Instantiate Foo construct in the stack
new Foo(this, 'Foo');
}
}
运行 cdk synth
时,会生成格式为 FooBarBucket
的逻辑 ID。以下是生成的 AWS CloudFormation 模板中此资源的示例:unique-hash
Resources:
FooBarBucketBA3ED1FA:
Type: AWS::S3::Bucket
Properties:
VersioningConfiguration:
Status: Enabled
UpdateReplacePolicy: Delete
DeletionPolicy: Delete
# ...
自定义 CDK 堆栈合成
如果默认的 CDK 合成行为不符合您的需求,则可以自定义 CDK 合成。为此,您可以修改 DefaultStackSynthesizer
、使用其他可用的内置合成器或创建自己的合成器。有关说明,请参阅 自定义 CDK 堆栈合成。