将带 DynamoDB 的 Node.js 应用程序部署到 Elastic Beanstalk - Amazon Elastic Beanstalk
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

将带 DynamoDB 的 Node.js 应用程序部署到 Elastic Beanstalk

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

以下示例应用程序说明下列情况:

  • 存储用户提供的文本数据的 DynamoDB 表。

  • 用于创建表的配置文件

  • Amazon Simple Notification Service 主题。

  • 使用 package.json 文件在部署期间安装程序包。

先决条件

本教程需要以下先决条件:

  • Node.js 运行时

  • 默认 Node.js 程序包管理器软件 npm

  • Express 命令行生成器

  • Elastic Beanstalk 命令行界面 (EB CLI)

有关安装列出的前三个组件和设置本地开发环境的详细信息,请参阅 设置 Node.js 开发环境。在本教程中,您无需安装 Amazon 适用于 Node.js 的 SDK,参考主题中也提到了这一点。

有关安装和配置 EB CLI 的详细信息,请参阅 安装 EB CLI配置 EB CLI

创建 Elastic Beanstalk 环境

您的应用程序目录

本教程为应用程序源包使用名为 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 命令创建存储库。

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

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

  2. 使用 eb create 命令创建运行示例应用程序的环境。

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

    此命令使用 Node.js 平台的默认设置以及以下资源来创建负载均衡环境:

    • EC2 实例 – 配置为在您选择的平台上运行 Web 应用程序的 Amazon Elastic Compute Cloud(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 组会扩展或收缩以进行响应。

    • Amazon CloudFormation 堆栈 — Elastic Amazon CloudFormation Beanstalk 用于在您的环境中启动资源并传播配置更改。这些资源在您可通过 Amazon CloudFormation 控制台查看的模板中定义。

    • 域名 – 一个域名,它以下面的形式路由到您的 Web 应用程序:subdomain.region.elasticbeanstalk.com

      注意

      为了增强您的 Elastic Beanstalk 应用程序的安全性,eb.amazonaws.com.cn 名已在公共后缀列表 (PSL) 中注册。为进一步增强安全性,如果您需要在 Elastic Beanstalk 应用程序的默认域名中设置敏感 Cookie,我们建议您使用带 __Host- 前缀的 Cookie。这将有助于保护您的域,防范跨站点请求伪造(CSRF)攻击。要了解更多信息,请参阅 Mozilla 开发者网络中的 Set-Cookie 页面。

  3. 当环境创建完成后,使用 eb open 命令在默认浏览器中打开环境 URL。

    ~/nodejs-example-dynamo$ eb open

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

向环境的实例添加权限

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

该示例应用程序使用实例权限向 DynamoDB 表写入数据,并使用 Node.js 中的软件开发工具包向亚马逊 SNS 主题发送通知。 JavaScript 将以下托管式策略添加到默认实例配置文件,以向您环境中的 EC2 实例授予对 DynamoDB 和 Amazon SNS 的访问权限:

  • AmazonDynamo数据库 FullAccess

  • 亚马逊 SNS FullAccess

向默认实例配置文件添加策略
  1. 在 IAM 控制台中,打开 Roles(角色)页面。

  2. 选择 aws-elasticbeanstalk-ec2 个角色

  3. Permissions(权限)选项卡上,选择 Attach policies(附加策略)。

  4. 选择适用于应用程序使用的附加服务的托管策略。在本教程中,请选择 AmazonSNSFullAccessAmazonDynamoDBFullAccess

  5. 选择附加策略

请参阅 管理 Elastic Beanstalk 实例配置文件 以了解有关管理实例配置文件的更多信息。

部署示例应用程序

现在,您的环境已准备就绪,可以部署和运行本教程的示例应用程序:nodejs-example-dynamo.zip。

要部署和运行教程示例应用程序
  1. 将当前工作目录更改为应用程序目录 nodejs-example-dynamo

    ~$ cd nodejs-example-dynamo
  2. 将示例应用程序源包 nodejs-example-dynamo.zip 的内容下载并解压缩到应用程序目录中nodejs-example-dynamo

  3. 使用 eb deploy 命令将示例应用程序部署到您的 Elastic Beanstalk 环境。

    ~/nodejs-example-dynamo$ eb deploy
    注意

    默认情况下,该eb deploy命令会创建项目文件夹的 ZIP 文件。您可以将 EB CLI 配置为从构建过程部署工件而不是创建项目文件夹 ZIP 文件。有关更多信息,请参阅部署构件而不是项目文件夹

  4. 当环境创建完成后,使用 eb open 命令在默认浏览器中打开环境 URL。

    ~/nodejs-example-dynamo$ eb open

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

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

查看表
  1. 在 DynamoDB 控制台中打开 Tables(表)页面

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

  3. 选择表,选择 Items(项目),然后选择 Start search(开始搜索)以查看表中所有项目。

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

查看主题
  1. 在 Amazon SNS 控制台中打开 Topics(主题)页面

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

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

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

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

创建 DynamoDB 表

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

使用以下设置创建表:

  • Table name(表名称)nodejs-tutorial

  • Primary key(主键)email

  • 主键类型 - String

创建 DynamoDB 表
  1. 在 DynamoDB 管理控制台中打开 Tables(表)页面

  2. 选择创建表

  3. 键入表名称主键

  4. 选择主键类型。

  5. 选择 创建

更新应用程序的配置文件

更新应用程序源中的配置文件以使用 nodejs-tutorial 表,而不必创建一个新的表。

要更新示例应用程序以供生产用
  1. 将当前工作目录更改为应用程序目录 nodejs-example-dynamo

    ~$ cd nodejs-example-dynamo
  2. 打开 .ebextensions/options.config 并更改以下设置的值:

    • NewSignupEmail— 您的电子邮件地址。

    • STARTUP_SIGNUP_TABLEnodejs-tutorial

    例 .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 创建的表。

  3. 删除 .ebextensions/create-dynamodb-table.config

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

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

  4. 使用 eb deploy 命令将更新的应用程序部署到您的 Elastic Beanstalk 环境。

    ~/nodejs-example-dynamo$ eb deploy
  5. 当环境创建完成后,使用 eb open 命令在默认浏览器中打开环境 URL。

    ~/nodejs-example-dynamo$ eb open

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

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

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

查看表
  1. 在 DynamoDB 控制台中打开 Tables(表)页面

  2. 查找 nodejs-tutorial 表。

  3. 选择表,选择 Items(项目),然后选择 Start search(开始搜索)以查看表中所有项目。

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

为您的环境配置高可用性

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

配置您的环境的 Auto Scaling 组以获得高可用性
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 在导航窗格中,选择 Configuration (配置)

  4. Capacity (容量) 配置类别中,选择 Edit (编辑)

  5. Auto Scaling group(Auto Scaling 组)部分中,将 Min instances(最小实例数)设置为 2

  6. 要保存更改,请选择页面底部的 Apply(应用)。

清除

Elastic Beanstalk 使用完毕时,您可以终止您的环境。Elastic Beanstalk Amazon 会终止与您的环境关联的所有资源,例如 Amazon EC2 实例、数据库实例、负载均衡器、安全组和警报。

终止 Elastic Beanstalk 环境
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 选择 Actions(操作),然后选择 Terminate environment(终止环境)。

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

利用 Elastic Beanstalk,可以随时为您的应用程序轻松创建新环境。

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

删除 DynamoDB 表
  1. 在 DynamoDB 控制台中打开 Tables(表)页面

  2. 选择表。

  3. 选择操作,然后选择删除表

  4. 选择 Delete(删除)。

后续步骤

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

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

最后,如果您计划在生产环境中使用应用程序,请为环境配置自定义域名并为安全连接启用 HTTPS