

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

# 使用 AWS CDK 部署多堆栈应用程序 TypeScript
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript"></a>

*Rahul Sharad Gaikwad 博士，Amazon Web Services*

## Summary
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-summary"></a>

此模式提供了 step-by-step一种使用 AWS Cloud Development Kit (AWS CDK) 在亚马逊网络服务 (AWS) 上部署应用程序的方法。 TypeScript例如，该模式部署无服务器实时分析应用程序。

此模式可构建和部署嵌套堆栈应用程序。父 AWS CloudFormation 堆栈调用子堆栈或嵌套堆栈。 每个子堆栈都构建和部署堆 CloudFormation 栈中定义的 AWS 资源。AWS CDK Toolkit，即命令行界面 (CLI) 命令`cdk`，是 CloudFormation 堆栈的主要接口。

## 先决条件和限制
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 现有虚拟私有云（VPC）和子网
+ AWS CDK Toolkit 已安装并配置
+ 具有管理员权限且配备一组访问密钥的用户。
+ Node.js
+ AWS 命令行界面（AWS CLI）

**限制**
+ 由于 AWS CDK 使用 AWS CloudFormation，因此 AWS CDK 应用程序受 CloudFormation 服务配额的限制。有关更多信息，请参阅 [AWS CloudFormation 配额](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html)。

**产品版本**

此模式已使用以下工具和版本构建和测试。
+ AWS CDK Toolkit 1.83.0
+ Node.js 14.13.0
+ npm 7.0.14

此模式应该适用于任何版本的 AWS CDK 或 npm。请注意，13.0.0 至 13.6.0 版本的 Node.js 与 AWS CDK 不兼容。

## 架构
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-architecture"></a>

**目标技术堆栈**
+ AWS Amplify Console
+ Amazon API Gateway
+ AWS CDK
+ Amazon CloudFront
+ Amazon Cognito
+ Amazon DynamoDB
+ Amazon Data Firehose
+ Amazon Kinesis Data Streams
+ AWS Lambda
+ Amazon Simple Storage Service(Amazon S3)

**目标架构**

下图显示了使用带有 AWS CDK 的多堆栈应用程序部署。 TypeScript

![\[VPC 中的堆栈架构，具有一个父堆栈和两个包含资源的子堆栈。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/0ac29a11-1362-4084-92ed-6b85205763ca/images/8f92e86a-aa3d-4f8a-9b11-b92c52a7226c.png)


 

下图显示了示例无服务器实时应用程序架构。

![\[该区域的应用程序架构。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/0ac29a11-1362-4084-92ed-6b85205763ca/images/2df00faf-f871-4aec-9655-19ba2eb14cf8.png)


 

## 工具
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-tools"></a>

**工具**
+ [AWS Amplify Console](https://docs.aws.amazon.com/amplify/latest/userguide/welcome.html) 是在 AWS 中部署全栈网络和移动应用程序的控制中心。Amplify Console hosting 提供了基于 Git 的工作流程，用于托管持续部署的全栈无服务器 Web 应用程序。管理用户界面是一个为前端 Web 和移动开发人员提供的可视化界面，使其可以在 Amazon Web Services Console 外部创建和管理应用程序后端。
+ A@@ [mazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 是一项 AWS 服务，用于创建、发布、维护、监控和保护任何规模的 RES WebSocket APIs T、HTTP。
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) 是一个软件开发框架，可帮助您在代码中定义和预调配 Amazon Web Services Cloud 基础设施。
+ [AWS CDK Toolkit](https://docs.aws.amazon.com/cdk/latest/guide/cli.html) 是一个命令行云开发套件，可帮助您与 AWS CDK 应用程序进行交互。`cdk`CLI 命令是与 AWS CDK 应用程序交互的主要工具。它运行您的应用程序，查询您定义的应用程序模型，并生成和部署由 AWS CDK 生成的 AWS CloudFormation 模板。
+ [亚马逊 CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html)是一项网络服务，可加快静态和动态网页内容（例如.html、.css、.js 和图像文件）的分发。 CloudFront 通过名为边缘位置的全球数据中心网络提供内容，以降低延迟并提高性能。
+ [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) 为您的 Web 和移动应用程序提供身份验证、授权和用户管理。您的用户可以直接登录，也可通过第三方登录。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一种全托管 NoSQL 数据库服务，提供快速而可预测的性能，能够实现无缝扩展。
+ [Amazon Data Firehose 是一项完全托管](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html)的服务，用于向亚马逊 S3、亚马逊 Redshift、 OpenSearch 亚马逊服务、Splunk 等目的地以及受支持的第三方服务提供商拥有的任何自定义 HTTP 终端节点或 HTTP 终端节点提供实时[流式传输数据](https://aws.amazon.com/streaming-data/)。
+ [Amazon Kinesis Data Streams](https://docs.aws.amazon.com/streams/latest/dev/introduction.html) 是一项实时收集和处理大型数据记录流的服务。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，支持无需预置或管理服务器即可运行代码。只有在需要时 Lambda 才运行您的代码，并且能自动扩缩，从每天几个请求扩展到每秒数千个请求。您只需为消耗的计算时间付费 - 代码未运行时不产生费用。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。

**代码**

此模式代码已随附。

## 操作说明
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-epics"></a>

### 安装 AWS CDK Toolkit
<a name="install-aws-cdk-toolkit"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装 AWS CDK Toolkit。 | 若要在全局安装 AWS CDK Toolkit，请运行以下命令。`npm install -g aws-cdk` | DevOps | 
| 验证 版本。 | 若要验证 AWS CDK Toolkit 的版本，请运行以下命令。 `cdk --version` | DevOps | 

### 设置 AWS 凭证
<a name="set-up-aws-credentials"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置凭证。 | 若要设置凭证，请运行 `aws configure` 命令并按照提示进行操作。<pre>$aws configure<br />AWS Access Key ID [None]: <br />AWS Secret Access Key [None]: your_secret_access_key<br />Default region name [None]:<br />Default output format [None]:</pre> | DevOps | 

### 下载项目代码
<a name="download-the-project-code"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 下载随附的项目代码。 | 有关目录和文件结构的更多信息，请参阅*其他信息*部分。 | DevOps | 

### 引导 AWS CDK 环境
<a name="bootstrap-the-aws-cdk-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 引导 环境。 | 要将 AWS CloudFormation 模板部署到您要使用的账户和 AWS 区域，请运行以下命令。`cdk bootstrap <account>/<Region>`有关更多信息，请参阅 [AWS 文档](https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html)。 | DevOps | 

### 构建并部署项目
<a name="build-and-deploy-the-project"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 构建 项目。 | 若要构建项目代码，请运行 `npm run build` 命令。 | DevOps | 
| 部署项目。 | 若要部署项目代码，请运行 `cdk deploy` 命令。 |  | 

### 验证输出
<a name="verify-outputs"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证堆栈创建。 | 在 AWS 管理控制台上，选择**CloudFormation**。在项目的堆栈中，验证是否已创建了一个父堆栈和两个子堆栈。 | DevOps | 

### 测试应用程序
<a name="test-the-application"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将数据发送至 Kinesis 数据流。 | 配置您的 Amazon Web Services account，以使用 Amazon Kinesis Data Generator (KDG) 将数据发送至 Kinesis Data Streams。有关更多信息，请参阅 [Amazon Kinesis Data Generator](https://awslabs.github.io/amazon-kinesis-data-generator/web/help.html)。 | DevOps | 
| 创建 Amazon Cognito 用户。 | [要创建 Amazon Cognito 用户，请从 Kinesis 数据生成器帮助页面的 “创建*亚马逊 Cognito 用户” 部分下载 cognito-setup.j CloudFormation son* 模板。](https://awslabs.github.io/amazon-kinesis-data-generator/web/help.html)初始化模板，然后输入 Amazon Cognito **用户名**和**密码**。**输出**选项卡列出了 Kinesis Data Generator URL。 | DevOps | 
| 登录至 Kinesis Data Generator | 若要登录 KDG，请使用您提供的 Amazon Cognito 凭证和 Kinesis Data Generator URL。 | DevOps | 
| 测试应用程序。 | 在 KDG 的**记录模板**、**模板 1** 中，粘贴*其他信息*部分中的测试代码，然后选择**发送数据**。 | DevOps | 
| 测试 API 网关。 | 提取数据后，使用 `GET` 方法检索数据，以测试 API 网关。 | DevOps | 

## 相关资源
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-resources"></a>

**参考**
+ [AWS Cloud Development Kit](https://aws.amazon.com/cdk/)
+ [AWS CDK 开启 GitHub](https://github.com/aws/aws-cdk)
+ [使用嵌套堆栈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html)
+ [AWS 示例 - 无服务器实时分析](https://github.com/aws-samples/serverless-realtime-analytics)

## 附加信息
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-additional"></a>

**目录与文件详细信息**

此模式设置了以下三个堆栈。
+ `parent-cdk-stack.ts` – 此堆栈充当父堆栈，并将两个子应用程序调用为嵌套堆栈。 
+ `real-time-analytics-poc-stack.ts` – 此嵌套堆栈包含基础设施和应用程序代码。
+ `real-time-analytics-web-stack.ts` – 此嵌套堆栈仅包含静态 Web 应用程序代码。

*重要文件及其功能*
+ `bin/real-time-analytics-poc.ts` – AWS CDK 应用程序的接入点。其可加载 `lib/` 定义的所有堆栈。
+ `lib/real-time-analytics-poc-stack.ts` – AWS CDK 应用程序堆栈的定义 (`real-time-analytics-poc`)。
+ `lib/real-time-analytics-web-stack.ts` – AWS CDK 应用程序堆栈的定义 (`real-time-analytics-web-stack`)。
+ `lib/parent-cdk-stack.ts` – AWS CDK 应用程序堆栈的定义 (`parent-cdk`)。
+ `package.json`— npm 模块清单，其中包含应用程序名称、版本和依赖项。
+ `package-lock.json` – 由 npm 维护。
+ `cdk.json` – 用于运行应用程序的工具包。
+ `tsconfig.json`— 项目的 TypeScript 配置。
+ `.gitignore` – Git 应从源代码中排除的文件列表。
+ `node_modules` – 由 npm 维护；包括项目的依赖项。

父堆栈中的以下代码部分将子应用程序调用为嵌套 AWS CDK 堆栈。

```
import * as cdk from '@aws-cdk/core';
import { Construct, Stack, StackProps } from '@aws-cdk/core';
import { RealTimeAnalyticsPocStack } from './real-time-analytics-poc-stack';
import { RealTimeAnalyticsWebStack } from './real-time-analytics-web-stack';


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


    new RealTimeAnalyticsPocStack(this, 'RealTimeAnalyticsPocStack');
    new RealTimeAnalyticsWebStack(this, 'RealTimeAnalyticsWebStack');
  }
}
```

**测试代码**

```
session={{date.now('YYYYMMDD')}}|sequence={{date.now('x')}}|reception={{date.now('x')}}|instrument={{random.number(9)}}|l={{random.number(20)}}|price_0={{random.number({"min":10000, "max":30000})}}|price_1={{random.number({"min":10000, "max":30000})}}|price_2={{random.number({"min":10000, "max":30000})}}|price_3={{random.number({"min":10000, "max":30000})}}|price_4={{random.number({"min":10000, "max":30000})}}|price_5={{random.number({"min":10000, "max":30000})}}|price_6={{random.number({"min":10000, "max":30000})}}|price_7={{random.number({"min":10000, "max":30000})}}|price_8={{random.number({"min":10000, "max":30000})}}|
```

**正在测试 API 网关**

在 API Gateway 控制台上，使用 `GET` 方法测试 API Gateway。

![\[API Gateway 控制台，并已选择“选项”下的 GET。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/0ac29a11-1362-4084-92ed-6b85205763ca/images/452e5b8f-6d61-401d-8484-e5a436cb6f1b.png)


 

## 附件
<a name="attachments-0ac29a11-1362-4084-92ed-6b85205763ca"></a>

要访问与此文档相关联的其他内容，请解压以下文件：[attachment.zip](samples/p-attach/0ac29a11-1362-4084-92ed-6b85205763ca/attachments/attachment.zip)