

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

# 使用 Elastic Beanstalk 部署 Node.js 应用程序
<a name="create_deploy_nodejs"></a>

本章提供有关配置 Node.js Web 应用程序并将其部署到的说明 AWS Elastic Beanstalk。它还提供了常见任务（例如数据库集成和使用 Express 框架）的演练。Elastic Beanstalk 让您能够使用 Amazon Web Services 轻松部署、管理和扩展您的 Node.js Web 应用程序。

您可以使用 Elastic Beanstalk 命令行界面（EB CLI）或 Elastic Beanstalk 控制台在几分钟内部署您的应用程序。部署 Elastic Beanstalk 应用程序后，您可以继续使用 EB CLI 来管理您的应用程序和环境，也可以使用 Elastic Beanstalk 控制台或。 AWS CLI APIs

按照 step-by-step说明使用 [QuickStart 对于 Node.js](nodejs-quickstart.md) EB CLI 创建和部署 *Hello World* Node.js Web 应用程序。

**Topics**
+ [QuickStart: 将 Node.js 应用程序部署到 Elastic Beanstalk](nodejs-quickstart.md)
+ [为 Elastic Beanstalk 设置 Node.js 开发环境](nodejs-devenv.md)
+ [使用 Elastic Beanstalk Node.js 平台](create_deploy_nodejs.container.md)
+ [更多适用于 Node.js 的 Elastic Beanstalk 示例应用程序和教程](nodejs-getstarted.md)
+ [将 Node.js Express 应用程序部署到 Elastic Beanstalk](create_deploy_nodejs_express.md)
+ [将具有集群功能的 Node.js Express 应用程序部署到 Elastic Beanstalk](nodejs-express-clustering.md)
+ [将带 DynamoDB 的 Node.js 应用程序部署到 Elastic Beanstalk](nodejs-dynamodb-tutorial.md)
+ [将 Amazon RDS DB 实例添加到 Node.js Elastic Beanstalk 环境](create-deploy-nodejs.rds.md)
+ [Node.js 工具和资源](create_deploy_nodejs.resources.md)

# QuickStart: 将 Node.js 应用程序部署到 Elastic Beanstalk
<a name="nodejs-quickstart"></a>

本 QuickStart 教程将引导您完成创建 Node.js 应用程序并将其部署到 AWS Elastic Beanstalk 环境的过程。

**不用于生产用途**  
示例仅用于演示。请勿在生产环境中使用示例应用程序。

**Topics**
+ [你的 AWS 账户](#nodejs-quickstart-aws-account)
+ [先决条件](#nodejs-quickstart-prereq)
+ [步骤 1：创建 Node.js 应用程序](#nodejs-quickstart-create-app)
+ [步骤 2：在本地运行应用程序](#nodejs-quickstart-run-local)
+ [步骤 3：使用 EB CLI 部署 Node.js 应用程序](#nodejs-quickstart-deploy)
+ [步骤 4：在 Elastic Beanstalk 上运行应用程序](#nodejs-quickstart-run-eb-ap)
+ [第 5 步：清理](#go-tutorial-cleanup)
+ [AWS 您的应用程序的资源](#nodejs-quickstart-eb-resources)
+ [后续步骤](#nodejs-quickstart-next-steps)
+ [使用 Elastic Beanstalk 控制台进行部署](#nodejs-quickstart-console)

## 你的 AWS 账户
<a name="nodejs-quickstart-aws-account"></a>

如果您还不是 AWS 客户，则需要创建一个 AWS 帐户。注册后，您就可以访问 Elastic Beanstalk AWS 和其他所需的服务。

如果您已经有一个 AWS 帐户，则可以继续前进[先决条件](#nodejs-quickstart-prereq)。

### 创建一个 AWS 账户
<a name="nodejs-quickstart-aws-account-procedure"></a>

#### 注册获取 AWS 账户
<a name="sign-up-for-aws"></a>

如果您没有 AWS 账户，请完成以下步骤来创建一个。

**报名参加 AWS 账户**

1. 打开[https://portal.aws.amazon.com/billing/注册。](https://portal.aws.amazon.com/billing/signup)

1. 按照屏幕上的说明操作。

   在注册时，将接到电话或收到短信，要求使用电话键盘输入一个验证码。

   当您注册时 AWS 账户，就会创建*AWS 账户根用户*一个。根用户有权访问该账户中的所有 AWS 服务 和资源。作为最佳安全实践，请为用户分配管理访问权限，并且只使用根用户来执行[需要根用户访问权限的任务](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

AWS 注册过程完成后会向您发送一封确认电子邮件。您可以随时前往 [https://aws.amazon.com/](https://aws.amazon.com/)并选择 “**我的账户”，查看您当前的账户活动并管理您的账户**。

#### 创建具有管理访问权限的用户
<a name="create-an-admin"></a>

注册后，请保护您的安全 AWS 账户 AWS 账户根用户 AWS IAM Identity Center，启用并创建管理用户，这样您就不会使用 root 用户执行日常任务。

**保护你的 AWS 账户根用户**

1.  选择 **Root 用户**并输入您的 AWS 账户 电子邮件地址，以账户所有者的身份登录。[AWS 管理控制台](https://console.aws.amazon.com/)在下一页上，输入您的密码。

   要获取使用根用户登录方面的帮助，请参阅《AWS 登录 用户指南》**中的 [Signing in as the root user](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)。

1. 为您的根用户启用多重身份验证（MFA）。

   有关说明，请参阅 I [A *M* 用户指南中的为 AWS 账户 根用户启用虚拟 MFA 设备（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html)。

**创建具有管理访问权限的用户**

1. 启用 IAM Identity Center。

   有关说明，请参阅**《AWS IAM Identity Center 用户指南》中的[启用 AWS IAM Identity Center](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)。

1. 在 IAM Identity Center 中，为用户授予管理访问权限。

   有关使用 IAM Identity Center 目录 作为身份源的教程，请参阅《[用户*指南》 IAM Identity Center 目录中的使用默认设置配置AWS IAM Identity Center 用户*访问权限](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html)。

**以具有管理访问权限的用户身份登录**
+ 要使用您的 IAM Identity Center 用户身份登录，请使用您在创建 IAM Identity Center 用户时发送到您的电子邮件地址的登录 URL。

  有关使用 IAM Identity Center 用户[登录的帮助，请参阅*AWS 登录 用户指南*中的登录 AWS 访问门户](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)。

**将访问权限分配给其他用户**

1. 在 IAM Identity Center 中，创建一个权限集，该权限集遵循应用最低权限的最佳做法。

   有关说明，请参阅《AWS IAM Identity Center 用户指南》**中的 [Create a permission set](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)。

1. 将用户分配到一个组，然后为该组分配单点登录访问权限。

   有关说明，请参阅《AWS IAM Identity Center 用户指南》**中的 [Add groups](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)。

## 先决条件
<a name="nodejs-quickstart-prereq"></a>

为了遵循本指南中的步骤，您需要命令行终端或 Shell，以便运行命令。命令显示在列表中，以提示符（\$1）和当前目录名称（如果有）开头。

```
~/eb-project$ this is a command
this is output
```

在 Linux 和 macOS 中，您可使用您首选的 Shell 和程序包管理器。在 Windows 上，您可以[安装适用于 Linux 的 Windows 子系统](https://docs.microsoft.com/en-us/windows/wsl/install-win10)，以获取与 Windows 集成的 Ubuntu 和 Bash 版本。

### EB CLI
<a name="nodejs-quickstart-prereq.ebcli"></a>

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

### Node.js
<a name="nodejs-quickstart-prereq.runtime"></a>

按照 Node.js 网站上的 [How to install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs)，在本地计算机上安装 Node.js。

通过运行以下命令来验证您的 Node.js 安装。

```
~$ node -v
```

## 步骤 1：创建 Node.js 应用程序
<a name="nodejs-quickstart-create-app"></a>

创建项目目录。

```
~$ mkdir eb-nodejs
~$ cd eb-nodejs
```

接下来，创建一个您将使用 Elastic Beanstalk 部署的应用程序。我们将创建一个 “Hello World” RESTful 网络服务。

**Example `~/eb-nodejs/server.js`**  

```
const http = require('node:http');

const hostname = '127.0.0.1';
const port = 8080;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello Elastic Beanstalk!\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});
```

此应用程序在端口 8080 上打开侦听器。默认情况下，对于 Node.js，Elastic Beanstalk 通过端口 8080 将请求转发到您的应用程序。

## 步骤 2：在本地运行应用程序
<a name="nodejs-quickstart-run-local"></a>

运行以下命令以在本地运行您的应用程序。

```
~/eb-nodejs$ node server.js
```

您应该看到以下文本。

```
Server running at http://127.0.0.1:8080/
```

在您的网络浏览器中输入 URL 地址 `http://127.0.0.1:8080/`。浏览器应显示“Hello Elastic Beanstalk\$1”。

## 步骤 3：使用 EB CLI 部署 Node.js 应用程序
<a name="nodejs-quickstart-deploy"></a>

运行以下命令为此应用程序创建 Elastic Beanstalk 环境。

**创建环境和部署 Node.js 应用程序**

1. 使用 **eb init** 命令，初始化 EB CLI 存储库。

   ```
   ~/eb-nodejs$ eb init -p node.js nodejs-tutorial --region us-east-2
   ```

   此命令创建名为 `nodejs-tutorial` 的应用程序并配置您的本地存储库，以创建具有最新 Node.js 平台版本的环境。

1. （可选）**eb init**再次运行以配置默认密钥对，以便您可以使用 SSH 连接到运行应用程序的 EC2 实例。

   ```
   ~/eb-nodejs$ eb init
   Do you want to set up SSH for your instances?
   (y/n): y
   Select a keypair.
   1) my-keypair
   2) [ Create new KeyPair ]
   ```

   如果您已有密钥对，请选择一个，或按提示创建一个。如果您没有看到提示或需要以后更改设置，请运行 **eb init -i**。

1. 创建环境并使用 **eb create** 将应用程序部署到此环境中。Elastic Beanstalk 会自动为您的应用程序生成一个 zip 文件并将其 EC2 部署到环境中的实例。部署应用程序后，Elastic Beanstalk 会在端口 8080 上启动它。

   ```
   ~/eb-nodejs$ eb create nodejs-env
   ```

   Elastic Beanstalk 大约需要五分钟来创建您的环境。

## 步骤 4：在 Elastic Beanstalk 上运行应用程序
<a name="nodejs-quickstart-run-eb-ap"></a>

当创建环境的过程完成后，使用 **eb open** 打开您的网站。

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

恭喜您！您已使用 Elastic Beanstalk 部署了 Node.js 应用程序！这将使用为应用程序创建的域名打开一个浏览器窗口。

## 第 5 步：清理
<a name="go-tutorial-cleanup"></a>

应用程序使用完毕时，您可以终止您的环境。Elastic Beanstalk AWS 会终止与您的环境关联的所有资源。

要使用 EB CLI 终止您的 Elastic Beanstalk 环境，请运行以下命令。

```
~/eb-nodejs$ eb terminate
```

## AWS 您的应用程序的资源
<a name="nodejs-quickstart-eb-resources"></a>

您刚刚创建了一个单实例应用程序。它是一个简单的示例应用程序，只有一个 EC2 实例，因此不需要负载平衡或 auto Scaling。对于单实例应用程序，Elastic Beanstalk 会创建以下资源： AWS 
+ **EC2 实例** — 配置为在您选择的平台上运行 Web 应用程序的 Amazon EC2 虚拟机。

  各平台运行一组不同的软件、配置文件和脚本以支持特定的语言版本、框架、Web 容器或其组合。大多数平台使用 Apache 或 nginx 作为在 Web 应用程序前处理 Web 流量的反向代理，向其转发请求、提供静态资产以及生成访问和错误日志。
+ **实例安全组** — 配置为允许端口 80 上的传入流量的 Amazon EC2 安全组。此资源允许来自负载均衡器的 HTTP 流量到达运行您的 Web 应用程序的 EC2 实例。默认情况下，其他端口不允许流量进入。
+ **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 管理所有这些资源。当您终止环境时，Elastic Beanstalk 会终止其包含的所有资源。

## 后续步骤
<a name="nodejs-quickstart-next-steps"></a>

有了运行应用程序的环境以后，您随时可以部署新的应用程序版本或不同的应用程序。部署新应用程序版本的速度非常快，因为它不需要预置或重启 EC2 实例。您还可以使用 Elastic Beanstalk 控制台探索新环境。有关详细步骤，请参阅本指南*入门*一章中的[探索您的环境](GettingStarted.md#GettingStarted.Explore)。

**尝试更多教程**  
如果您想尝试包含不同示例应用程序的其他教程，请参阅 [更多适用于 Node.js 的 Elastic Beanstalk 示例应用程序和教程](nodejs-getstarted.md)。

部署一到两个示例应用程序并准备好开始在本地开发和运行 Node.js 应用程序后，请参阅 [为 Elastic Beanstalk 设置 Node.js 开发环境](nodejs-devenv.md)。

## 使用 Elastic Beanstalk 控制台进行部署
<a name="nodejs-quickstart-console"></a>

您还可以使用 Elastic Beanstalk 控制台来启动示例应用程序。有关详细步骤，请参阅本指南*入门*一章中的[创建示例应用程序](GettingStarted.md#GettingStarted.CreateApp)。

# 为 Elastic Beanstalk 设置 Node.js 开发环境
<a name="nodejs-devenv"></a>

本主题提供了设置 Node.js 开发环境以便在将应用程序部署到 AWS Elastic Beanstalk之前在本地对其进行测试的说明。它还引用了提供有用工具安装说明的网站。

**Topics**
+ [安装 Node.js。](#nodejs-devenv-nodejs)
+ [确认 npm 安装](#nodejs-devenv-npm)
+ [安装适用于 Node.js 的 AWS 软件开发工具包](#nodejs-devenv-awssdk)
+ [安装 Express 生成器](#nodejs-devenv-express)
+ [设置 Express 框架和服务器](#nodejs-devenv-express-framework)

## 安装 Node.js。
<a name="nodejs-devenv-nodejs"></a>

安装 Node.js 以在本地运行 Node.js 应用程序。如果您没有特别的要求，请获取 Elastic Beanstalk 支持的最新版本。有关受支持版本的列表，请参阅 *AWS Elastic Beanstalk 平台*文档中的 [Node.js](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)。

请从 [nodejs.org](https://nodejs.org/en/) 下载 Node.js。

## 确认 npm 安装
<a name="nodejs-devenv-npm"></a>

Node.js 使用 npm 程序包管理器帮助您安装要在应用程序中使用的工具和框架。由于 npm 是随 Node.js 一起分发的，因此在下载并安装 Node.js 时将自动安装 npm。要确认是否已安装 npm，可以运行以下命令：

```
$ npm -v
```

有关 npm 的更多信息，请访问 [npmjs](https://www.npmjs.com/get-npm) 网站。

## 安装适用于 Node.js 的 AWS 软件开发工具包
<a name="nodejs-devenv-awssdk"></a>

如果您需要从应用程序内部管理 AWS 资源，请在 Node.js JavaScript 中安装的 AWS 软件开发工具包。使用 npm 安装开发工具包：

```
$ npm install aws-sdk
```

[如需更多信息，请访问 Node.js 主页 JavaScript 中的软件AWS 开发工具包](https://aws.amazon.com/sdk-for-node-js/)。

## 安装 Express 生成器
<a name="nodejs-devenv-express"></a>

Express 是运行在 Node.js 上的 Web 应用程序框架。要使用它，请先安装 Express 生成器命令行应用程序。安装 Express 生成器后，您可以运行 **express** 命令为 Web 应用程序生成基础项目结构。安装基础项目、文件和依赖项后，就可以在开发计算机上启动本地 Express 服务器。

 

**注意**  
以下步骤向您演示了如何在 Linux 操作系统上安装 Express 生成器。
对于 Linux，根据您对系统目录的权限级别，可能需要为一些命令添加前缀 `sudo`。

**要在您的开发环境中安装 Express 生成器**

1. 为您的 Express 框架和服务器创建工作目录。

   ```
   ~$ mkdir node-express
   ~$ cd node-express
   ```

1. 全局安装 Express，以便您拥有 `express` 命令的访问权限。

   ```
   ~/node-express$ npm install -g express-generator
   ```

1. 根据操作系统，您可能需要设置路径才能运行 `express` 命令。如果您需要设置路径变量，则上一步的输出会提供信息。以下是 Linux 的示例。

   ```
   ~/node-express$ export PATH=$PATH:/usr/local/share/npm/bin/express
   ```

   当您按照本章中的教程进行操作时，需要从不同的目录运行 **express** 命令。每个教程都在其自己的目录中设置了基本的 Express 项目结构。

现在，您已经安装了 Express 命令行生成器。您可以使用它为 Web 应用程序创建框架目录、设置依赖项和启动 Web 应用程序服务器。接下来，将在创建的 `node-express` 目录中逐步执行完成此操作的步骤。

## 设置 Express 框架和服务器
<a name="nodejs-devenv-express-framework"></a>

按照以下步骤创建基本 Express 框架目录和内容。本章中的教程还包括在教程的每个应用程序目录中设置基础 Express 框架的步骤。

**要设置 Express 框架和服务器**

1. 运行 `express` 命令。这将生成 `package.json`、`app.js`，以及几个目录。

   ```
   ~/node-express$ express
   ```

   在系统提示您是否要继续时，键入 **y**。

1. 设置本地依赖项。

   ```
   ~/node-express$ npm install
   ```

1. 验证 Web 应用程序服务器是否已启动。

   ```
   ~/node-express$ npm start
   ```

   您应该可以看到类似于如下所示的输出内容：

   ```
   > nodejs@0.0.0 start /home/local/user/node-express
   > node ./bin/www
   ```

   默认情况下，服务器在端口 3000 上运行。要测试，请在另一个终端中运行 `curl http://localhost:3000`，或在本地计算机上打开浏览器并输入 URL 地址 `http://localhost:3000`。

   按 **Ctrl\$1C** 以停止该服务器。

# 使用 Elastic Beanstalk Node.js 平台
<a name="create_deploy_nodejs.container"></a>

本主题介绍如何在 Elastic Beanstalk 上配置、构建和运行 Node.js 应用程序。

AWS Elastic Beanstalk 为不同版本的 Node.js 编程语言支持多个平台分支。有关完整列表，请参阅 *AWS Elastic Beanstalk 平台*文档中的 [Node.js](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)。

Elastic Beanstalk 提供了[配置选项](command-options.md)，可供您用于自定义在 Elastic Beanstalk 环境中的 EC2 实例上运行的软件。您可[配置应用程序所需的环境变量](environments-cfg-softwaresettings.md#environments-cfg-softwaresettings-console)，启用到 Amazon S3 的日志轮换，并将应用程序源中包含静态文件的文件夹映射至代理服务器所提供的路径。

Elastic Beanstalk 控制台中提供了配置选项，可用于[修改运行环境的配置](environment-configuration-methods-after.md)。要避免在终止环境时丢失环境配置，可以使用[保存的配置](environment-configuration-savedconfig.md)来保存您的设置，并在以后将这些设置应用到其他环境。

要保存源代码中的设置，您可以包含[配置文件](ebextensions.md)。在您每次创建环境或部署应用程序时，会应用配置文件中的设置。您还可在部署期间使用配置文件来安装程序包、运行脚本以及执行其他实例自定义操作。

您可以在源包中[包含一个 `Package.json` 文件](nodejs-platform-dependencies.md#nodejs-platform-packagejson)，以便在部署期间安装软件包、提供 start 命令以及指定您希望应用程序使用的 Node.js 版本。您可以包含一个 [`npm-shrinkwrap.json` 文件](nodejs-platform-shrinkwrap.md)来锁定依赖项版本。

Node.js 平台包含一个代理服务器，以服务静态资产、将流量转发到应用程序和压缩响应。您可以[扩展或覆盖默认代理配置](nodejs-platform-proxy.md)，以适应高级方案。

可提供多个选项供您启动应用程序。您可以将 [Procfile](nodejs-configuration-procfile.md) 添加到源包来指定用于启动应用程序的命令。如果您不提供 `Procfile`，但提供 `package.json` 文件，则 Elastic Beanstalk 将运行 `npm start`。如果您未提供上述任一项，则 Elastic Beanstalk 会按此顺序查找 `app.js` 或 `server.js` 文件并运行该脚本。

在 Elastic Beanstalk 控制台中应用的设置会覆盖配置文件中的相同设置（如果存在）。这让您可以在配置文件中包含默认设置，并使用控制台中的特定环境设置加以覆盖。有关优先顺序和其他设置更改方法的更多信息，请参阅[配置选项](command-options.md)。

有关扩展 Elastic Beanstalk 基于 Linux 的平台的各种方法的详细信息，请参阅 [扩展 Elastic Beanstalk Linux 平台](platforms-linux-extend.md)。

## 配置您的 Node.js 环境
<a name="nodejs-platform-console"></a>

您可以使用 Node.js 平台设置来微调 Amazon EC2 实例的行为。您可以使用 Elastic Beanstalk 控制台编辑 Elastic Beanstalk 环境的 Amazon EC2 实例配置。

使用 Elastic Beanstalk 控制台启用到 Amazon S3 的日志轮换，并配置应用程序可从环境中读取的变量。

**在 Elastic Beanstalk 控制台中配置 Node.js 环境**

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

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

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

1. 在 **Updates, monitoring, and logging**（更新、监控和日志记录）配置类别中，选择 **Edit**（编辑）。

### 容器选项
<a name="nodejs-platform-console-settings"></a>

您可以指定以下特定于平台的选项：
+ **Proxy server**（代理服务器）– 要在环境实例上使用的代理服务器。默认使用 NGINX。

### 日志选项
<a name="nodejs-platform-console-logging"></a>

**日志选项**部分有两个设置：
+ **Instance profile**（实例配置文件）– 指定有权访问与应用程序关联的 Amazon S3 存储桶的实例配置文件。
+ **Enable log file rotation to Amazon S3**（启用到 Amazon S3 的日志轮换）– 指定是否将应用程序的 Amazon EC2 实例的日志文件复制到与应用程序关联的 Amazon S3 存储桶。

### 静态文件
<a name="nodejs-platform-console-staticfiles"></a>

为了提高性能，您可以使用 **Static files**（静态文件）部分配置代理服务器，以便从 Web 应用程序内的一组目录提供静态文件（例如 HTML 或图像）。对于每个目录，您都将虚拟路径设置为目录映射。当代理服务器收到对指定路径下的某个文件的请求时，它将直接提供此文件，而不是将请求路由至您的应用程序。

有关使用配置文件或 Elastic Beanstalk 控制台配置静态文件的详细信息，请参阅 [提供静态文件](environment-cfg-staticfiles.md)。

### 环境属性
<a name="nodejs-platform-console-envprops"></a>

使用 **Environment Properties**（环境属性）部分，在运行应用程序的 Amazon EC2 实例上指定环境配置设置。这些设置会以密钥值对的方式传递到应用程序。

在运行的Node.js环境中 AWS Elastic Beanstalk，您可以通过运行来访问环境变量`process.env.ENV_VARIABLE`。

```
var endpoint = process.env.API_ENDPOINT
```

Node.js 平台会将 PORT 环境变量设置为代理服务器将流量传输到的端口。有关更多信息，请参阅 [配置代理服务器](nodejs-platform-proxy.md)。

请参阅[环境变量和其他软件设置](environments-cfg-softwaresettings.md)了解更多信息。

### 配置 Amazon Linux AMI（在 Amazon Linux 2 之前）Node.js 环境
<a name="nodejs-platform-console.alami"></a>

仅在使用 Amazon Linux AMI 平台版本（在 Amazon Linux 2 之前）的 Elastic Beanstalk Node.js 环境中支持以下控制台软件配置类别。

**注意**  
本主题中的信息仅适用于基于亚马逊 Linux AMI (AL1) 的平台分支。 AL2023/AL2 平台分支与之前的 Amazon Linux AMI (AL1) 平台版本不兼容，*需要不同的配置设置*。
 [2022 年 7 月 18 日，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)**Elastic Beanstalk 将所有基于亚马逊 Linux AMI AL1 () 的平台分支的状态设置为停用。**有关迁移到当前且完全受支持的 Amazon Linux 2023 平台分支的更多信息，请参阅 [将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

#### 容器选项 — 亚马逊 Linux AMI (AL1)
<a name="nodejs-platform-console-settings"></a>

在配置页面上，指定以下内容：
+ **Proxy server**（代理服务器）– 指定要用来代理与 Node.js 连接的 Web 服务器。默认使用 NGINX。如果选择 **none**，则静态文件映射不会生效，并且 GZIP 压缩会被禁用。
+ **Node.js 版本** – 指定 Node.js 的版本。有关受支持的 Node.js 版本的列表，请参阅《AWS Elastic Beanstalk 平台》**指南中的 [https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)。
+ **GZIP compression**（Gzip 压缩）– 指定是否启用 GZIP 压缩。默认情况下已启用 GZIP 压缩。
+ **Node command**（节点命令）– 供您输入用于启动 Node.js 应用程序的命令。空字符串（默认值）表示 Elastic Beanstalk 将依次使用 `app.js`、`server.js` 和 `npm start`。

## Node.js 配置命名空间
<a name="nodejs-namespaces"></a>

您可以使用[配置文件](ebextensions.md)设置配置选项并在部署期间执行其他实例配置。配置选项可以[特定于平台](command-options-specific.md)，也可以应用于整个 Elastic Beanstalk 服务中的[所有平台](command-options-general.md)。配置选项被组织到*命名空间*中。

您可以使用 `aws:elasticbeanstalk:environment:proxy` 命名空间选择要在环境的实例上使用的代理。以下示例将您的环境配置为使用 Apache HTTPD 代理服务器。

**Example .ebextensions/nodejs-settings.config**  

```
option_settings:
  aws:elasticbeanstalk:environment:proxy:
    ProxyServer: apache
```

您可以使用 `aws:elasticbeanstalk:environment:proxy:staticfiles` 命名空间将代理配置为提供静态文件。有关更多信息以及示例，请参阅 [提供静态文件](environment-cfg-staticfiles.md)。

Elastic Beanstalk 提供了许多用于自定义环境的配置选项。除了配置文件之外，您还可使用控制台、保存的配置、EB CLI 或 AWS CLI来配置选项。请参阅[配置选项](command-options.md)了解更多信息。

## Amazon Linux AMI（在 Amazon Linux 2 之前）Node.js 平台
<a name="nodejs.alami"></a>

如果您的 Elastic Beanstalk Node.js 环境使用 Amazon Linux AMI 平台版本（在 Amazon Linux 2 之前），请考虑本节中的特定配置和建议。

**注意**  
本主题中的信息仅适用于基于亚马逊 Linux AMI (AL1) 的平台分支。 AL2023/AL2 平台分支与之前的 Amazon Linux AMI (AL1) 平台版本不兼容，*需要不同的配置设置*。
 [2022 年 7 月 18 日，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)**Elastic Beanstalk 将所有基于亚马逊 Linux AMI AL1 () 的平台分支的状态设置为停用。**有关迁移到当前且完全受支持的 Amazon Linux 2023 平台分支的更多信息，请参阅 [将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

### Node.js特定于平台的配置选项 — 亚马逊 Linux AMI () AL1
<a name="nodejs.alami.options"></a>

Elastic Beanstalk 支持用于 Amazon Linux AMI Node.js 平台版本的一些特定于平台的配置选项。可以选择先于应用程序运行的代理服务器，选择要运行的特定版本的 Node.js，并选择用于运行应用程序的命令。

对于代理服务器，您可以使用 NGINX 或 Apache 代理服务器。您可以将 `none` 值设置为 `ProxyServer` 选项。在这种设置下，Elastic Beanstalk 将您的应用程序作为独立项运行，而不是在任何代理服务器后面运行。如果您的环境运行独立应用程序，请更新您的代码以侦听 NGINX 将流量转发到的端口。

```
var port = process.env.PORT || 8080;

app.listen(port, function() {
  console.log('Server running at http://127.0.0.1:%s', port);
});
```

### Node.js语言版本 — 亚马逊 Linux AMI (AL1)
<a name="nodejs.alami.versions"></a>

在支持的语言版本方面，Node.js Amazon Linux AMI 平台与其他 Elastic Beanstalk 托管平台略有不同。这是因为每个 Node.js 平台版本均仅支持几个 Node.js 语言版本。有关受支持的 Node.js 版本的列表，请参阅《AWS Elastic Beanstalk 平台》**指南中的 [https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)。

您可以使用特定于平台的配置选项来设置语言版本。有关说明，请参阅[配置您的 Node.js 环境](#nodejs-platform-console)。或者，使用 Elastic Beanstalk 控制台在更新平台版本的过程中，更新您的环境使用的 Node.js 版本。

**注意**  
如果对您正在使用的 Node.js 版本的支持已从平台中移除，则您必须先更改或移除版本设置再进行[平台更新](using-features.platform.upgrade.md)。当在一个或多个 Node.js 版本中识别到安全漏洞时，可能会发生这种情况。  
发生这种情况时，尝试更新到不支持配置的平台的新版本会[NodeVersion](command-options-specific.md#command-options-nodejs)失败。为避免需要创建新环境，请将*NodeVersion*配置选项更改为旧平台版本和新平台版本都支持的 Node.js 版本，或者[删除该选项设置](environment-configuration-methods-after.md)，然后执行平台更新。

**在 Elastic Beanstalk 控制台中配置环境的 Node.js 版本**

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

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

1. 在环境概述页面上的 **Platform**（平台）下，选择 **Change**（更改）。

1. 在 **Update platform version**（更新平台版本）对话框中，选择 Node.js 版本。  
![\[Elastic Beanstalk 更新平台版本确认\]](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/images/platform-nodejs-update-node-version.png)

1. 选择**保存**。

### Node.js配置命名空间 — 亚马逊 Linux AMI () AL1
<a name="nodejs.alami.namespaces"></a>

Node.js Amazon Linux AMI 平台在 `aws:elasticbeanstalk:container:nodejs:staticfiles` 和 `aws:elasticbeanstalk:container:nodejs` 命名空间中定义附加选项。

以下配置文件将指示 Elastic Beanstalk 使用 `npm start` 运行应用程序。它也将代理类型设置为 Apache 并启用压缩。最后，它将代理配置为从两个源目录提供静态文件。一个源是来自 `statichtml` 源目录的网站根目录下的 `html` 路径的 HTML  文件。另一个源是来自 `staticimages` 源目录的网站根目录下的 `images` 路径的 HTML 文件。

**Example .ebextensions/node-settings.config**  

```
option_settings:
  aws:elasticbeanstalk:container:nodejs: 
    NodeCommand: "npm start"
    ProxyServer: apache
    GzipCompression: true
  aws:elasticbeanstalk:container:nodejs:staticfiles:
    /html: statichtml
    /images: staticimages
```

Elastic Beanstalk 提供了许多用于自定义环境的配置选项。除了配置文件之外，您还可使用控制台、保存的配置、EB CLI 或 AWS CLI来配置选项。请参阅[配置选项](command-options.md)了解更多信息。

# 在 Elastic Beanstalk 上使用 Procfile 配置自定义启动命令
<a name="nodejs-configuration-procfile"></a>

您可以在源包的根目录中包含一个名为 `Procfile` 的文件，来指定启动应用程序的命令。

**Example Procfile**  

```
web: node index.js
```

有关 `Procfile` 使用情况的信息，请参阅 [Buildfile 和 Procfile](platforms-linux-extend.build-proc.md)。

**注意**  
此功能将替换 `aws:elasticbeanstalk:container:nodejs` 命名空间中的旧 `NodeCommand` 选项。

# 配置您的应用程序对 Elastic Beanstalk 的依赖项
<a name="nodejs-platform-dependencies"></a>

您的应用程序可能有某些 Node.js 模块的依赖项，例如您在 `require()` 语句中指定的项。这些模块存储在 `node_modules` 目录中。当您的应用程序运行时，Node.js 将从此目录加载模块。有关更多信息，请参阅 Node.js 文档中的[从 node\$1modules 文件夹加载](https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders)。

您可以使用 `package.json` 文件指定这些模块依赖项。如果 Elastic Beanstalk 检测到此文件，但 `node_modules` 目录不存在，则 Elastic Beanstalk 将以 *webapp* 用户身份运行 `npm install`。`npm install` 命令将依赖项安装在 Elastic Beanstalk 事先创建的 `node_modules` 目录中。`npm install` 命令会从公共 npm 注册表或其他位置访问 `package.json` 文件中列出的软件包。有关更多信息，请参阅 [npm Docs](https://docs.npmjs.com/about-the-public-npm-registry) 网站。

如果 Elastic Beanstalk 检测到 `node_modules` 目录，则即使存在 `package.json` 文件，Elastic Beanstalk 也不会运行 `npm install`。Elastic Beanstalk 假设依赖项包在 `node_modules` 目录中可供 Node.js 访问和加载。

以下各部分提供有关为应用程序建立 Node.js 模块依赖项的更多信息。

**注意**  
如果您在 Elastic Beanstalk 运行 `npm install` 时遇到任何部署问题，请考虑其他方法。在您的应用程序源包中包括含依赖模块的 `node_modules` 目录。这样做可以避免在调查问题时从公共 npm 注册表安装依赖项时出现问题。由于依赖模块来自本地目录，这样做也可能有助于缩短部署时间。有关更多信息，请参阅 [在 node\$1modules 目录中包括 Node.js 依赖项](#nodejs-platform-nodemodules)。

## 使用 package.json 文件指定 Node.js 依赖项
<a name="nodejs-platform-packagejson"></a>

包含项目源的根目录中的 `package.json` 文件来指定依赖项包并提供启动命令。当 `package.json` 文件存在，且项目源的根目录中不存在 `node_modules` 目录时，Elastic Beanstalk 会以 *webapp* 用户的身份运行 `npm install` 来从公共 npm 注册表安装依赖项。Elastic Beanstalk 还使用 `start` 命令来启动您的应用程序。有关 `package.json` 文件的更多信息，请参阅 *npm Docs* 网站中的[在 `package.json` 文件中指定依赖项](https://docs.npmjs.com/specifying-dependencies-and-devdependencies-in-a-package-json-file)。

使用 `scripts` 关键字来提供启动命令。当前使用 `scripts` 关键字，而不是 `aws:elasticbeanstalk:container:nodejs` 命名空间中的原有 `NodeCommand` 选项。

**Example package.json - Express**  

```
{
    "name": "my-app",
    "version": "0.0.1",
    "private": true,
    "dependencies": {
      "ejs": "latest",
      "aws-sdk": "latest",
      "express": "latest",
      "body-parser": "latest"
    },
    "scripts": {
      "start": "node app.js"
    }
  }
```

**生产模式和开发依赖项**  
要在 `package.json` 文件中指定依赖项，请使用 *dependencies* 和 *devDependencies* 属性。*dependencies* 属性指定您的应用程序在生产中所需的软件包。*devDependencies* 属性指定仅本地开发和测试需要的软件包。

如果您需要安装 *devDependencies* 软件包，则请将 NPM\$1USE\$1PRODUCTION 环境属性设置为 `false`。使用此设置，在运行 npm install 时将不使用上述选项。这将导致 *devDependencies* 软件包被安装。

## 在 node\$1modules 目录中包括 Node.js 依赖项
<a name="nodejs-platform-nodemodules"></a>

要将依赖项程序包与应用程序代码一起部署到环境实例，请将它们包括在项目源根目录下名为 `node_modules` 的目录中。有关更多信息，请参阅 *npm Docs* 网站中的[在本地下载和安装软件包](https://docs.npmjs.com/downloading-and-installing-packages-locally)。

[当您将`node_modules`目录部署到 AL2023/AL2 Node.js平台版本时，Elastic Beanstalk 会假设您提供了自己的依赖包，并避免安装在 package.json 文件中指定的依赖项。](#nodejs-platform-packagejson) Node.js在`node_modules`目录中查找依赖关系。有关详细信息，请参阅 Node.js 文档中的[从 node\$1modules 文件夹加载](https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders)。

**注意**  
如果您在 Elastic Beanstalk 运行 `npm install` 时遇到任何部署问题，请在调查问题时考虑使用本主题中描述的方法作为解决方法。  
 

### 亚马逊 Linux 上的 Node.js 注意事项 2
<a name="nodejs-al2-considerations"></a>

如果你使用的是在 *Amazon Linux 2* 上运行*的 Node.js* 平台分支，请阅读本节。

#### 亚马逊 Linux 上的 Node.js 注意事项 2
<a name="nodejs-al2-considerations-detail"></a>

**注意**  
本主题中的信息适用于在 Amazon Linux 2 上运行的Node.js平台分支。此处的内容描述了与之不同的 AL2特定功能和行为。 AL2023

**命令变体**  
命令选项因应用程序运行的 Amazon Linux 2 平台分支中包含的 npm 版本而异。
+ npm v6 – 默认情况下，Elastic Beanstalk 在生产模式下安装依赖项。它使用命令 `npm install --production`。
+ npm v7 或更高版本 – Elastic Beanstalk 省略了 *devDependencies*。它使用命令 `npm install --omit=dev`。

上面列出的两个命令都没有安装属于 *devDependencies* 的软件包。

**Git 依赖关系的 SSH 和 HTTPS 协议**  
从 2023 年 3 月 7 日的 Amazon Linux 2 平台版本开始，你可以使用 SSH 和 HTTPS 协议从 Git 存储库中检索软件包。平台分支 Node.js 16 同时支持 SSH 和 HTTPS 协议。Node.js 14 仅支持 HTTPS 协议。

**Example package.json – Node.js 16 同时支持 HTTPS 和 SSH**  

```
    ...
    "dependencies": {
      "aws-sdk": "https://github.com/aws/aws-sdk-js.git",
      "aws-chime": "git+ssh://git@github.com:aws/amazon-chime-sdk-js.git"
    }
```

**版本和版本范围**  
使用 `package.json` 文件中的 `engines` 关键字指定您希望应用程序使用的 Node.js 版本。您还可以使用 npm 表示法指定版本范围。有关版本范围的语法的更多信息，请参阅 Node.js 网站上的[使用 npm 的语义版本控制](https://nodejs.dev/learn/semantic-versioning-using-npm)。Node.js `package.json` 文件中的 `engines` 关键字取代 `aws:elasticbeanstalk:container:nodejs` 命名空间中的原有 `NodeVersion` 选项。

**重要**  
指定版本范围的功能不适用于在其上运行的 Node.js 平台分支 AL2023。我们只支持特定 Node.js 分支中的一个 Node.js 版本 AL2023。如果您的 `package.json` 文件指定了版本范围，我们将忽略它并默认设为 Node.js 的平台分支版本。

**Example `package.json` – 单一 Node.js 版本**  

```
{
    ...
    "engines": { "node" : "14.16.0" }
  }
```

**Example `package.json` – Node.js 版本范围**  

```
{
    ...
    "engines": { "node" : ">=10 <11" }
  }
```

当指示版本范围时，Elastic Beanstalk 会安装该平台在该范围内可用的最新 Node.js 版本。在此示例中，范围指示版本必须大于或等于版本 10，但小于版本 11。因此，Elastic Beanstalk 安装了最新的 Node.js 版本 10.x.y，该版本在[支持的平台](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)上可用。

请注意，您只能指定与平台分支对应的 Node.js 版本。例如，如果您使用的是 Node.js 16 平台分支，则只能指定 16.x.y Node.js 版本。您可以使用 npm 支持的版本范围选项来提高灵活度。有关每个平台分支的有效 Node.js 版本，请参阅《AWS Elastic Beanstalk 平台》**指南中的 [https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)。

**注意**  
如果对您正在使用的 Node.js 版本的支持已从平台中移除，则您必须先更改或移除 Node.js 版本设置再进行[平台更新](using-features.platform.upgrade.md)。当在一个或多个 Node.js 版本中识别到安全漏洞时，可能会发生这种情况。  
发生此情况时，尝试更新到不支持所配置的 Node.js 版本的新平台版本会失败。为避免需要创建新环境，请将 `package.json` 中的 Node.js 版本设置更改为旧平台版本和新平台版本都支持的 Node.js 版本。您可以选择指定包含受支持版本的 Node.js 版本范围，如本主题前面所述。您还可以选择删除设置，然后部署新的源包。

# 在 Elastic Beanstalk 上使用 npm shrinkwrap 锁定依赖项
<a name="nodejs-platform-shrinkwrap"></a>

Node.js 平台将在您每次部署时以 *webapp* 用户身份运行 `npm install`。新版本的依赖项可用时，如果您部署应用程序，就会安装这些依赖项，这可能会导致部署需要较长时间才能完成。

您可以通过创建将应用程序的依赖项锁定为当前版本的 `npm-shrinkwrap.json` 文件来避免升级依赖项。

```
$ npm install
$ npm shrinkwrap
wrote npm-shrinkwrap.json
```

在源包中包含此文件可确保依赖项仅安装一次。

# 配置代理服务器
<a name="nodejs-platform-proxy"></a>

Elastic Beanstalk 可使用 NGINX 或 Apache HTTPD 作为反向代理，将应用程序映射到端口 80 上的 Elastic Load Balancing 负载均衡器。默认值为 NGINX。Elastic Beanstalk 提供一个默认代理配置，您可以扩展该配置，也可以使用您自己的配置完全覆盖该配置。

默认情况下，Elastic Beanstalk 将代理配置为通过端口 5000 向您的应用程序转发请求。您可以覆盖默认端口，方法是将 `PORT` [环境属性](create_deploy_nodejs.container.md#nodejs-platform-console)设置为主应用程序侦听的端口。

**注意**  
应用程序侦听的端口不会影响 NGINX 服务器为了从负载均衡器接收请求而侦听的端口。

**在平台版本上配置代理服务器**  
所有 AL2023/AL2 平台都支持统一的代理配置功能。有关在运行 AL2023 /的平台版本上配置代理服务器的更多信息AL2，请参阅[反向代理配置](platforms-linux-extend.proxy.md)。

## 在 Amazon Linux AMI（在 Amazon Linux 2 之前）上配置代理
<a name="nodejs-platform-proxy.alami"></a>

如果您的 Elastic Beanstalk Node.js 环境使用 Amazon Linux AMI 平台版本（在 Amazon Linux 2 之前），请阅读本节中的信息。

**注意**  
本主题中的信息仅适用于基于亚马逊 Linux AMI (AL1) 的平台分支。 AL2023/AL2 平台分支与之前的 Amazon Linux AMI (AL1) 平台版本不兼容，*需要不同的配置设置*。
 [2022 年 7 月 18 日，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)**Elastic Beanstalk 将所有基于亚马逊 Linux AMI AL1 () 的平台分支的状态设置为停用。**有关迁移到当前且完全受支持的 Amazon Linux 2023 平台分支的更多信息，请参阅 [将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

### 扩展和覆盖默认代理配置 — Amazon Linux AMI () AL1
<a name="nodejs-platform-proxy.alami.extending"></a>

Node.js 平台使用反向代理将来自实例上的端口 80 的请求中继到在端口 8081 上侦听的应用程序。Elastic Beanstalk 提供一个默认代理配置，您可以扩展该配置，也可以使用您自己的配置完全覆盖该配置。

要扩展默认配置，请使用配置文件将 `.conf` 文件添加到 `/etc/nginx/conf.d`。有关具体示例，请参阅 [在运行 Node.js 的 EC2 实例上终止 HTTPS](https-singleinstance-nodejs.md)。

Node.js 平台会将 PORT 环境变量设置为代理服务器将流量传输到的端口。在代码中读取此变量可配置应用程序的端口。

```
    var port = process.env.PORT || 3000;

    var server = app.listen(port, function () {
        console.log('Server running at http://127.0.0.1:' + port + '/');
    });
```

默认 NGINX 配置会将流量转发到 `127.0.0.1:8081` 上名为 `nodejs` 的上游服务器。可以删除默认配置并在[配置文件](ebextensions.md)中提供您自己的配置。

**Example .ebextensions/proxy.config**  
以下示例将删除默认配置并添加一个将流量转发到端口 5000 (而不是 8081) 的自定义配置。  

```
files:
  /etc/nginx/conf.d/proxy.conf:
    mode: "000644"
    owner: root
    group: root
    content: |
      upstream nodejs {
        server 127.0.0.1:5000;
        keepalive 256;
      }

      server {
        listen 8080;

        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
            set $year $1;
            set $month $2;
            set $day $3;
            set $hour $4;
        }
        access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
        access_log  /var/log/nginx/access.log  main;

        location / {
            proxy_pass  http://nodejs;
            proxy_set_header   Connection "";
            proxy_http_version 1.1;
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        gzip on;
        gzip_comp_level 4;
        gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        location /static {
            alias /var/app/current/static;
        }

      }

  /opt/elasticbeanstalk/hooks/configdeploy/post/99_kill_default_nginx.sh:
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash -xe
      rm -f /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf
      service nginx stop 
      service nginx start

container_commands:
  removeconfig:
    command: "rm -f /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf"
```
示例配置（`/etc/nginx/conf.d/proxy.conf`）使用 `/etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf` 中的默认配置作为包括具有压缩和日志设置以及静态文件映射的默认服务器数据块的基础。  
`removeconfig` 命令删除容器的默认配置，以确保代理服务器使用自定义配置。Elastic Beanstalk 在每次配置部署期间都会重新创建默认配置。为了解决这个问题，在以下示例中，添加了一个 post-configuration-deployment hook (`/opt/elasticbeanstalk/hooks/configdeploy/post/99_kill_default_nginx.sh`)。这删除了默认配置并重新启动代理服务器。

**注意**  
在 Node.js 平台将来的版本中，默认配置可能会发生更改。请使用该配置的最新版本作为您自定义的基础，以确保兼容性。

如果要覆盖默认配置，您必须定义任何静态文件映射和 GZIP 压缩。这是因为平台无法应用[标准设置](create_deploy_nodejs.container.md#nodejs-namespaces)。

# 更多适用于 Node.js 的 Elastic Beanstalk 示例应用程序和教程
<a name="nodejs-getstarted"></a>

本节提供额外的应用程序和教程。本主题前面的 [QuickStart 对于 Node.js](nodejs-quickstart.md) 主题将引导您使用 EB CLI 启动示例 Node.js 应用程序。

 要开始启用 Node.js 应用程序 AWS Elastic Beanstalk，您只需要一个应用程序[源包](applications-sourcebundle.md)，将其作为第一个应用程序版本上传并部署到环境中。

## 使用示例 Node.js 应用程序启动环境
<a name="nodejs-getstarted-samples"></a>

Elastic Beanstalk 为每个平台提供了单页示例应用程序以及更复杂的示例，这些示例展示了 AWS 其他资源的使用情况，例如 Amazon RDS 以及特定于语言或平台的功能以及。 APIs

**注意**  
按照源包 `README.md` 文件中的步骤进行部署。


**样本**  

|  环境类型  |  源代码包  |  说明  | 
| --- | --- | --- | 
|  Web 服务器  |   [nodejs.zip](samples/nodejs.zip)   |  单页面应用程序。 要使用 EB CLI 启动示例应用程序，请参阅 [QuickStart 对于 Node.js](nodejs-quickstart.md)。 您还可以使用 Elastic Beanstalk 控制台来启动示例应用程序。有关详细步骤，请参阅本指南*入门*一章中的[创建示例应用程序](GettingStarted.md#GettingStarted.CreateApp)。  | 
|  带 Amazon RDS 的 Web Server  |  [nodejs-example-express-rds.zip](samples/nodejs-example-express-rds.zip)  |  使用 Express 框架和 Amazon Relational Database Service（RDS）的 Hiking 日志应用程序。 [教程](create_deploy_nodejs_express.md)  | 
|  Amazon 网络服务器 ElastiCache  |  [nodejs-example-express-elasticache.zip](samples/nodejs-example-express-elasticache.zip)  |  使用 Amazon ElastiCache 进行集群的 Express Web 应用程序。集群功能增强了 Web 应用程序的高可用性、性能和安全性。 [教程](nodejs-express-clustering.md)  | 
|  带 DynamoDB、Amazon SNS 和 Amazon SQS 的 Web Server  |  [nodejs-example-dynamo.zip](samples/nodejs-example-dynamo.zip)  |  为新公司的市场营销活动收集用户联系信息的 Express 网站。使用 Node.js JavaScript 中的 AWS 软件开发工具包向 DynamoDB 表写入条目，使用 Elastic Beanstalk 配置文件在 DynamoDB、Amazon SNS 和亚马逊 SQS 中创建资源。 [教程](nodejs-dynamodb-tutorial.md)  | 

## 后续步骤
<a name="nodejs-getstarted-next"></a>

有了运行应用程序的环境以后，您随时可以部署新的应用程序版本或完全不同的应用程序。部署新应用程序版本非常快，因为不需要配置或重新启动 EC2 实例。有关应用程序部署的详细信息，请参阅[部署应用程序的新版本](GettingStarted.md#GettingStarted.DeployApp)。

在您部署了一两个示例应用程序并准备好开始在本地开发和运行 Node.js 应用程序以后，请参阅 [为 Elastic Beanstalk 设置 Node.js 开发环境](nodejs-devenv.md) 以使用所有需要的工具设置 Node.js 开发环境。

# 将 Node.js Express 应用程序部署到 Elastic Beanstalk
<a name="create_deploy_nodejs_express"></a>

本部分演示如何使用 Elastic Beanstalk 命令行界面（EB CLI）向 Elastic Beanstalk 部署示例应用程序，然后更新该应用程序以使用 [Express](http://expressjs.com/) 框架。

## 先决条件
<a name="create_deploy_nodejs_express.prerequisites"></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="create_deploy_nodejs_express.eb_init-rds"></a>

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

```
~$ mkdir nodejs-example-express-rds
```

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

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

```
~$ cd nodejs-example-express-rds
```

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

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

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

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

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

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

   ```
   ~/nodejs-example-express-rds$ eb create --sample nodejs-example-express-rds
   ```

   此命令使用 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-express-rds$ eb open
   ```

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

## 更新应用程序以使用 Express
<a name="create_deploy_nodejs_express.update"></a>

在创建具有示例应用程序的环境后，可将其更新为自己的应用程序。在此过程中，首先运行 **express** 和 **npm install** 命令，以在您的应用程序目录中设置 Express 框架。然后，使用 EB CLI 通过更新后的应用程序更新您的 Elastic Beanstalk 环境。

**更新您的应用程序以使用 Express**

1. 运行 `express` 命令。这将生成 `package.json`、`app.js`，以及几个目录。

   ```
   ~/nodejs-example-express-rds$ express
   ```

   在系统提示您是否要继续时，键入 **y**。
**注意**  
如果 **express** 命令不起作用，则您可能没有按照前面的*先决条件*部分所述安装 Express 命令行生成器。或者，可能需要设置本地计算机的目录路径设置才能运行 **express** 命令。有关设置开发环境的详细步骤，请参阅*先决条件*部分，以便您可以继续学习本教程。

1. 设置本地依赖项。

   ```
   ~/nodejs-example-express-rds$ npm install
   ```

1. （可选）验证 Web 应用程序服务器已启动。

   ```
   ~/nodejs-example-express-rds$ npm start
   ```

   您应该可以看到类似于如下所示的输出内容：

   ```
   > nodejs@0.0.0 start /home/local/user/node-express
   > node ./bin/www
   ```

   默认情况下，服务器在端口 3000 上运行。要测试，请在另一个终端中运行 `curl http://localhost:3000`，或在本地计算机上打开浏览器并输入 URL 地址 `http://localhost:3000`。

   按 **Ctrl\$1C** 以停止该服务器。

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

   ```
   ~/nodejs-example-express-rds$ eb deploy
   ```

1. 在环境变为绿色并准备就绪后，刷新 URL 以验证环境是否工作。您应看到一个显示 **Welcome to Express**（欢迎使用 Express）的网页。

接下来，让我们更新 Express 应用程序以使用静态文件并添加新页面。

**配置静态文件并向 Express 应用程序添加新页面**

1. 添加包含以下内容的 [`.ebextensions`](ebextensions.md) 文件夹中的第二个配置文件：

   **`nodejs-example-express-rds/.ebextensions/staticfiles.config`**

   ```
   option_settings:
       aws:elasticbeanstalk:environment:proxy:staticfiles:
           /stylesheets: public/stylesheets
   ```

   此设置将代理服务器配置为从应用程序的 `public` 路径上的 `/public` 文件夹中提供文件。从代理服务器静态提供文件可减少应用程序的负载。有关更多信息，请参阅本章前面的[静态文件](create_deploy_nodejs.container.md#nodejs-platform-console-staticfiles)。

1. （可选）要确认静态映射配置正确，请注释掉 `nodejs-example-express-rds/app.js` 中的静态映射配置。这将从节点应用程序中删除映射。

   ```
   //  app.use(express.static(path.join(__dirname, 'public'))); 
   ```

   即使在将此行注释掉之后，上一步的 `staticfiles.config` 文件中的静态文件映射仍应成功加载样式表。要验证静态文件映射是通过代理静态文件配置而不是快速应用程序加载的，请删除 `option_settings:` 后的值。将其从静态文件配置和节点应用程序中删除后，样式表将无法加载。

   测试完成后，记得重置 `nodejs-example-express-rds/app.js` 和 `staticfiles.config` 的内容。

1. 添加 `nodejs-example-express-rds/routes/hike.js`。键入以下内容：

   ```
   exports.index = function(req, res) {
    res.render('hike', {title: 'My Hiking Log'});
   };
   
   exports.add_hike = function(req, res) {
   };
   ```

1. 更新 `nodejs-example-express-rds/app.js` 以包含三个新行。

   首先，添加以下行来为此路由添加 `require`：

   ```
   var hike = require('./routes/hike');
   ```

   您的文件应类似于以下代码段：

   ```
   var express = require('express');
   var path = require('path');
   var hike = require('./routes/hike');
   ```

   然后，将以下两行添加到 `nodejs-example-express-rds/app.js` 中的 `var app = express();` 后面

   ```
   app.get('/hikes', hike.index);
   app.post('/add_hike', hike.add_hike);
   ```

   您的文件应类似于以下代码段：

   ```
   var app = express();
   app.get('/hikes', hike.index);
   app.post('/add_hike', hike.add_hike);
   ```

1. 将 `nodejs-example-express-rds/views/index.jade` 复制到 `nodejs-example-express-rds/views/hike.jade`。

   ```
   ~/nodejs-example-express-rds$ cp views/index.jade views/hike.jade
   ```

1. 使用 [**eb deploy**](eb3-deploy.md) 命令部署更改。

   ```
   ~/nodejs-example-express-rds$ eb deploy
   ```

1. 您的环境将在几分钟后进行更新。在环境变为绿色并准备就绪后，通过刷新浏览器并将 **hikes** 追加到 URL 末尾（例如 `http://node-express-env-syypntcz2q.elasticbeanstalk.com/hikes`），验证环境是否正常工作。

   您应看到标题为 **My Hiking Log** 的网页。

现在，您已经创建使用 Express 框架的 Web 应用程序。在下一节中，我们将修改应用程序以使用 Amazon Relational Database Service（RDS）来存储 Hiking 日志。

## 更新应用程序以使用 Amazon RDS
<a name="create_deploy_nodejs_express.add_rds"></a>

在下一步中，我们将应用程序更新为使用 Amazon RDS for MySQL。

**要更新您的应用程序以使用 RDS for MySQL**

1. 要创建耦合到您的 Elastic Beanstalk 环境的 RDS for MySQL 数据库，请按照本章后面所包含的[添加数据库](create-deploy-nodejs.rds.md)主题中的说明进行操作。添加一个数据库实例大约需要 10 分钟。

1.  使用以下内容更新 `package.json` 中的依赖项部分：

   ```
   "dependencies": {
       "async": "^3.2.4",
       "express": "4.18.2",
       "jade": "1.11.0",
       "mysql": "2.18.1",
       "node-uuid": "^1.4.8",
       "body-parser": "^1.20.1",
       "method-override": "^3.0.0",
       "morgan": "^1.10.0",
       "errorhandler": "^1.5.1"
     }
   ```

1. 运行 **npm install**。

   ```
   ~/nodejs-example-express-rds$ npm install
   ```

1. 更新 `app.js` 以连接到数据库、创建表并插入单个默认 Hiking 日志。每次部署此应用程序时，它都会删除之前的 hikes 表并重新创建它。

   ```
   /**
    * Module dependencies.
    */
   
    const express = require('express')
    , routes = require('./routes')
    , hike = require('./routes/hike')
    , http = require('http')
    , path = require('path')
    , mysql = require('mysql')
    , async = require('async')
    , bodyParser = require('body-parser')
    , methodOverride = require('method-override')
    , morgan = require('morgan')
    , errorhandler = require('errorhandler');
   
   const { connect } = require('http2');
   
   const app = express()
   
   app.set('views', __dirname + '/views')
   app.set('view engine', 'jade')
   app.use(methodOverride())
   app.use(bodyParser.json())
   app.use(bodyParser.urlencoded({ extended: true }))
   app.use(express.static(path.join(__dirname, 'public')))
   
   
   app.set('connection', mysql.createConnection({
   host: process.env.RDS_HOSTNAME,
   user: process.env.RDS_USERNAME,
   password: process.env.RDS_PASSWORD,
   port: process.env.RDS_PORT}));  
   
   function init() {
    app.get('/', routes.index);
    app.get('/hikes', hike.index);
    app.post('/add_hike', hike.add_hike);
   }
   
   const client = app.get('connection');
   async.series([
    function connect(callback) {
      client.connect(callback);
      console.log('Connected!');
    },
    function clear(callback) {
      client.query('DROP DATABASE IF EXISTS mynode_db', callback);
    },
    function create_db(callback) {
      client.query('CREATE DATABASE mynode_db', callback);
    },
    function use_db(callback) {
      client.query('USE mynode_db', callback);
    },
    function create_table(callback) {
       client.query('CREATE TABLE HIKES (' +
                           'ID VARCHAR(40), ' +
                           'HIKE_DATE DATE, ' +
                           'NAME VARCHAR(40), ' +
                           'DISTANCE VARCHAR(40), ' +
                           'LOCATION VARCHAR(40), ' +
                           'WEATHER VARCHAR(40), ' +
                           'PRIMARY KEY(ID))', callback);
    },
    function insert_default(callback) {
      const hike = {HIKE_DATE: new Date(), NAME: 'Hazard Stevens',
            LOCATION: 'Mt Rainier', DISTANCE: '4,027m vertical', WEATHER:'Bad', ID: '12345'};
      client.query('INSERT INTO HIKES set ?', hike, callback);
    }
   ], function (err, results) {
    if (err) {
      console.log('Exception initializing database.');
      throw err;
    } else {
      console.log('Database initialization complete.');
      init();
    }
   });
   
   module.exports = app
   ```

1. 将以下内容添加到 `routes/hike.js`。这将使路线能够将新的 Hiking 日志插入 *HIKES* 数据库。

   ```
   const uuid = require('node-uuid');
   exports.index = function(req, res) {
     res.app.get('connection').query( 'SELECT * FROM HIKES', function(err,
   rows) {
       if (err) {
         res.send(err);
       } else {
         console.log(JSON.stringify(rows));
         res.render('hike', {title: 'My Hiking Log', hikes: rows});
     }});
   };
   exports.add_hike = function(req, res){
     const input = req.body.hike;
     const hike = { HIKE_DATE: new Date(), ID: uuid.v4(), NAME: input.NAME,
     LOCATION: input.LOCATION, DISTANCE: input.DISTANCE, WEATHER: input.WEATHER};
     console.log('Request to log hike:' + JSON.stringify(hike));
     req.app.get('connection').query('INSERT INTO HIKES set ?', hike, function(err) {
         if (err) {
           res.send(err);
         } else {
           res.redirect('/hikes');
         }
      });
   };
   ```

1. 将 `routes/index.js` 的内容替换为以下内容：

   ```
   /*
    * GET home page.
    */
   
   exports.index = function(req, res){
     res.render('index', { title: 'Express' });
   };
   ```

1. 添加以下 jade 模板到 `views/hike.jade` 中，以提供添加 Hiking 日志的用户界面。

   ```
   extends layout
   
   block content
     h1= title
     p Welcome to #{title}
   
     form(action="/add_hike", method="post")
       table(border="1")
         tr
           td Your Name
           td
             input(name="hike[NAME]", type="textbox")
         tr
           td Location
           td
             input(name="hike[LOCATION]", type="textbox")
         tr
           td Distance
           td
             input(name="hike[DISTANCE]", type="textbox")
         tr
           td Weather
           td
             input(name="hike[WEATHER]", type="radio", value="Good")
             | Good
             input(name="hike[WEATHER]", type="radio", value="Bad")
             | Bad
             input(name="hike[WEATHER]", type="radio", value="Seattle", checked)
             | Seattle
         tr
           td(colspan="2")
             input(type="submit", value="Record Hike")
   
     div
       h3 Hikes
       table(border="1")
         tr
           td Date
           td Name
           td Location
           td Distance
           td Weather
         each hike in hikes
           tr
             td #{hike.HIKE_DATE.toDateString()}
             td #{hike.NAME}
             td #{hike.LOCATION}
             td #{hike.DISTANCE}
             td #{hike.WEATHER}
   ```

1. 使用 [**eb deploy**](eb3-deploy.md) 命令部署更改。

   ```
   ~/nodejs-example-express-rds$ eb deploy
   ```

## 清理
<a name="create_deploy_nodejs_express.delete"></a>

如果使用完 Elastic Beanstalk，则可终止您的环境。

使用 **eb terminate** 命令终止您的环境以及其中包含的所有资源。

```
~/nodejs-example-express-rds$ eb terminate
The environment "nodejs-example-express-rds-env" and all associated instances will be terminated.
To confirm, type the environment name: nodejs-example-express-rds-env
INFO: terminateEnvironment is starting.
...
```

# 将具有集群功能的 Node.js Express 应用程序部署到 Elastic Beanstalk
<a name="nodejs-express-clustering"></a>

[http://expressjs.com/](http://expressjs.com/)集群功能增强了 Web 应用程序的高可用性、性能和安全性。要了解有关亚马逊的更多信息 ElastiCache，请访问[什么是亚马逊 ElastiCache （Memcached）](https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/Introduction.html)？ 在*亚马逊 ElastiCache （Memcached）用户指南*中。

**注意**  
此示例创建了 AWS 资源，您可能需要为此付费。有关 AWS 定价的更多信息，请参阅[https://aws.amazon.com/pricing/](https://aws.amazon.com/pricing/)。有些服务属于 AWS 免费使用套餐的一部分。如果您是新客户，则可免费试用这些服务。请参阅[https://aws.amazon.com/free/](https://aws.amazon.com/free/)了解更多信息。

## 先决条件
<a name="nodejs-express-clustering.prereq"></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-express-clustering.create"></a>

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

```
~$ mkdir nodejs-example-express-elasticache
```

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

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

```
~$ cd nodejs-example-express-elasticache
```

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

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

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

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

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

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

   ```
   ~/nodejs-example-express-elasticache$ eb create --sample nodejs-example-express-elasticache
   ```

   此命令使用 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-express-elasticache$ eb open
   ```

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

## 更新应用程序以使用 Express
<a name="nodejs-express-clustering.update"></a>

更新 Elastic Beanstalk 环境中的示例应用程序以使用 Express 框架。

您可以从 [nodejs-example-express-elasticache.zip](samples/nodejs-example-express-elasticache.zip) 下载最终源代码。

**更新您的应用程序以使用 Express**

在创建具有示例应用程序的环境后，可将其更新为自己的应用程序。在此过程中，首先运行 **express** 和 **npm install** 命令，以在您的应用程序目录中设置 Express 框架。

1. 运行 `express` 命令。这将生成 `package.json`、`app.js`，以及几个目录。

   ```
   ~/nodejs-example-express-elasticache$ express
   ```

   在系统提示您是否要继续时，键入 **y**。
**注意**  
如果 **express** 命令不起作用，则您可能没有按照前面的*先决条件*部分所述安装 Express 命令行生成器。或者，可能需要设置本地计算机的目录路径设置才能运行 **express** 命令。有关设置开发环境的详细步骤，请参阅*先决条件*部分，以便您可以继续学习本教程。

1. 设置本地依赖项。

   ```
   ~/nodejs-example-express-elasticache$ npm install
   ```

1. （可选）验证 Web 应用程序服务器已启动。

   ```
   ~/nodejs-example-express-elasticache$ npm start
   ```

   您应该可以看到类似于如下所示的输出内容：

   ```
   > nodejs@0.0.0 start /home/local/user/node-express
   > node ./bin/www
   ```

   默认情况下，服务器在端口 3000 上运行。要测试，请在另一个终端中运行 `curl http://localhost:3000`，或在本地计算机上打开浏览器并输入 URL 地址 `http://localhost:3000`。

   按 **Ctrl\$1C** 以停止该服务器。

1. 将 `nodejs-example-express-elasticache/app.js` 重命名为 `nodejs-example-express-elasticache/express-app.js`。

   ```
   ~/nodejs-example-express-elasticache$ mv app.js express-app.js
   ```

1. 将 `nodejs-example-express-elasticache/express-app.js` 中的行 `var app = express();` 更新为以下内容：

   ```
   var app = module.exports = express();
   ```

1. 在本地计算机上，使用以下代码创建一个名为 `nodejs-example-express-elasticache/app.js` 的文件。

   ```
   /**
    * Module dependencies.
    */
   
    const express = require('express'),
    session = require('express-session'),
    bodyParser = require('body-parser'),
    methodOverride = require('method-override'),
    cookieParser = require('cookie-parser'),
    fs = require('fs'),
    filename = '/var/nodelist',
    app = express();
   
   let MemcachedStore = require('connect-memcached')(session);
   
   function setup(cacheNodes) {
    app.use(bodyParser.raw());
    app.use(methodOverride());
    if (cacheNodes.length > 0) {
      app.use(cookieParser());
   
      console.log('Using memcached store nodes:');
      console.log(cacheNodes);
   
      app.use(session({
        secret: 'your secret here',
        resave: false,
        saveUninitialized: false,
        store: new MemcachedStore({ 'hosts': cacheNodes })
      }));
    } else {
      console.log('Not using memcached store.');
      app.use(session({
        resave: false,
        saveUninitialized: false, secret: 'your secret here'
      }));
    }
   
    app.get('/', function (req, resp) {
      if (req.session.views) {
        req.session.views++
        resp.setHeader('Content-Type', 'text/html')
        resp.send(`You are session: ${req.session.id}. Views: ${req.session.views}`)
      } else {
        req.session.views = 1
        resp.send(`You are session: ${req.session.id}. No views yet, refresh the page!`)
      }
    });
   
    if (!module.parent) {
      console.log('Running express without cluster. Listening on port %d', process.env.PORT || 5000)
      app.listen(process.env.PORT || 5000)
    }
   }
   
   console.log("Reading elastic cache configuration")
   // Load elasticache configuration.
   fs.readFile(filename, 'UTF8', function (err, data) {
    if (err) throw err;
   
    let cacheNodes = []
    if (data) {
      let lines = data.split('\n');
      for (let i = 0; i < lines.length; i++) {
        if (lines[i].length > 0) {
          cacheNodes.push(lines[i])
        }
      }
    }
   
    setup(cacheNodes)
   });
   
   module.exports = app;
   ```

1. 将 `nodejs-example-express-elasticache/bin/www` 文件的内容替换为以下内容：

   ```
   #!/usr/bin/env node
   
   /**
    * Module dependencies.
    */
   
   const app = require('../app');
   const cluster = require('cluster');
   const debug = require('debug')('nodejs-example-express-elasticache:server');
   const http = require('http');
   const workers = {},
     count = require('os').cpus().length;
   
   function spawn() {
     const worker = cluster.fork();
     workers[worker.pid] = worker;
     return worker;
   }
   
   
   /**
    * Get port from environment and store in Express.
    */
   
   const port = normalizePort(process.env.PORT || '3000');
   app.set('port', port);
   
   if (cluster.isMaster) {
     for (let i = 0; i < count; i++) {
       spawn();
     }
   
     // If a worker dies, log it to the console and start another worker.
     cluster.on('exit', function (worker, code, signal) {
       console.log('Worker ' + worker.process.pid + ' died.');
       cluster.fork();
     });
   
     // Log when a worker starts listening
     cluster.on('listening', function (worker, address) {
       console.log('Worker started with PID ' + worker.process.pid + '.');
     });
   
   } else {
     /**
      * Create HTTP server.
      */
   
     let server = http.createServer(app);
   
     /**
      * Event listener for HTTP server "error" event.
      */
   
     function onError(error) {
       if (error.syscall !== 'listen') {
         throw error;
       }
   
       const bind = typeof port === 'string'
         ? 'Pipe ' + port
         : 'Port ' + port;
   
       // handle specific listen errors with friendly messages
       switch (error.code) {
         case 'EACCES':
           console.error(bind + ' requires elevated privileges');
           process.exit(1);
           break;
         case 'EADDRINUSE':
           console.error(bind + ' is already in use');
           process.exit(1);
           break;
         default:
           throw error;
       }
     }
   
     /**
      * Event listener for HTTP server "listening" event.
      */
   
     function onListening() {
       const addr = server.address();
       const bind = typeof addr === 'string'
         ? 'pipe ' + addr
         : 'port ' + addr.port;
       debug('Listening on ' + bind);
     }
   
     /**
      * Listen on provided port, on all network interfaces.
      */
   
     server.listen(port);
     server.on('error', onError);
     server.on('listening', onListening);
   }
   
   /**
    * Normalize a port into a number, string, or false.
    */
   
   function normalizePort(val) {
     const port = parseInt(val, 10);
   
     if (isNaN(port)) {
       // named pipe
       return val;
     }
   
     if (port >= 0) {
       // port number
       return port;
     }
   
     return false;
   }
   ```

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

   ```
   ~/nodejs-example-express-elasticache$ eb deploy
   ```

1. 您的环境将在几分钟后进行更新。在环境变为绿色并准备就绪后，刷新 URL 以验证环境是否工作。您应看到一个显示“欢迎使用 Express”的网页。

您可以访问运行应用程序的 EC2 实例的日志。有关访问日志的说明，请参阅[查看您的 Elastic Beanstalk 环境中的 Amazon EC2 实例的日志](using-features.logging.md)。

接下来，让我们更新 Express 应用程序以使用亚马逊 ElastiCache。

**更新您的 Express 应用程序以使用亚马逊 ElastiCache**

1. 在本地计算机上的源包顶级目录中，创建 `.ebextensions` 目录。在此示例中，我们使用的是 `nodejs-example-express-elasticache/.ebextensions`。

1. 使用以下代码段创建配置文件 `nodejs-example-express-elasticache/.ebextensions/elasticache-iam-with-script.config`。有关配置文件的更多信息，请参阅[Node.js 配置命名空间](create_deploy_nodejs.container.md#nodejs-namespaces)。此配置文件会创建一个 IAM 用户（该用户拥有发现 ElastiCache 节点所需的权限），只要缓存发生变化就向某个文件写入数据。您也可以从 [nodejs-example-express-elasticache.zip](samples/nodejs-example-express-elasticache.zip) 中复制该文件。有关 ElastiCache属性的更多信息，请参阅[例如： ElastiCache](customize-environment-resources-elasticache.md)。
**注意**  
YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。

   ```
   Resources:
     MyCacheSecurityGroup:
       Type: 'AWS::EC2::SecurityGroup'
       Properties:
         GroupDescription: "Lock cache down to webserver access only"
         SecurityGroupIngress:
           - IpProtocol: tcp
             FromPort:
               Fn::GetOptionSetting:
                 OptionName: CachePort
                 DefaultValue: 11211
             ToPort:
               Fn::GetOptionSetting:
                 OptionName: CachePort
                 DefaultValue: 11211
             SourceSecurityGroupName:
               Ref: AWSEBSecurityGroup
     MyElastiCache:
       Type: 'AWS::ElastiCache::CacheCluster'
       Properties:
         CacheNodeType:
           Fn::GetOptionSetting:
             OptionName: CacheNodeType
             DefaultValue: cache.t2.micro
         NumCacheNodes:
           Fn::GetOptionSetting:
             OptionName: NumCacheNodes
             DefaultValue: 1
         Engine:
           Fn::GetOptionSetting:
             OptionName: Engine
             DefaultValue: redis
         VpcSecurityGroupIds:
           -
             Fn::GetAtt:
               - MyCacheSecurityGroup
               - GroupId
     AWSEBAutoScalingGroup :
       Metadata :
         ElastiCacheConfig :
           CacheName :
             Ref : MyElastiCache
           CacheSize :
              Fn::GetOptionSetting:
                OptionName : NumCacheNodes
                DefaultValue: 1
     WebServerUser : 
       Type : AWS::IAM::User
       Properties :
         Path : "/"
         Policies:
           -
             PolicyName: root
             PolicyDocument :
               Statement :
                 -
                   Effect : Allow
                   Action : 
                     - cloudformation:DescribeStackResource
                     - cloudformation:ListStackResources
                     - elasticache:DescribeCacheClusters
                   Resource : "*"
     WebServerKeys :
       Type : AWS::IAM::AccessKey
       Properties :
         UserName :
           Ref: WebServerUser
   
   Outputs:
     WebsiteURL:
       Description: sample output only here to show inline string function parsing
       Value: |
         http://`{ "Fn::GetAtt" : [ "AWSEBLoadBalancer", "DNSName" ] }`
     MyElastiCacheName:
       Description: Name of the elasticache
       Value:
         Ref : MyElastiCache
     NumCacheNodes:
       Description: Number of cache nodes in MyElastiCache
       Value:
         Fn::GetOptionSetting:
           OptionName : NumCacheNodes
           DefaultValue: 1
   
   files:
     "/etc/cfn/cfn-credentials" :
       content : |
         AWSAccessKeyId=`{ "Ref" : "WebServerKeys" }`
         AWSSecretKey=`{ "Fn::GetAtt" : ["WebServerKeys", "SecretAccessKey"] }`
       mode : "000400"
       owner : root
       group : root
   
     "/etc/cfn/get-cache-nodes" :
       content : |
         # Define environment variables for command line tools
         export AWS_ELASTICACHE_HOME="/home/ec2-user/elasticache/$(ls /home/ec2-user/elasticache/)"
         export AWS_CLOUDFORMATION_HOME=/opt/aws/apitools/cfn
         export PATH=$AWS_CLOUDFORMATION_HOME/bin:$AWS_ELASTICACHE_HOME/bin:$PATH
         export AWS_CREDENTIAL_FILE=/etc/cfn/cfn-credentials
         export JAVA_HOME=/usr/lib/jvm/jre
   
         # Grab the Cache node names and configure the PHP page
         aws cloudformation list-stack-resources --stack `{ "Ref" : "AWS::StackName" }` --region `{ "Ref" : "AWS::Region" }` --output text | grep MyElastiCache | awk '{print $4}' | xargs -I {} aws elasticache describe-cache-clusters --cache-cluster-id {} --region `{ "Ref" : "AWS::Region" }` --show-cache-node-info --output text | grep '^ENDPOINT' | awk '{print $2 ":" $3}' > `{ "Fn::GetOptionSetting" : { "OptionName" : "NodeListPath", "DefaultValue" : "/var/www/html/nodelist" } }`
       mode : "000500"
       owner : root
       group : root
   
     "/etc/cfn/hooks.d/cfn-cache-change.conf" :
       "content": |
         [cfn-cache-size-change]
         triggers=post.update
         path=Resources.AWSEBAutoScalingGroup.Metadata.ElastiCacheConfig
         action=/etc/cfn/get-cache-nodes
         runas=root
   
   sources :
     "/home/ec2-user/elasticache" : "https://elasticache-downloads.s3.amazonaws.com/AmazonElastiCacheCli-latest.zip"
   
   commands: 
     make-elasticache-executable:
       command: chmod -R ugo+x /home/ec2-user/elasticache/*/bin/*
   
   packages : 
     "yum" :
       "aws-apitools-cfn"  : []
   
   container_commands:
     initial_cache_nodes:
       command: /etc/cfn/get-cache-nodes
   ```

1. 在您的本地计算机上，使用以下代码段创建配置文件`nodejs-example-express-elasticache/.ebextensions/elasticache_settings.config`进行配置 ElastiCache。

   ```
   option_settings:
     "aws:elasticbeanstalk:customoption":
        CacheNodeType: cache.t2.micro
        NumCacheNodes: 1
        Engine: memcached
        NodeListPath: /var/nodelist
   ```

1. 在本地计算机上，使用以下代码段替换 `nodejs-example-express-elasticache/express-app.js`。此文件会从磁盘读取节点列表 (`/var/nodelist`) 并配置 Express，以便在节点存在的情况下将 `memcached` 用作会话存储。您的文件应类似以下内容。

   ```
   /**
    * Module dependencies.
    */
   
   var express = require('express'),
       session = require('express-session'),
       bodyParser = require('body-parser'),
       methodOverride = require('method-override'),
       cookieParser = require('cookie-parser'),
       fs = require('fs'),
       filename = '/var/nodelist',
       app = module.exports = express();
   
   var MemcachedStore = require('connect-memcached')(session);
   
   function setup(cacheNodes) {
     app.use(bodyParser.raw());
     app.use(methodOverride());
     if (cacheNodes) {
         app.use(cookieParser());
   
         console.log('Using memcached store nodes:');
         console.log(cacheNodes);
   
         app.use(session({
             secret: 'your secret here',
             resave: false,
             saveUninitialized: false,
             store: new MemcachedStore({'hosts': cacheNodes})
         }));
     } else {
       console.log('Not using memcached store.');
       app.use(cookieParser('your secret here'));
       app.use(session());
     }
   
     app.get('/', function(req, resp){
     if (req.session.views) {
         req.session.views++
         resp.setHeader('Content-Type', 'text/html')
         resp.write('Views: ' + req.session.views)
         resp.end()
      } else {
         req.session.views = 1
         resp.end('Refresh the page!')
       }
     });
   
     if (!module.parent) {
         console.log('Running express without cluster.');
         app.listen(process.env.PORT || 5000);
     }
   }
   
   // Load elasticache configuration.
   fs.readFile(filename, 'UTF8', function(err, data) {
       if (err) throw err;
   
       var cacheNodes = [];
       if (data) {
           var lines = data.split('\n');
           for (var i = 0 ; i < lines.length ; i++) {
               if (lines[i].length > 0) {
                   cacheNodes.push(lines[i]);
               }
           }
       }
       setup(cacheNodes);
   });
   ```

1. 在本地计算机上，使用以下内容更新 `package.json`：

   ```
     "dependencies": {
       "cookie-parser": "~1.4.4",
       "debug": "~2.6.9",
       "express": "~4.16.1",
       "http-errors": "~1.6.3",
       "jade": "~1.11.0",
       "morgan": "~1.9.1",
       "connect-memcached": "*",
       "express-session": "*",
       "body-parser": "*",
       "method-override": "*"   
     }
   ```

1. 运行 **npm install**。

   ```
   ~/nodejs-example-express-elasticache$ npm install
   ```

1. 部署更新的应用程序。

   ```
   ~/nodejs-example-express-elasticache$ eb deploy
   ```

1. 您的环境将在几分钟后进行更新。在环境变为绿色并准备就绪后，验证代码是否正常。

   1. 查看 A [mazon CloudWatch 控制台](https://console.aws.amazon.com/cloudwatch/home)以查看您的 ElastiCache 指标。要查看您的 ElastiCache 指标，请在左侧窗格中选择**指标**，然后搜索**CurrItems**。选择 **ElastiCache > 缓存节点指标**，然后选择您的缓存节点以查看缓存中的项目数量。  
![\[CloudWatch dashboard showing CurrItems metric for an ElastiCache node over time.\]](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/images/elasticache-express.png)
**注意**  
确保您查看的是您的应用程序所部署到的相同地区。

      如果您将应用程序 URL 复制并粘贴到其他 Web 浏览器中并刷新页面，则应该会在 5 分钟后看到您的 CurrItem 计数上升。

   1. 制作日志的快照。有关检索日志的更多信息，请参阅[查看您的 Elastic Beanstalk 环境中的 Amazon EC2 实例的日志](using-features.logging.md)。

   1. 检查日志文件包中的文件 `/var/log/nodejs/nodejs.log`。您应看到类似如下所示的内容：

      ```
      Using memcached store nodes:
      [ 'aws-my-1oys9co8zt1uo.1iwtrn.0001.use1.cache.amazonaws.com:11211' ]
      ```

## 清理
<a name="nodejs-express-clustering.delete"></a>

如果不再希望运行您的应用程序，您可通过终止环境并删除应用程序进行清除。

请使用 `eb terminate` 命令终止环境并使用 `eb delete` 命令删除应用程序。

**终止环境**

从您在其中创建本地存储库的目录中，运行 `eb terminate`。

```
$ eb terminate
```

此过程可能耗时数分钟。成功终止环境后，Elastic Beanstalk 会立即显示一条消息。

# 将带 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)。

# 将 Amazon RDS DB 实例添加到 Node.js Elastic Beanstalk 环境
<a name="create-deploy-nodejs.rds"></a>

本主题提供使用 Elastic Beanstalk 控制台创建 Amazon RDS 的说明。您可以使用 Amazon Relational Database Service（Amazon RDS）数据库实例来存储由应用程序收集和修改的数据。数据库可以耦合到您的环境并由 Elastic Beanstalk 进行管理，也可以被创建为解耦数据库并由另一项服务进行外部管理。在这些说明中，数据库与您的环境耦合并由 Elastic Beanstalk 管理。有关将 Amazon RDS 与 Elastic Beanstalk 集成的更多信息，请参阅 [将数据库添加到 Elastic Beanstalk 环境](using-features.managing.db.md)。

**Topics**
+ [向环境中添加数据库实例](#nodejs-rds-create)
+ [下载驱动程序](#nodejs-rds-drivers)
+ [连接到数据库](#nodejs-rds-connect)

## 向环境中添加数据库实例
<a name="nodejs-rds-create"></a>

**向环境添加数据库实例**

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

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

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

1. 在 **Database**（数据库）配置类别中，选择 **Edit**（编辑）。

1. 选择数据库引擎，然后输入用户名和密码。

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

添加一个数据库实例大约需要 10 分钟。环境更新完成后，您的应用程序就可以通过以下环境属性访问数据库实例的主机名和其他连接信息：


| 属性名称 | 描述 | 属性值 | 
| --- | --- | --- | 
|  `RDS_HOSTNAME`  |  数据库实例的主机名。  |  在 Amazon RDS 控制台的 **Connectivity & security**（连接和安全）选项卡上：**Endpoint**（端点）。  | 
|  `RDS_PORT`  |  数据库实例接受连接的端口。默认值因数据库引擎而异。  |  在 Amazon RDS 控制台的 **Connectivity & security**（连接和安全）选项卡上：**Port**（端口）。  | 
|  `RDS_DB_NAME`  |  数据库名称 **ebdb**。  |  在 Amazon RDS 控制台的 **Configuration**（配置）选项卡上：**DB Name**（数据库名称）。  | 
|  `RDS_USERNAME`  |  您为数据库配置的用户名。  |  在 Amazon RDS 控制台的 **Configuration**（配置）选项卡上：**Master username**（主用户名）。  | 
|  `RDS_PASSWORD`  |  您为数据库配置的密码。  |  在 Amazon RDS 控制台中不可供参考。  | 

有关与 Elastic Beanstalk 环境耦合的数据库实例配置的更多信息，请参阅 [将数据库添加到 Elastic Beanstalk 环境](using-features.managing.db.md)。

## 下载驱动程序
<a name="nodejs-rds-drivers"></a>

在项目的 [`package.json` 文件](nodejs-platform-dependencies.md#nodejs-platform-packagejson)中的 `dependencies` 下面添加数据库驱动程序。

**Example `package.json` - Express with MySQL**  

```
{
  "name": "my-app",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "ejs": "latest",
    "aws-sdk": "latest",
    "express": "latest",
    "body-parser": "latest",
    "mysql": "latest"
  },
  "scripts": {
    "start": "node app.js"
  }
}
```

**Node.js 的常见驱动程序包**
+ **MySQL** – [mysql](https://www.npmjs.com/package/mysql)
+ **PostgreSQL** – [node-postgres](https://www.npmjs.com/package/pg)
+ **SQL Server ** — [ node-mssql ](https://www.npmjs.com/package/mssql)
+ **Oracle** – [node-oracledb](https://www.npmjs.com/package/oracledb)

## 连接到数据库
<a name="nodejs-rds-connect"></a>

Elastic Beanstalk 在环境属性中提供所连数据库实例的连接信息。使用 `process.env.VARIABLE` 可读取这些属性并配置数据库连接。

**Example app.js – MySQL 数据库连接**  

```
var mysql = require('mysql');

var connection = mysql.createConnection({
  host     : process.env.RDS_HOSTNAME,
  user     : process.env.RDS_USERNAME,
  password : process.env.RDS_PASSWORD,
  port     : process.env.RDS_PORT
});

connection.connect(function(err) {
  if (err) {
    console.error('Database connection failed: ' + err.stack);
    return;
  }

  console.log('Connected to database.');
});

connection.end();
```
[有关使用 node-mysql 构造连接字符串的更多信息，请参阅 npmjs。 org/package/mysql](https://npmjs.org/package/mysql)。

# Node.js 工具和资源
<a name="create_deploy_nodejs.resources"></a>

在开发 Node.js 应用程序时，您可以在多个地方获得额外的帮助：


****  

|  资源  |  说明  | 
| --- | --- | 
|  [GitHub](https://github.com/aws/aws-sdk-js)  | 使用安装适用于 Node.js 的 AWS 开发工具包 GitHub。 | 
|  [AWS Node.js 软件开发工具包（开发者预览版）](https://aws.amazon.com/sdkfornodejs/)  | 示例代码、文档、工具和其他资源的一站式商店。 | 