开始使用 AWS CDK
教程
创建首个 AWS CDK 项目
在本模块中,您将使用 AWS Cloud Development Kit (CDK) 创建基础设施
学习目标
- 使用 TypeScript 新建 CDK 项目。
- 在 CDK (VPC) 中编写简易资源。
- 将 CDK 代码合成到 AWS CloudFormation 模板中。
- 将基础设施部署到 AWS 账户中。
操作步骤
在本教程中,我们会使用 TypeScript,通过 AWS CDK CLI 新建基础设施项目。此外,我们还会学习如何编写简易资源,以及如何合成和部署 CDK 代码。“合成”是指 CDK 将基础设施代码转变为 AWS CloudFormation 模板的方式。
时长
25 分钟
模块学习前期准备
- 具有管理员级访问权限的 AWS 账户**
- 推荐的浏览器:最新版 Chrome 或 Firefox
[**] 过去 24 小时内创建的账户可能尚不具有访问此教程所需服务的权限。
新建 CDK 项目
新建 CDK 项目时,我们将使用上一模块搭建的 CDK CLI。
首先,使用 mkdir 命令创建一个空白目录,然后使用 cd 命令切换至该目录:
mkdir cdk-demo
cd cdk-demo
接着,使用 cdk init 命令来初始化一个基于 TypeScript 的新 CDK 项目:
cdk init --language typescript
此 cdk init 命令会创建文件夹结构,并安装 TypeScript CDK 项目的部分必要模块。输出结果应如下所示:
Applying project template app for typescript
# Welcome to your CDK TypeScript project
This is a blank project for CDK development with TypeScript.
The `cdk.json` file tells the CDK Toolkit how to execute your app.
## Useful commands
* `npm run build` compile typescript to js
* `npm run watch` watch for changes and compile
* `npm run test` perform the jest unit tests
* `cdk deploy` deploy this stack to your default AWS account/region
* `cdk diff` compare deployed stack with current state
* `cdk synth` emits the synthesized CloudFormation template
Initializing a new git repository...
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Executing npm install...
✅ All done!
如您所见,输出结果提供了可帮助您开始构建 CDK 项目所需的命令。
接着,查看 cdk init 命令创建的文件:
├── bin
│ └── cdk-demo.ts
├── lib
│ └── cdk-demo-stack.ts
├── node_modules
│ └── //list of modules
├── test
│ └── cdk-demo.test.ts
├── .gitignore
├── .npmignore
├── cdk.json
├── jest.config.js
├── package.json
├── package-lock.json
├── README.md
└── tsconfig.json
以下是部分重要文件及其用途:
- bin/cdk-demo.ts:CDK 应用程序的入口点,将加载/创建我们在 lib/* 下定义的所有堆栈
- lib/cdk-demo-stack.ts:定义 CDK 应用程序主堆栈的位置,您的资源及其属性可放在此处。
- package.json:您可以在此处定义项目依赖项、额外信息以及构建脚本(npm build、npm test 和 npm watch)。
- cdk.json:此文件能让工具包了解如何运行应用程序,而且包含与 CDK 和您的项目相关的一些其他设置和参数。
本教程将重点介绍 lib/cdk-demo-stack.ts 和 bin/cdk-demo.ts 文件,用于创建我们的基础设施。我们来添加一些代码吧。
创建基础设施
要开始构建项目,首先通常要创建自己定义的逻辑隔离虚拟网络,名为 Amazon Virtual Private Cloud (Amazon VPC)。
在主堆栈中定义 VPC 之前,我们需要确保要部署的账户和区域正确。虽然 CDK 会从本地 AWS CLI 配置中获取此信息,但为避免配置变动导致错误,最好在 CDK 代码中手动指定。
在本教程中,此步骤为必需步骤,因为我们将在 VPC 中定义一些设置。如果您不指定此信息,那么虽然堆栈将不依赖特定环境,但部分功能和上下文查找将无法使用。如需获取更多信息,请参阅此文档中的环境部分。
修改 bin/cdk-demo.ts 堆栈,如下所示:
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { CdkDemoStack } from '../lib/cdk-demo-stack';
const app = new cdk.App();
new CdkDemoStack(app, 'CdkDemoStack', {
env: { account: 'ACCOUNT-NUMBER', region: 'us-east-1' },
});
请确保将 ACCOUNT-NUMBER 替换为正确的 AWS 账户 ID,并选择正确的区域。在本教程中,我们建议选择 us-east-1 或 eu-west-1。
现在,您可以编写首个资源了。
在本教程中,我们将创建一个 VPC,其中包含两个分布在两个可用区的公共子网。
在详细介绍编写代码部分之前,我们需要先了解并安装 AWS CDK 构造库模块。“构造”可以表示单个 AWS 资源,例如 Amazon Simple Storage Service (Amazon S3) 存储桶,也可以是由多个 AWS 相关资源组成的高级抽象。AWS 构造库分为几个模块。本教程需要使用的是 Amazon EC2 模块,此模块还包含对 Amazon VPC 的支持。
安装 Amazon EC2 模块需要用到 npm。在项目目录下运行以下命令:
npm install @aws-cdk/aws-ec2
此命令能安装所有必需的模块。在 package.json 文件中,您会发现此命令也已添加到此处。
现在,我们可以创建 VPC 了。在 lib/cdk-demo-stack.ts 中打开堆栈定义。首次打开此文件时,其内容应如下所示:
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
// import * as sqs from 'aws-cdk-lib/aws-sqs';
export class CdkDemoStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// The code that defines your stack goes here
}
}
这是项目的基本框架。如果现在运行 CDK,则不会创建任何资源,因为我们尚未定义资源。在创建 VPC 之前,我们需要导入刚刚安装的 EC2 模块:
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
// Importing the EC2 Module
import * as ec2 from 'aws-cdk-lib/aws-ec2';
export class CdkDemoStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// The code that defines your stack goes here
}
}
创建 VPC 时,我们能根据自身需求设置多种属性。CDK 默认会创建一个跨三个可用区的 VPC,其中包括公共子网和私有子网(含一个互联网网关和三个 NAT 网关)。
而在本教程中,我们要创建一个简化版的 VPC,分布在两个可用区中,并为每个可用区分配一个公有子网。如需详细了解两者区别,请参阅此文档。
创建 VPC 时,我们需要指定两个可用区,并设置创建公共子网的详细参数,如以下代码所示:
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
// import * as sqs from 'aws-cdk-lib/aws-sqs';
export class CdkDemoStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// The code that defines your stack goes here
// We have created the VPC object from the VPC class
new ec2.Vpc(this, 'mainVPC', {
// This is where you can define how many AZs you want to use
maxAzs: 2,
// This is where you can define the subnet configuration per AZ
subnetConfiguration: [
{
cidrMask: 24,
name: 'public-subnet',
subnetType: ec2.SubnetType.PUBLIC,
}
]
});
}
}
部署代码
接下来,测试并部署您的代码。
要验证代码是否有效,可运行 npm build 将 TypeScript 编译为 JavaScript:
npm run build
如果没有遇到任何错误,那么可以继续运行 cdk deploy 命令:
cdk deploy
cdk deploy 命令会将 TypeScript 编译为 JavaScript,然后创建一个 AWS CloudFormation 更改集来部署此更改。
CDK 会自动处理整个过程,包括将模板文件上传至 S3 并使用 AWS CloudFormation 运行该模板文件。几分钟后,您会看到一个绿色复选标记,以及新建的 AWS CloudFormation 堆栈的 ARN(Amazon Resource Name,Amazon 资源名称)。现在,您的新 VPC 现已部署并准备就绪。
cdk deploy
✨ Synthesis time: 9.36s
CdkDemoStack: deploying...
[0%] start: Publishing CDK-METADATA-ID:ACCOUNT-us-east-1
[100%] success: Published CDK-METADATA-ID:ACCOUNT-us-east-1
CdkDemoStack: creating CloudFormation changeset...
✅ CdkDemoStack
✨ Deployment time: 75.49s
Stack ARN:
arn:aws:cloudformation:us-east-1:ACCOUNT:stack/CdkDemoStack/CDK-METADATA-ID
✨ Total time: 84.84s
本教程中创建的 VPC 不会产生月度费用,但每个账户在每个区域的 VPC 数量有五个的限额。如需增加配额,请联系 AWS 支持团队。
清理资源(可选)
如需移除新建资源,运行 cdk destroy 命令即可通过之前创建的 AWS CloudFormation 堆栈移除所有资源。
cdk destroy
命令运行后应出现以下提示。按下 y 键,然后按下 Enter 键(或 Return 键),即可开始移除所有基础设施。移除完成后,您会看到绿色复选标记和确认消息:
Are you sure you want to delete: CdkDemoStack (y/n)? y
CdkDemoStack: destroying...
✅ CdkDemoStack: destroyed
总结
恭喜您!您已完成开始使用 AWS CDK 教程。在本教程中,通过创建 VPC,我们创建了基于 TypeScript 的首个 AWS CDK 项目。我们还介绍了如何初始化新的 CDK 项目并使用此项目创建相关基础设施。
如果您想深入了解文件夹结构、构造、堆栈、应用程序等概念,我们建议您阅读此文档。