开始使用 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 项目并使用此项目创建相关基础设施。

如果您想深入了解文件夹结构、构造、堆栈、应用程序等概念,我们建议您阅读此文档。 

搭建开发环境

学习如何确保 AWS 根账户的安全、如何安装 AWS CLI(命令行界面),以及如何创建 AWS Cloud9 IDE。

启动 Web 应用程序

学习使用 AWS 的最佳实践和选择适合您需求的服务来构建和部署 Web 应用程序。

查找文档和工具

前往开发人员中心获取文档和工具、最新资讯以及与 AWS 开发者社区保持联系。