

 AWS Cloud9 不再向新客户提供。 AWS Cloud9 的现有客户可以继续正常使用这项服务。[了解详情](https://aws.amazon.com/blogs/devops/how-to-migrate-from-aws-cloud9-to-aws-ide-toolkits-or-aws-cloudshell/)

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS CDK 的教程 AWS Cloud9
<a name="sample-cdk"></a>

本教程向您展示了如何在 AWS Cloud9 开发环境 AWS Cloud Development Kit (AWS CDK) 中使用。 AWS CDK 是一组软件工具和库，开发人员可以使用它们将 AWS 基础架构组件建模为代码。

 AWS CDK 包括 AWS 构造库，您可以使用它来快速解决许多任务 AWS。例如，您可以使用 `Fleet` 构造将代码完全且安全地部署到一队主机。您可以创建自己的构造为架构的各种元素建模，与其他人共享这些构造或将其发布到社区。有关更多信息，请参阅 [AWS Cloud Development Kit 开发人员指南](https://docs.aws.amazon.com/cdk/v2/guide/home.html)。

按照本教程操作并创建此示例可能会对您的 AWS 账户收费。其中包括可能对 Amazon EC2、Amazon SNS 和 Amazon SQS 等服务收取的费用。有关更多信息，请参阅 [Amazon EC2 定价](https://aws.amazon.com/ec2/pricing/)、[Amazon SNS 定价](https://aws.amazon.com/sns/pricing/)和 [Amazon SQS 定价](https://aws.amazon.com/sqs/pricing/)。

**Topics**
+ [先决条件](#sample-cdk-prereqs)
+ [步骤 1：安装所需工具](#sample-cdk-install)
+ [步骤 2：添加代码](#sample-cdk-code)
+ [步骤 3：运行代码](#sample-cdk-run)
+ [步骤 4：清除](#sample-cdk-clean-up)

## 先决条件
<a name="sample-cdk-prereqs"></a>

在使用此示例之前，请确保您的设置满足以下要求：
+ **您必须拥有现有 AWS Cloud9 的 EC2 开发环境。**本示例假设您已经有连接到运行 Amazon Linux 或 Ubuntu Server 的 Amazon EC2 实例的 EC2 环境。如果您有不同类型的环境或操作系统，可能需要按照本示例的说明来设置相关的工具。有关更多信息，请参阅 [在中创建环境 AWS Cloud9](create-environment.md)。
+ **您已经打开了现有环境的 AWS Cloud9 IDE。**打开环境时，会在 Web 浏览器中 AWS Cloud9 打开该环境的 IDE。有关更多信息，请参阅 [在中打开环境 AWS Cloud9](open-environment.md)。

## 步骤 1：安装所需工具
<a name="sample-cdk-install"></a>

在此步骤中，您将在您的环境中安装运行用 TypeScript 编程语言编写的示例 AWS CDK 所需的所有工具。

1.  [节点版本管理器](#sample-cdk-install-nvm)（或 **`nvm`**），用于稍后安装 Node.js。

1.  [Node.js](#sample-cdk-install-nodejs)，这是示例所必需的，包含 Node Package Manager **`npm`**，或者你用它来安装 TypeScript 和 AWS CDK 更高版本。

1.  [TypeScript](#sample-cdk-install-typescript)，这是本样本所要求的。（ AWS CDK 还支持其他几种编程语言。）

1. 这些区域有：[AWS CDK](#sample-cdk-install-cdk)。

### 步骤 1.1：安装节点版本管理器 (nvm)
<a name="sample-cdk-install-nvm"></a>

1. 在 AWS Cloud9 IDE 的终端会话中，确保安装了最新的安全更新和错误修复。要执行此操作，请运行 **`yum update`**（适用于 Amazon Linux）或 **`apt update`** 命令（适用于 Ubuntu Server）。（要开始新的终端会话，请在菜单栏上依次选择 **Window（窗口）**> **New Terminal（新建终端）**。）

   对于 Amazon Linux：

   ```
   sudo yum -y update
   ```

   对于 Ubuntu Server：

   ```
   sudo apt update
   ```

1. 确认是否已安装 **`nvm`**。为此，请运行带 **`--version`** 选项的 **`nvm`** 命令。

   ```
   nvm --version
   ```

   如果成功，则输出包含 **`nvm`** 版本号，并且您可以向前跳至 [步骤 1.2：安装 Node.js](#sample-cdk-install-nodejs)。

1. 下载并安装 **`nvm`**。要执行此操作，请运行安装脚本。在此示例中，安装了 v0.33.0，但您可以在[此处](https://github.com/nvm-sh/nvm#installing-and-updating)检查** `nvm` **的最新版本。

   ```
   curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
   ```

1. 开始使用 **`nvm`**。您可用关闭终端会话并重新启动，或者查找包含命令以加载 **`nvm`** 的 `~/.bashrc` 文件。

   ```
   . ~/.bashrc
   ```

### 步骤 1.2：安装 Node.js
<a name="sample-cdk-install-nodejs"></a>

1. 确认是否已安装 Node.js，如果已安装，请确认安装的版本为 16.17.0 或更高版本。**此示例使用 Node.js 16.17.0 进行测试。**要检查结果，请在终端会话仍在 IDE 中打开的情况下，运行带有** `--version` **选项的** `node` **命令。

   ```
   node --version
   ```

   如果已安装 Node.js，则输出将包含版本号。如果该版本号是 v16.17.0，请向前跳至 [步骤 1.3：安装 TypeScript](#sample-cdk-install-typescript)。

1. 安装 Node.js 16，方法是运行带有** `install` ** 操作的** `nvm` **命令。
**注意**  
你也可以运行**`nvm install node`**安装 Node.js 的长期支持 (LTS) 版本。 AWS Cloud9 支持追踪 Node.js 的 LTS 版本。

   ```
   nvm install v16
   ```

1. 开始使用 Node.js 16。为此，请运行** `nvm` **命令与** `alias` **操作、别名的版本号以及要用于该别名的版本，如下所示。

   ```
   nvm alias default 16
   ```
**注意**  
上述命令将 Node.js 16 设置为 Node.js 的默认版本。或者，您可以运行带有** `use` **操作（如** `nvm use 16.17.0` **）而非** `alias` **操作的** `nvm` **命令。不过，**`use`** 操作会导致该版本的 Node.js 仅在当前终端会话运行时运行。

1. 要确认您使用的是 Node.js 16，请再次运行 **`node --version`** 命令。如果已安装正确的版本，则输出将包含版本 v16。

### 步骤 1.3：安装 TypeScript
<a name="sample-cdk-install-typescript"></a>

1. 确认您是否已经 TypeScript 安装。为此，在终端会话仍在 IDE 中处于打开状态的情况下，使用**`--version`**选项运行命令行 TypeScript 编译器。

   ```
   tsc --version
   ```

   如果您已 TypeScript 安装，则输出将包含 TypeScript 版本号。如果 TypeScript 已安装，请直接跳至[步骤 1.4：安装 AWS CDK](#sample-cdk-install-cdk)。

1. 安装 TypeScript。为此，请运行带有**`install`**操作、**`-g`**选项和 TypeScript 软件包名称的**`npm`**命令。它 TypeScript 作为全局软件包安装在环境中。

   ```
   npm install -g typescript
   ```

1. 确认 TypeScript 已安装。为此，请使用**`--version`**选项运行命令行 TypeScript 编译器。

   ```
   tsc --version
   ```

   如果 TypeScript 已安装，则输出将包含 TypeScript 版本号。

### 步骤 1.4：安装 AWS CDK
<a name="sample-cdk-install-cdk"></a>

1. 确认您是否已经 AWS CDK 安装了。为此，请在终端会话仍在 IDE 中打开的情况下，运行带有** `--version` **选项的** `cdk` **命令。

   ```
   cdk --version
   ```

   如果安装了， AWS CDK 则输出将包含 AWS CDK 版本号和内部版本号。向前跳至 [步骤 2：添加代码](#sample-cdk-code)。

1.  AWS CDK 通过运行**`npm`**命令以及`install`操作、要安装的 AWS CDK 软件包的名称以及在环境中全局安装软件包的`-g`选项来安装。

   ```
   npm install -g aws-cdk
   ```

1. 确认已 AWS CDK 安装并正确引用。为此，请运行带 **`--version`** 选项的 **`cdk`** 命令。

   ```
   cdk --version
   ```

   如果成功，则会显示 AWS CDK 版本号和内部版本号。

## 步骤 2：添加代码
<a name="sample-cdk-code"></a>

在此步骤中，您将创建一个示例 TypeScript 项目，其中包含 AWS CDK 以编程方式部署 AWS CloudFormation 堆栈所需的所有源代码。此堆栈在 AWS 您的账户中创建一个 Amazon SNS 主题和一个 Amazon SQS 队列，然后订阅该队列以订阅该主题。

1. 在终端会话仍在 IDE 中打开的情况下，创建存储项目源代码的目录，例如您环境中的 `~/environment/hello-cdk` 目录。然后切换到该目录。

   ```
   rm -rf ~/environment/hello-cdk # Remove this directory if it already exists.
   mkdir ~/environment/hello-cdk  # Create the directory.
   cd ~/environment/hello-cdk     # Switch to the directory.
   ```

1. 将该目录设置为的 TypeScript 语言项目 AWS CDK。为此，请运行带有 ** `init` ** 操作、** `sample-app` ** 模板和 ** `--language` ** 选项以及编程语言名称的 ** `cdk` ** 命令。

   ```
   cdk init sample-app --language typescript
   ```

   这将在该目录中创建以下文件和子目录。
   + 隐藏的 `.git` 子目录和隐藏的 `.gitignore` 文件，可使项目与 Git 等源控制工具兼容。
   + `lib` 子目录，其中包含 `hello-cdk-stack.ts` 文件。此文件包含您的 AWS CDK 堆栈的代码。此代码将在此过程的下一步骤中介绍。
   + `bin` 子目录，其中包含 `hello-cdk.ts` 文件。此文件包含您的 AWS CDK 应用程序的入口点。
   + `node_modules` 子目录，其中包含应用程序和堆栈可根据需要使用的支持代码包。
   + 隐藏的 `.npmignore` 文件，其中列出了 **`npm`** 生成代码时不需要的子目录和文件类型。
   + `cdk.json` 文件，其中包含使 **`cdk`** 命令运行更轻松的信息。
   + `package-lock.json` 文件，其中包含 **`npm`** 可用于减少可能的生成和运行错误的信息。
   + `package.json` 文件，其中包含使 **`npm`** 命令运行更轻松以及可能减少构建和运行错误的信息。
   + 一个`README.md`文件，其中列出了可以用来运行的有用命令**`npm`**和 AWS CDK.
   + `tsconfig.json` 文件，其中包含使 **`tsc`** 命令运行更轻松以及可能减少构建和运行错误的信息。

1. 在 **Environment（环境）**窗口中，打开 `lib/hello-cdk-stack.ts` 文件，并浏览该文件中的以下代码。

   ```
   import sns = require('@aws-cdk/aws-sns');
   import sqs = require('@aws-cdk/aws-sqs');
   import cdk = require('@aws-cdk/cdk');
   
   export class HelloCdkStack extends cdk.Stack {
     constructor(parent: cdk.App, name: string, props?: cdk.StackProps) {
       super(parent, name, props);
   
       const queue = new sqs.Queue(this, 'HelloCdkQueue', {
         visibilityTimeoutSec: 300
       });
   
       const topic = new sns.Topic(this, 'HelloCdkTopic');
   
       topic.subscribeQueue(queue);
     }
   }
   ```
   + `Stack`、、`App``StackProps``Queue`、和`Topic`类分别表示 CloudFormation 堆栈及其属性、可执行程序、Amazon SQS 队列和 Amazon SNS 主题。
   + 该`HelloCdkStack`类代表此应用程序的 CloudFormation 堆栈。此堆栈包含用于此应用程序的新 Amazon SQS 队列和 Amazon SNS 主题。

1. 在 **Environment（环境）**窗口中，打开 `bin/hello-cdk.ts` 文件，并浏览该文件中的以下代码。

   ```
   #!/usr/bin/env node
   import cdk = require('@aws-cdk/cdk');
   import { HelloCdkStack } from '../lib/hello-cdk-stack';
   
   const app = new cdk.App();
   new HelloCdkStack(app, 'HelloCdkStack');
   app.run();
   ```

   此代码从 `HelloCdkStack` 文件中加载、实例化然后运行 `lib/hello-cdk-stack.ts` 类。

1. 用于**`npm`**运行编 TypeScript 译器以检查编码错误，然后启用 AWS CDK 以执行项目的`bin/hello-cdk.js`文件。为此，请从项目的根目录中运行带有 ** `run` ** 操作的 ** `npm` ** 命令，指定 `package.json` 文件中的 ** `build` ** 命令值，如下所示。

   ```
   npm run build
   ```

   前面的命令运行 TypeScript 编译器，该编译器添加了支持`lib/hello-cdk-stack.d.ts`文件`bin/hello-cdk.d.ts`和文件。该编译器还可将 `hello-cdk.ts` 和 `hello-cdk-stack.ts` 文件转换为 `hello-cdk.js` 和 `hello-cdk-stack.js` 文件。

## 步骤 3：运行代码
<a name="sample-cdk-run"></a>

在此步骤中，您将指示根据`bin/hello-cdk.js`文件中的代码创建 CloudFormation 堆栈模板。 AWS CDK 然后，您指示部署堆栈，该 AWS CDK 堆栈将创建 Amazon SNS 主题和 Amazon SQS 队列，然后为队列订阅该主题。然后，通过从主题向队列发送消息，确认已成功部署主题和队列。

1.  AWS CDK 创建 CloudFormation 堆栈模板。为此，在终端会话仍在 IDE 中打开的情况下，从项目的根目录，运行带有 **`synth`** 操作和堆栈名称的 **`cdk`** 命令。

   ```
   cdk synth HelloCdkStack
   ```

   如果成功，输出将显示 CloudFormation 堆栈模板的`Resources`部分。

1. 首次在特定 AWS 账户和 AWS 区域组合的环境中部署 AWS CDK 应用程序时，必须安装*引导堆栈*。该堆栈包含完成各种操作 AWS CDK 所需的各种资源。例如，此堆栈包含一个 Amazon S3 存储桶， AWS CDK 用于在其部署过程中存储模板和资产。要安装引导堆栈，请运行带有** `bootstrap` **操作的** `cdk` **命令。

   ```
   cdk bootstrap
   ```
**注意**  
如果您在`cdk bootstrap`未指定任何选项的情况下运行，则使用默认 AWS 账户和 AWS 区域。您也可以通过指定配置文件和 account/Region 组合来引导特定环境。例如：  

   ```
   cdk bootstrap --profile test 123456789012/us-east-1
   ```

1. 让 AWS CDK 运行 CloudFormation 堆栈模板来部署堆栈。为此，从项目的根目录，运行带有 **`deploy`** 操作和堆栈名称的 **`cdk`** 命令。

   ```
   cdk deploy HelloCdkStack
   ```

   如果成功，则输出将显示 `HelloCdkStack` 堆栈已部署且没有错误。
**注意**  
如果输出显示堆栈未定义环境、无法从标准位置获取 AWS 凭据或未配置区域的消息，请确保在 IDE 中正确设置了您的 AWS 凭据，然后再次运行该**`cdk deploy`**命令。有关更多信息，请参阅 [AWS 服务 从中的环境中呼叫 AWS Cloud9](credentials.md)。

1. 要确认 Amazon SNS 主题和 Amazon SQS 队列已成功部署，请发送消息到该主题，然后检查队列是否收到消息。为此，您可以使用诸如 AWS Command Line Interface (AWS CLI) 或之类的工具 AWS CloudShell。有关这些工具的更多信息，请参阅 [AWS CLI 还有 aws-shell 教程 AWS Cloud9](sample-aws-cli.md)。

   例如，要在终端会话仍在 IDE 中处于打开状态的情况下 AWS CLI 向主题发送消息，请使用运行 Amazon SNS **`publish`**命令，提供消息的主题和正文、主题的 AWS 区域以及主题的 Amazon 资源名称 (ARN)。

   ```
   aws sns publish --subject "Hello from the AWS CDK" --message "This is a message from the AWS CDK." --topic-arn arn:aws:sns:us-east-2:123456789012:HelloCdkStack-HelloCdkTopic1A234567-8BCD9EFGHIJ0K
   ```

   在前面的命令中，`arn:aws:sns:us-east-2:123456789012:HelloCdkStack-HelloCdkTopic1A234567-8BCD9EFGHIJ0K`替换为 CloudFormation 分配给该主题的 ARN。为获取该 ID，您可以运行 Amazon SNS** `list-topics`** 命令。

   ```
   aws sns list-topics --output table --query 'Topics[*].TopicArn'
   ```

   如果成功，则 **`publish`** 命令的输出将显示所发布消息的 `MessageId` 值。

   要检查队列是否收到消息，请运行 Amazon SQS ** `receive-message`** 命令，提供队列的 URL。

   ```
   aws sqs receive-message --queue-url https://queue.amazonaws.com/123456789012/HelloCdkStack-HelloCdkQueue1A234567-8BCD9EFGHIJ0K
   ```

   在前面的命令中，`https://queue.amazonaws.com/123456789012/HelloCdkStack-HelloCdkQueue1A234567-8BCD9EFGHIJ0K`替换为 CloudFormation 分配给队列的 ARN。为获取该 URL，您可以运行 Amazon SQS ** `list-queues`** 命令。

   ```
   aws sqs list-queues --output table --query 'QueueUrls[*]'
   ```

   如果成功，则 **`receive-message`** 命令的输出将显示收到的消息的相关信息。

## 步骤 4：清除
<a name="sample-cdk-clean-up"></a>

为防止在您使用完此示例后继续向您的 AWS 账户收费，您应该删除 CloudFormation 堆栈。此步骤将删除 Amazon SNS 主题和 Amazon SQS 队列。您还应该删除环境。

### 步骤 4.1：删除堆栈
<a name="step-4-1-delete-the-stack"></a>

在终端会话仍在 IDE 中打开的情况下，从项目的根目录，运行 **`cdk`** 命令及 **`destroy`** 操作和堆栈名称。

```
cdk destroy HelloCdkStack
```

当系统提示删除堆栈时，请键入 `y`，然后按 `Enter` 键。

如果成功，则输出将显示 `HelloCdkStack` 堆栈已删除且没有错误。

### 步骤 4.2：删除环境
<a name="step-4-2-delete-the-envtitle"></a>

要删除环境，请参阅 [删除中的环境 AWS Cloud9](delete-environment.md)。