开始使用 AWS CDK

入门指南

模块 3:创建第一个 AWS CDK 项目

在本模块中,您将使用 AWS Cloud Development Kit (CDK) 创建基础设施。

简介

在此指南中,我们将使用 AWS CDK CLI,通过 TypeScript 新建一个基础设施项目。我们还将学习如何编写简单的资源,以及如何合成和部署 CDK 代码。合成是 CDK 将您的基础设施代码转换为 AWS CloudFormation 模板的方式。

您将学到的内容

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

 完成时间

15 分钟

 模块先决条件

  • 具有管理员级访问权限的 AWS 账户**
  • 推荐的浏览器:最新版 Chrome 或 Firefox

[**] 过去 24 小时内创建的账户可能尚不具有访问此教程所需服务的权限。

实施

新建 CDK 项目

要新建 CDK 项目,我们将使用 CDK CLI。首先,在您的系统上创建一个空目录并更改到该目录位置。现在我们将使用 cdk init 新建一个 TypeScript CDK 项目:

mkdir cdk-demo
cd cdk-demo
cdk init --language typescript

这将创建文件夹结构并安装 TypeScript CDK 项目所需的一些必要模块。输出应该如下所示:

Applying project template app for typescript
# Welcome to your CDK TypeScript project!

This is a blank project for TypeScript development with CDK.

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...
Executing npm install...
npm WARN deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated resolve-url@0.2.1: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated sane@4.1.0: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added
npm notice
npm notice New minor version of npm available! 7.19.0 -> 7.20.1
npm notice Changelog: https://github.com/npm/cli/releases/tag/v7.20.1
npm notice Run npm install -g npm@7.20.1 to update!
npm notice
✅ All done!

它还提供了帮助您开始执行 CDK 项目所需的命令。我们现已准备好编写首个 CDK 代码来创建基础设施。

创建基础设施

要开始构建项目,常见的起点是创建一个所定义的逻辑隔离虚拟网络,称为 Amazon Virtual Private Cloud (VPC)。在创建第一个 VPC 之前,我们需要了解 cdk init 命令创建的文件。

构建和部署 CDK 应用程序

├── bin
│   └── cdk-demo.ts
├── cdk.json
├── jest.config.js
├── lib
│   └── cdk-demo-stack.ts
├── package.json
├── package-lock.json
├── README.md
├── test
│   └── cdk-demo.test.ts
└── tsconfig.json

以下是一些重要文件及其用途:

  • bin/cdk-project.ts - 这是 CDK 应用程序的入口点。这将加载/创建我们在 lib/* 下定义的所有堆栈
  • lib/cdk-project-stack.ts - 在此文件中定义主要的 CDK 应用程序堆栈。您的资源及其属性可以放在此文件中。
  • package.json - 在此文件中定义项目依赖项以及一些附加信息和构建脚本 (npm buildnpm testnpm watch)。
  • cdk.json - 此文件告诉工具包如何运行您的应用程序以及一些与 CDK 和项目相关的附加设置和参数。

对于本指南,我们将重点关注 lib/cdk-demo.tsbin/cdk-demo.ts 文件来创建我们的基础设施。接下来添加一些代码。

在我们的应用程序中定义一些内容

在主堆栈中定义我们的 VPC 之前,我们需要确保部署到正确的账户和区域。虽然 CDK 将从您的本地 aws cli 配置中提取此信息,但最好在 CDK 代码中手动配置,以避免在该配置更改时出现错误值。对于本指南,由于我们将在 VPC 中定义一些设置,因此这是必需的信息。如果您不指定此信息,堆栈将与环境无关,但某些功能和上下文查找将不起作用。有关更多信息,请参阅文档中的环境

修改您的 bin/cdk-demo.ts 堆栈,使其看起来类似于如下。务必使用正确的编号替换您的 AWS 账户 ID,同时选择正确的区域。我们建议为本指南选择 us-east-1eu-west-1

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from '@aws-cdk/core';
import { CdkDemoStack } from '../lib/cdk-demo-stack';

const app = new cdk.App();
new CdkDemoStack(app, 'CdkDemoStack', {
  env: { account: '123456789012', region: 'eu-west-1' },

});

现在您已准备好编写第一个资源。

VPC 的代码

我们将创建一个 VPC,它带有两个面向公众的子网,分布在两个可用区中。在深入探讨代码的编写之前,我们需要解释和安装构造库模块。将不同的服务打包到各个模块中,这样就可仅添加正在预置的基础设施所需的依赖项。模块可以用于单个服务,例如 AWS Amplify;也可用于多个服务,例如 Amazon EC2。对于本指南,我们将需要 Amazon EC2 模块,该模块中还包括对 AWS VPC 的支持。

要安装您的模块,我们将使用 npm。在项目目录中运行以下命令:

npm install @aws-cdk/aws-ec2

这将安装我们使用的所有必要模块。如果查看您的 package.json,就会看到该文件也添加到此处。

现在,我们已准备好创建自己的 VPC。打开 lib/cdk-demo.ts 中的堆栈定义。首次打开文件时,您应该看到类似于如下的内容:

import * as cdk from '@aws-cdk/core';

export class CdkDemoStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
  }
}

这就是我们项目的框架。如果您现在运行 CDK,则不会创建任何资源,因为我们尚未定义任何资源。要开始使用 VPC,我们需要导入已安装的模块,并引用其中的代码模块 - 我们将导入 VpcSubnetType 类。

import * as cdk from '@aws-cdk/core';

// CHANGE: This is where you import the classes from the module:
import { Vpc, SubnetType } from '@aws-cdk/aws-ec2';

export class CdkDemoStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
  }
}

创建 VPC 时,我们可以设置许多属性来根据需要对其进行定制。默认情况下,它将创建跨 3 个可用区 (AZ) 的 VPC,每个可用区都具备公有和私有子网 (采用单个互联网网关和 3 个 NAT 网关)。在本指南中,我们只想创建一个非常简单的设置,其跨越 2 个可用区,每个可用区都有一个公有子网。请阅读此文档以获取有关差异的更详细说明。 

要创建我们的 VPC,我们将指定两个可用区和涉及创建公有子网的详细信息,如下所示:

import * as cdk from '@aws-cdk/core';
import { Vpc, SubnetType } from '@aws-cdk/aws-ec2';

export class CdkDemoStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
    // CHANGE: We have created the vpc object from the Vpc class.
    const vpc = new Vpc(this, 'MainVpc',{
    
    // CHANGE: this is where we define how many AZs to use
    maxAzs: 2,
      
   // CHANGE: We define a single subnet configuration per AZ.
      subnetConfiguration:  [
        {
          // CHANGE: this is it's CIDR mask so 255.255.255.0
          cidrMask: 24,

          // CHANGE: a name for each of these subnets
          name: 'public-subnet',

          // CHANGE: and the subnet type to be used - here we will have
          // a public subnet. There are other options available here.
          subnetType: SubnetType.PUBLIC
        },
      ]
    });
  }
}

我们现在已准备好将此基础设施更改部署到我们的账户中。

部署时间

测试部署所用的时间。为了解您的代码是否有效,您可以运行 npm build,它将 TypeScript 编译为 JavaScript。如果测试成功,您就可以运行部署命令:

cdk deploy

这会将您的 TypeScript 编译为 JavaScript,同时创建一个 CloudFormation 更改集来部署此更改。CDK 自动管理所有这些操作,同时将模板文件上传到 S3 并使用 CloudFormation 运行它。您应会看到类似于如下的输出:

# cdk deploy
CdkDemoStack: deploying...
CdkDemoStack: creating CloudFormation changeset...
[··························································] (0/13)

3:50:17 PM | CREATE_IN_PROGRESS   | AWS::CloudFormation::Stack            | CdkDemoStack
3:50:21 PM | CREATE_IN_PROGRESS   | AWS::EC2::InternetGateway             | MainVpc/IGW
3:50:21 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC                         | MainVpc
3:50:22 PM | CREATE_IN_PROGRESS   | AWS::CDK::Metadata                    | CDKMetadata/Default

几分钟后,您应该会看到一个绿色复选标记以及新建 CloudFormation 堆栈的 ARN (Amazon 资源名称)。您的新 VPC 现已部署完毕,可以投入使用。

清理资源 (可选)

本指南中创建的 VPC 不会产生任何每月费用,但规定的配额会限制账户中的每个区域仅允许 5 个 VPC - 如果需要的话,可以通过支持服务单增加此配额。如果您希望删除新创建的资源,则可以运行 cdk destroy 命令,它将通过之前创建的 CloudFormation 堆栈删除所有资源。

cdk destroy

您应收到以下提示。按下 y 和 Enter 键后,将开始删除所有基础设施并提供更新。完成后,您将看到以下内容:

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

✅  CdkEcsInfraStack: destroyed

结论

恭喜! 您已完成 AWS CDK 入门指南。在本指南中,我们通过创建 VPC 在 TypeScript 中建立了第一个 AWS CDK 项目。我们介绍如何初始化一个新的 CDK 项目,以及使用它来创建此基础设施。此 CDK 代码和 VPC 将在以后的指南中使用,我们建议您查看有关如何部署第一个 Web 应用程序的指南。 

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

请就我们的表现提供反馈。

感谢您的反馈
很高兴此页面对您有所帮助。您是否乐意分享更多详细信息,以帮助我们继续改进?
关闭
感谢您的反馈
很抱歉,此页面未能帮到您。您是否乐意分享更多详细信息,以帮助我们继续改进?
关闭