开始使用 AWS CDK

模块 3:创建首个 AWS CDK 项目

在本模块中,您将使用 AWS Cloud Development Kit (CDK) 创建基础设施
基础设施
CDK
AWS CloudFormation
免费套餐
教程
亚马逊云科技
Olawale Olaleye
亚马逊云科技使用经验
100 - 初级
完成所需时间
25 分钟
所需费用

可通过免费套餐试用

前提条件
  • 具有管理员级别访问权限的 AWS 账户**
  • 推荐的浏览器:最新版本的 Chrome 或 Firefox
  • [**]在过去 24 小时内新创建的账户可能无法使用本教程所需的服务。
上次更新时间
2022 年 8 月 15 日
相关产品

学习目标

  • 使用 TypeScript 新建 CDK 项目。
  • 在 CDK (VPC) 中编写简易资源。
  • 将 CDK 代码合成到 AWS CloudFormation 模板中。
  • 将基础设施部署到 AWS 账户中。

操作步骤

在本教程中,我们会使用 TypeScript,通过 AWS CDK CLI 新建基础设施项目。此外,我们还会学习如何编写简易资源,以及如何合成和部署 CDK 代码。“合成”是指 CDK 将基础设施代码转变为 AWS CloudFormation 模板的方式。

新建 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

命令运行后应出现以下提示。按下 键,然后按下 Enter 键(或 Return 键),即可开始移除所有基础设施。移除完成后,您会看到绿色复选标记和确认消息:

Are you sure you want to delete: CdkDemoStack (y/n)? y
CdkDemoStack: destroying...

 ✅  CdkDemoStack: destroyed

总结

恭喜您!您已完成开始使用 AWS CDK 教程。在本教程中,通过创建 VPC,我们创建了基于 TypeScript 的首个 AWS CDK 项目。我们还介绍了如何初始化新的 CDK 项目并使用此项目创建相关基础设施。

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