这是 AWS CDK v2 开发者指南。旧版 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
导入并使用该 AWS Cloud Development Kit (AWS CDK) 库使用支持的编程语言来定义您的 AWS Cloud 基础架构。
导入 AWS CDK 库
AWS CDK 图书馆通常被称为 TypeScript 的软件包名称aws-cdk-lib
。实际的包名称因语言而异。以下是如何安装和导入 CDK 库的示例:
安装 | npm install aws-cdk-lib |
---|---|
Import | import * as cdk from 'aws-cdk-lib'; |
construct
基类和支持代码位于 constructs
库中。实验性构造(其中 API 仍在完善中)作为单独的模块进行分发。
使用 AWS CDK API 参考
采用 AWS CDK进行开发时,请使用 AWS CDK API Reference。
每个模块的参考资料分为以下几个部分。
-
概述:使用中的服务需要了解的入门材料 AWS CDK,包括概念和示例。
-
构造:表示一个或多个具体 AWS 资源的库类。这些是“精选”(L2)资源或模式(L3 资源),可提供具有合理默认值的高级别接口。
-
类:非构造类,可提供模块中构造所使用的功能。
-
结构:数据结构(属性捆绑包),可定义复合值结构,例如属性(构造的
props
参数)和选项。 -
接口:所有名称以“I”为开头的接口,可定义相应构造或其他类的绝对最低功能。CDK 使用构造接口来表示在您的 AWS CDK 应用程序外部定义并由诸如
Bucket.fromBucketArn()
之类的方法引用的 AWS 资源。 -
枚举:用于指定某些构造参数的命名值的集合。使用枚举值可允许 CDK 在合成过程中检查这些值的有效性。
-
CloudFormation 资源:这些 L1 结构的名称以 “Cfn” 开头,它们完全代表规范中定义的资源。 CloudFormation 这些资源随每个 CDK 版本根据该规范自动生成。每个 L2 或 L3 结构都封装了一个或多个资源。 CloudFormation
-
CloudFormation 属性类型:定义每个 CloudFormation 资源属性的命名值的集合。
接口与构造类的比较
它们以一种特定的方式 AWS CDK 使用接口,即使您熟悉接口作为编程概念,这种方式也可能并不明显。
AWS CDK 支持使用诸如之类的方法使用 CDK 应用程序外部定义的资源。Bucket.fromBucketArn()
无法对外部资源进行修改,并且可能不具有使用 Bucket
类等工具在您的 CDK 应用程序中定义的资源提供的所有功能。因此,接口代表 CDK 中针对给定 AWS 资源类型(包括外部资源)可用的最低限度功能。
所以在 CDK 应用程序中实例化资源时,应始终使用具体的类,例如 Bucket
。在您自己的构造之一中指定要接受的参数类型时,如果您已准备好处理外部资源(即无需对其进行更改),请使用 IBucket
等接口类型。如果需要 CDK 定义的构造,请指定可以使用的最通用的类型。
有些接口是与特定类(而不是构造)相关的属性或选项捆绑包的最低版本。当进行子类化以接受要传递给父类的参数时,此类接口会很有用。如果您需要一个或多个其他属性,则需要从该接口或更具体的类型来实现或派生。
注意
支持的某些编程语言 AWS CDK 没有接口功能。在这些语言中,接口只是普通的类。您可以通过其名称来进行识别,这些名称遵循首字母为“I”后跟其他构造名称的模式(例如 IBucket
)。适用于相同的规则。
管理依赖项
您的 AWS CDK 应用程序或库的依赖项使用包管理工具进行管理。这些工具通常与编程语言一起使用。
通常, AWS CDK 支持该语言的标准或官方软件包管理工具(如果有)。否则, AWS CDK 将支持该语言最受欢迎或最广泛支持的语言。您也可以使用其他工具,特别是如果与支持的工具配合使用。但是,官方对其他工具的支持有限。
AWS CDK 支持以下软件包管理器:
语言 | 支持的包管理工具 |
---|---|
TypeScript/JavaScript | NPM(节点包管理器)或 Yarn |
Python | PIP(Python 的包安装程序) |
Java | Maven |
C# | NuGet |
Go | Go 模块 |
当你使用创建新项目时 AWS CDK CLI cdk init
命令、CDK 核心库和稳定构造的依赖关系会自动指定。
有关管理受支持编程语言依赖项的更多信息,请参阅以下内容:
比较 AWS CDK 中 TypeScript 使用其他语言
TypeScript 是开发 AWS CDK 应用程序时支持的第一种语言。因此,编写了大量的 CDK 示例代码。 TypeScript如果您正在使用另一种语言进行开发,那么将 AWS CDK 代码的实现方式 TypeScript 与您选择的语言进行比较可能会很有用。这有助于您在整个文档中使用示例。
导入模块
TypeScript 支持导入整个命名空间或从命名空间导入单个对象。每个命名空间都包含用于给定 AWS 服务的构造和其他类。
// Import main CDK library as cdk
import * as cdk from 'aws-cdk-lib'; // ES6 import preferred in TS
const cdk = require('aws-cdk-lib'); // Node.js require() preferred in JS
// Import specific core CDK classes
import { Stack, App } from 'aws-cdk-lib';
const { Stack, App } = require('aws-cdk-lib');
// Import AWS S3 namespace as s3 into current namespace
import { aws_s3 as s3 } from 'aws-cdk-lib'; // TypeScript
const s3 = require('aws-cdk-lib/aws-s3'); // JavaScript
// Having imported cdk already as above, this is also valid
const s3 = cdk.aws_s3;
// Now use s3 to access the S3 types
const bucket = s3.Bucket(...);
// Selective import of s3.Bucket
import { Bucket } from 'aws-cdk-lib/aws-s3'; // TypeScript
const { Bucket } = require('aws-cdk-lib/aws-s3'); // JavaScript
// Now use Bucket to instantiate an S3 bucket
const bucket = Bucket(...);
比如 TypeScript,Python 支持命名空间模块导入和选择性导入。Python 中的命名空间看起来像 aws_cdk。 xxx,其中 xxx 表示 AWS 服务名称,例如亚马逊 S3 的 s3。(这些示例中使用了 Amazon S3。)
# Import main CDK library as cdk
import aws_cdk as cdk
# Selective import of specific core classes
from aws_cdk import Stack, App
# Import entire module as s3 into current namespace
import aws_cdk.aws_s3 as s3
# s3 can now be used to access classes it contains
bucket = s3.Bucket(...)
# Selective import of s3.Bucket into current namespace
from aws_cdk.s3 import Bucket
# Bucket can now be used to instantiate a bucket
bucket = Bucket(...)
实例化构造
AWS CDK 构造类在所有支持的语言中都具有相同的名称。大多数语言都使用 new
关键字来实例化类(Python 和 Go 则不使用)。此外,在大多数语言中,关键字this
是指当前实例。(按照惯例,Python 使用 self
。) 您应该将对当前实例的引用作为 scope
参数传递给您创建的每个构造。
AWS CDK 构造的第三个参数是props
,一个包含构建构造所需的属性的对象。此参数可能是可选的,但是当需要时,支持的语言会以惯用方式进行处理。属性的名称也符合该语言的标准命名模式。
// Instantiate default Bucket
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket');
// Instantiate Bucket with bucketName and versioned properties
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', {
bucketName: 'amzn-s3-demo-bucket',
versioned: true,
});
// Instantiate Bucket with websiteRedirect, which has its own sub-properties
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', {
websiteRedirect: {host: 'aws.amazon.com'}});
Python 在实例化类时不使用 new
关键字。使用关键字参数来表示属性参数,这些关键字参数使用 snake_case
来命名。
如果 props 值本身就是属性捆绑包,则由以该属性命名的类表示,该类接受子属性的关键字参数。
在 Python 中,当前实例作为第一个参数传递给方法,按照惯例命名为 self
。
# Instantiate default Bucket
bucket = s3.Bucket(self, "amzn-s3-demo-bucket")
# Instantiate Bucket with bucket_name and versioned properties
bucket = s3.Bucket(self, "amzn-s3-demo-bucket", bucket_name="amzn-s3-demo-bucket", versioned=true)
# Instantiate Bucket with website_redirect, which has its own sub-properties
bucket = s3.Bucket(self, "amzn-s3-demo-bucket", website_redirect=s3.WebsiteRedirect(
host_name="aws.amazon.com"))
访问成员
通常会引用构造和其他 AWS CDK 类的属性或属性,并将这些值用作构建其他构造的输入。前面所述方法的命名差异也适用于此处。此外,无法在 Java 中直接访问成员。相反,会提供一个 getter 方法。
名称为 camelCase
。
bucket.bucketArn
名称为 snake_case
。
bucket.bucket_arn
枚举常量
枚举常量的作用域仅限于某个类,并且在所有语言中都具有带下划线的大写名称(有时称为 SCREAMING_SNAKE_CASE
)。由于类名在除 Go 之外的所有支持的语言中也使用相同的大小写,所以这些语言中的限定枚举名称也相同。
s3.BucketEncryption.KMS_MANAGED
在 Go 中,枚举常量是指模块命名空间的属性,编写方式如下。
awss3.BucketEncryption_KMS_MANAGED
对象接口
AWS CDK 使用 TypeScript 对象接口来表示一个类实现了一组预期的方法和属性。您可以识别对象接口,因为其名称以 I
开头。具体类使用 implements
关键字来指示其实现的接口。
注意
JavaScript 没有界面功能。您可以忽略 implements
关键字及其后的类名。
import { IAspect, IConstruct } from 'aws-cdk-lib';
class MyAspect implements IAspect {
public visit(node: IConstruct) {
console.log('Visited', node.node.path);
}
}
Python 不具备接口功能。但是,对于这些来说, AWS CDK 你可以通过装饰你的类来表示接口的@jsii.implements(interface)
实现。
from aws_cdk import IAspect, IConstruct
import jsii
@jsii.implements(IAspect)
class MyAspect():
def visit(self, node: IConstruct) -> None:
print("Visited", node.node.path)