

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

# 将带 DynamoDB 的 Node.js 应用程序部署到 Elastic Beanstalk
<a name="nodejs-dynamodb-tutorial"></a>

本教程及其示例应用程序 [nodejs-example-dynamo.zip](samples/nodejs-example-dynamo.zip) 将引导您完成部署 Node.js 应用程序的过程，该应用程序使用 Node.js JavaScript 中的 AWS 软件开发工具包与亚马逊 DynamoDB 服务进行交互。您将创建一个 DynamoDB 表，该表位于与环境分离的数据库或外部数据库中。 AWS Elastic Beanstalk 您还将配置应用程序以使用解耦数据库。在生产环境中，最佳做法是使用与 Elastic Beanstalk 环境解耦的数据库，使其独立于环境的生命周期。这种做法还使您能够执行[蓝绿部署](using-features.CNAMESwap.md)。

以下示例应用程序说明下列情况：
+ 存储用户提供的文本数据的 DynamoDB 表。
+ 用于创建表的[配置文件](ebextensions.md)。
+ Amazon Simple Notification Service 主题。
+  使用 [package.json 文件](nodejs-platform-dependencies.md#nodejs-platform-packagejson)在部署期间安装程序包。

**Topics**
+ [先决条件](#nodejs-dynamodb-tutorial-prereqs)
+ [创建 Elastic Beanstalk 环境](#nodejs-dynamodb-tutorial-launch)
+ [向环境的实例添加权限](#nodejs-dynamodb-tutorial-role)
+ [部署示例应用程序](#nodejs-dynamodb-tutorial-deploy)
+ [创建 DynamoDB 表](#nodejs-dynamodb-tutorial-database)
+ [更新应用程序的配置文件](#nodejs-dynamodb-tutorial-update)
+ [为您的环境配置高可用性](#nodejs-dynamodb-tutorial-configure)
+ [清理](#nodejs-dynamodb-tutorial-cleanup)
+ [后续步骤](#nodejs-dynamodb-tutorial-nextsteps)

## 先决条件
<a name="nodejs-dynamodb-tutorial-prereqs"></a>

本教程需要以下先决条件：
+ Node.js 运行时
+ 默认 Node.js 程序包管理器软件 npm
+ Express 命令行生成器
+ Elastic Beanstalk 命令行界面 (EB CLI)

有关安装列出的前三个组件和设置本地开发环境的详细信息，请参阅 [为 Elastic Beanstalk 设置 Node.js 开发环境](nodejs-devenv.md)。在本教程中，您无需安装 AWS 适用于 Node.js 的 SDK，参考主题中也提到了这一点。

有关安装和配置 EB CLI 的详细信息，请参阅 [使用设置脚本安装 EB CLI（推荐）](eb-cli3.md#eb-cli3-install) 和 [配置 EB CLI](eb-cli3-configuration.md)。

## 创建 Elastic Beanstalk 环境
<a name="nodejs-dynamodb-tutorial-launch"></a>

**您的应用程序目录**  
本教程为应用程序源包使用名为 `nodejs-example-dynamo` 的目录。为本教程创建 `nodejs-example-dynamo` 目录。

```
~$ mkdir nodejs-example-dynamo
```

**注意**  
本章中的每个教程都为应用程序源包使用自己的目录。该目录名称与教程使用的示例应用程序的名称相匹配。

将您当前的工作目录更改为 `nodejs-example-dynamo`。

```
~$ cd nodejs-example-dynamo
```

现在，让我们设置运行 Node.js 平台和示例应用程序的 Elastic Beanstalk 环境。我们将使用 Elastic Beanstalk 命令行界面（EB CLI）。

**要为您的应用程序配置 EB CLI 存储库，并创建运行 Node.js 平台的 Elastic Beanstalk 环境**

1. 使用 **[**eb init**](eb3-init.md)** 命令创建存储库。

   ```
   ~/nodejs-example-dynamo$ eb init --platform node.js --region <region>
   ```

   此命令在名为 `.elasticbeanstalk` 的文件夹中创建配置文件，该配置文件指定用于为您的应用程序创建环境的设置；并创建以当前文件夹命名的 Elastic Beanstalk 应用程序。

1. 使用 **[**eb create**](eb3-create.md)** 命令创建运行示例应用程序的环境。

   ```
   ~/nodejs-example-dynamo$ eb create --sample nodejs-example-dynamo
   ```

   此命令使用 Node.js 平台的默认设置以及以下资源来创建负载均衡环境：
   + **EC2 实例** — 配置为在您选择的平台上运行 Web 应用程序的亚马逊弹性计算云 (Amazon EC2) 虚拟机。

     各平台运行一组特定软件、配置文件和脚本以支持特定的语言版本、框架、Web 容器或其组合。大多数平台使用 Apache 或 NGINX 作为 Web 应用程序前的反向代理，向其转发请求、提供静态资产以及生成访问和错误日志。
   + **实例安全组** — 配置为允许端口 80 上的入站流量的 Amazon EC2 安全组。此资源允许来自负载均衡器的 HTTP 流量到达运行您的 Web 应用程序的 EC2 实例。默认情况下，其他端口不允许流量进入。
   + **负载均衡器** – 配置为向运行您的应用程序的实例分配请求的 Elastic Load Balancing 负载均衡器。负载均衡器还使您无需将实例直接公开在 Internet 上。
   + **负载均衡器安全组**-配置为允许端口 80 上的入站流量的 Amazon EC2 安全组。利用此资源，HTTP 流量可从 Internet 到达负载均衡器。默认情况下，其他端口不允许流量进入。
   + **Auto Scaling 组** – 配置为在实例终止或不可用时替换实例的 Auto Scaling 组。
   + **Amazon S3 存储桶** – 使用 Elastic Beanstalk 时创建的源代码、日志和其他构件的存储位置。
   + **Amazon CloudWatch CloudWatch 警**报 — 两个警报，用于监控您环境中实例的负载，并在负载过高或过低时触发。警报触发后，您的 Auto Scaling 组会扩展或收缩以进行响应。
   + **CloudFormation 堆栈** — Elastic CloudFormation Beanstalk 用于在您的环境中启动资源并传播配置更改。这些资源在您可通过 [CloudFormation 控制台](https://console.aws.amazon.com/cloudformation)查看的模板中定义。
   + **域名**-以表单形式路由到您的 Web 应用程序的域名**subdomain*。 *region*.elasticbeanstalk.com。*
**域安全**  
为增强 Elastic Beanstalk 应用程序的安全性，已将 *elasticbeanstalk.com* 域注册到 [公共后缀列表（PSL）](https://publicsuffix.org/)。  
如果您需要在 Elastic Beanstalk 应用程序的默认域名中设置敏感 Cookie，我们建议您使用带有前缀 `__Host-` 的 Cookie 来提高安全性。这种做法可以保护您的域免遭跨站点请求伪造（CSRF）攻击。要了解更多信息，请参阅 Mozilla 开发者网络中的 [Set-Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes) 页面。

1. 当环境创建完成后，使用 [**eb open**](eb3-open.md) 命令在默认浏览器中打开环境 URL。

   ```
   ~/nodejs-example-dynamo$ eb open
   ```

您现在已经使用示例应用程序创建了 Node.js Elastic Beanstalk 环境。您可以使用自己的应用程序对其进行更新。接下来，我们会更新示例应用程序，以使用 Express 框架。

## 向环境的实例添加权限
<a name="nodejs-dynamodb-tutorial-role"></a>

您的应用程序在负载均衡器后面的一个或多个 EC2 实例上运行，为来自 Internet 的 HTTP 请求提供服务。当它收到要求其使用 AWS 服务的请求时，应用程序会使用其运行的实例的权限来访问这些服务。

该示例应用程序使用实例权限向 DynamoDB 表写入数据，并使用 Node.js 中的软件开发工具包向亚马逊 SNS 主题发送通知。 JavaScript 将以下托管策略添加到默认[实例配置文件](concepts-roles-instance.md)中，以授予环境中的 EC2 实例访问 DynamoDB 和 Amazon SNS 的权限：
+ **AmazonDynamoDBFull访问**
+ **亚马逊SNSFull访问权限**

**向默认实例配置文件添加策略**

1. 在 IAM 控制台中，打开 [Roles](https://console.aws.amazon.com/iam/home#roles)（角色）页面。

1. 选择 **aws-elasticbeanstalk-ec2 个角色**。

1. 在 **Permissions**（权限）选项卡上，选择 **Attach policies**（附加策略）。

1. 选择适用于应用程序使用的附加服务的托管策略。在本教程中，请选择 `AmazonSNSFullAccess` 和 `AmazonDynamoDBFullAccess`。

1. 选择**附加策略**。

请参阅 [管理 Elastic Beanstalk 实例配置文件](iam-instanceprofile.md) 以了解有关管理实例配置文件的更多信息。

## 部署示例应用程序
<a name="nodejs-dynamodb-tutorial-deploy"></a>

现在，您的环境已准备就绪，可以部署和运行本教程的示例应用程序：[nodejs-example-dynamo.zip。](samples/nodejs-example-dynamo.zip)

**要部署和运行教程示例应用程序**

1. 将当前工作目录更改为应用程序目录 `nodejs-example-dynamo`。

   ```
   ~$ cd nodejs-example-dynamo
   ```

1. 将示例应用程序源包 [nodejs-example-dynamo.zip 的内容下载并解压缩](samples/nodejs-example-dynamo.zip)到应用程序目录中`nodejs-example-dynamo`。

1. 使用 [**eb deploy**](eb3-deploy.md) 命令将示例应用程序部署到您的 Elastic Beanstalk 环境。

   ```
   ~/nodejs-example-dynamo$ eb deploy
   ```
**注意**  
默认情况下，`eb deploy` 命令会创建项目文件夹的 ZIP 文件。您可以将 EB CLI 配置为从构建过程部署工件而不是创建项目文件夹 ZIP 文件。有关更多信息，请参阅 [部署构件而不是项目文件夹](eb-cli3-configuration.md#eb-cli3-artifact)。

1. 当环境创建完成后，使用 [**eb open**](eb3-open.md) 命令在默认浏览器中打开环境 URL。

   ```
   ~/nodejs-example-dynamo$ eb open
   ```

此站点将收集用户联系信息并使用 DynamoDB 表来存储数据。要添加条目，请选择 **Sign up today**（立即注册），输入名称和电子邮件地址，然后选择 **Sign Up\$1**（注册\$1）。Web 应用程序会将表单内容写入表并触发 Amazon SNS 电子邮件通知。

![\[Startup landing page with teaser message and sign-up button for upcoming product launch.\]](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/images/nodejs-dynamodb-tutorial-app.png)


现在，Amazon SNS 主题已使用通知的占位符电子邮件进行配置。您很快将更新该配置，但同时您可以在 AWS 管理控制台管理控制台中验证 DynamoDB 表和 Amazon SNS 主题。

**查看表**

1. 在 DynamoDB 控制台中打开 [Tables（表）页面](https://console.aws.amazon.com/dynamodb/home?#tables:)。

1. 找到应用程序创建的表。该名称以 **awseb 开头并包含**。**StartupSignupsTable**

1. 选择表，选择 **Items**（项目），然后选择 **Start search**（开始搜索）以查看表中所有项目。

在注册站点提交的每个电子邮件地址在表中都有一个条目。除了写入表，应用程序还会向具有两个订阅的 Amazon SNS 主题发送一条消息，一个订阅用于向您发送电子邮件通知，另一个订阅用于某个 Amazon Simple Queue Service 队列，工作线程应用程序可从该队列中读取数据，以处理请求和向感兴趣的客户发送电子邮件。

**查看主题**

1. 在 Amazon SNS 控制台中打开 [Topics（主题）页面](https://console.aws.amazon.com/sns/v2/home?#/topics)。

1. 找到应用程序创建的主题。该名称以 **awseb 开头并包含**。**NewSignupTopic**

1. 选择主题以查看其订阅。

应用程序 (`[app.js](https://github.com/awslabs/eb-node-express-sample/blob/master/app.js)`) 将定义两个路由。根路径 (`/`) 返回从嵌入式 JavaScript (EJS) 模板呈现的网页，其中包含用户填写的表单以注册其姓名和电子邮件地址。提交表单会将一个 POST 请求和表单数据发送到 `/signup` 路由，后者将一个条目写入到 DynamoDB 表并将一条消息发布到 Amazon SNS 主题，以将注册通知所有者。

示例应用程序包括创建由应用程序使用的 DynamoDB 表、Amazon SNS 主题和 Amazon SQS 队列的[配置文件](ebextensions.md)。这可让您创建一个新的环境并立即测试功能，但有将 DynamoDB 表绑定到环境的缺点。对于生产环境，您应在环境外创建 DynamoDB 表，以免在您终止环境或更新其配置时将表丢失。

## 创建 DynamoDB 表
<a name="nodejs-dynamodb-tutorial-database"></a>

要将外部 DynamoDB 表用于在 Elastic Beanstalk 中运行的应用程序，请首先在 DynamoDB 中创建表。当您在 Elastic Beanstalk 外部创建表时，它完全独立于 Elastic Beanstalk 和您的 Elastic Beanstalk 环境，并且不会由 Elastic Beanstalk 终止。

使用以下设置创建表：
+ **Table name**（表名称）**nodejs-tutorial** – 
+ **Primary key**（主键）**email** – 
+ 主键类型 - **String**

**创建 DynamoDB 表**

1. 在 DynamoDB 管理控制台中打开 [Tables（表）页面](https://console.aws.amazon.com/dynamodb/home?#tables:)。

1. 选择**创建表**。

1. 键入**表名称**和**主键**。

1. 选择主键类型。

1. 选择**创建**。

## 更新应用程序的配置文件
<a name="nodejs-dynamodb-tutorial-update"></a>

更新应用程序源中的[配置文件](ebextensions.md)以使用 **nodejs-tutorial** 表，而不必创建一个新的表。

**要更新示例应用程序以供生产用**

1. 将当前工作目录更改为应用程序目录 `nodejs-example-dynamo`。

   ```
   ~$ cd nodejs-example-dynamo
   ```

1. 打开 `.ebextensions/options.config` 并更改以下设置的值：
   + **NewSignupEmail**— 您的电子邮件地址。
   + **STARTUP\$1SIGNUP\$1TABLE** – **nodejs-tutorial**

     
**Example .ebextensions/options.config**  

   ```
   option_settings:
     aws:elasticbeanstalk:customoption:
       NewSignupEmail: you@example.com
     aws:elasticbeanstalk:application:environment:
       THEME: "flatly"
       AWS_REGION: '`{"Ref" : "AWS::Region"}`'
       STARTUP_SIGNUP_TABLE: nodejs-tutorial
       NEW_SIGNUP_TOPIC: '`{"Ref" : "NewSignupTopic"}`'
     aws:elasticbeanstalk:container:nodejs:
       ProxyServer: nginx
     aws:elasticbeanstalk:container:nodejs:staticfiles:
       /static: /static
     aws:autoscaling:asg:
       Cooldown: "120"
     aws:autoscaling:trigger:
       Unit: "Percent"
       Period: "1"
       BreachDuration: "2"
       UpperThreshold: "75"
       LowerThreshold: "30"
       MeasureName: "CPUUtilization"
   ```

   这将为应用程序应用以下配置：
   + Amazon SNS 主题用于通知的电子邮件地址已设置为您的地址，或您在 `options.config` 文件中输入的地址。
   + 将使用 **nodejs-tutorial** 表，而不是由 `.ebextensions/create-dynamodb-table.config` 创建的表。

1. 删除 `.ebextensions/create-dynamodb-table.config`。

   ```
   ~/nodejs-tutorial$ rm .ebextensions/create-dynamodb-table.config
   ```

   您下一次部署应用程序时，此配置文件创建的表将被删除。

1. 使用 [**eb deploy**](eb3-deploy.md) 命令将更新的应用程序部署到您的 Elastic Beanstalk 环境。

   ```
   ~/nodejs-example-dynamo$ eb deploy
   ```

1. 当环境创建完成后，使用 [**eb open**](eb3-open.md) 命令在默认浏览器中打开环境 URL。

   ```
   ~/nodejs-example-dynamo$ eb open
   ```

部署时，Elastic Beanstalk 将更新 Amazon SNS 主题的配置并删除它在您部署应用程序的第一个版本时创建的 DynamoDB 表。

现在，当您终止环境时，**nodejs-tutorial** 表将不会被删除。这可让您执行蓝/绿部署、修改配置文件或关闭您的网站而不会有丢失数据的风险。

在浏览器中打开您的站点并验证表单是否按预期运行。创建一些条目，然后检查 DynamoDB 控制台以验证表。

**查看表**

1. 在 DynamoDB 控制台中打开 [Tables（表）页面](https://console.aws.amazon.com/dynamodb/home?#tables:)。

1. 查找 **nodejs-tutorial** 表。

1. 选择表，选择 **Items**（项目），然后选择 **Start search**（开始搜索）以查看表中所有项目。

您也可以看到 Elastic Beanstalk 删除了之前创建的表。

## 为您的环境配置高可用性
<a name="nodejs-dynamodb-tutorial-configure"></a>

最后，使用较高的最低实例计数配置您环境的 Auto Scaling 组。请始终至少运行两个实例，以防止您环境中的 Web 服务器发生单点故障，并支持您在不中断站点服务的情况下部署更改。

**配置您的环境的 Auto Scaling 组以获得高可用性**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 在导航窗格中，选择 **Configuration (配置)**。

1. 在 **Capacity (容量)** 配置类别中，选择 **Edit (编辑)**。

1. 在 **Auto Scaling group**（Auto Scaling 组）部分中，将 **Min instances**（最小实例数）设置为 **2**。

1. 要保存更改，请选择页面底部的 **Apply**（应用）。

## 清理
<a name="nodejs-dynamodb-tutorial-cleanup"></a>

演示代码使用完毕后，您可以终止环境。[Elastic Beanstalk 会删除 AWS 所有相关资源，[例如 EC2 亚马逊](using-features.managing.ec2.md)[实例、数据库实例、](using-features.managing.db.md)负载均衡器[、安全组](using-features.managing.elb.md)和警报。](using-features.alarms.md#using-features.alarms.title)

移除资源不会删除 Elastic Beanstalk 应用程序，因此您可以随时为您的应用程序创建新环境。

**从控制台终止 Elastic Beanstalk 环境**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 选择 **Actions**（操作），然后选择 **Terminate environment**（终止环境）。

1. 使用屏幕上的对话框确认环境终止。

还可以删除由您创建的外部 DynamoDB 表。

**删除 DynamoDB 表**

1. 在 DynamoDB 控制台中打开 [Tables（表）页面](https://console.aws.amazon.com/dynamodb/home?#tables:)。

1. 选择表。

1. 选择**操作**，然后选择**删除表**。

1. 选择**删除**。

## 后续步骤
<a name="nodejs-dynamodb-tutorial-nextsteps"></a>

示例应用程序使用配置文件来配置软件设置并创建 AWS 资源作为环境的一部分。请参阅 [使用配置文件 (`.ebextensions`) 进行高级环境自定义](ebextensions.md) 以了解有关配置文件及其用途的详细信息。

本教程的示例应用程序使用适用于 Node.js 的 Express Web 框架。有关 Express 的更多信息，请参阅 [expressjs.com](https://expressjs.com) 上的官方文档。

最后，如果您计划在生产环境中使用应用程序，请为环境[配置自定义域名](customdomains.md)并为安全连接[启用 HTTPS](configuring-https.md)。