View a markdown version of this page

使用 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 将引导您完成部署使用软件开发工具包与亚马逊 Amazon DynamoDB 服务交互的 Node.js 应用程序的过程。 JavaScript Node.js 您将在与环境分离或外部的数据库中创建一个 DynamoDB 表。 Amazon Elastic Beanstalk 您还将配置应用程序以使用解耦数据库。在生产环境中,最佳做法是使用与 Elastic Beanstalk 环境解耦的数据库,使其独立于环境的生命周期。这种做法还使您能够执行blue/green 部署。

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

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

  • 用于创建表的配置文件。

  • Amazon Simple Notification Service 主题。

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

先决条件

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

  • Node.js 运行时间

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

  • Express 命令行生成器

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

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

有关安装和配置 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 存储库并创建运行该平台的 Elastic Beanstalk 环境 Node.js
  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 平台的默认设置和以下资源创建负载平衡环境:

    • Beanstalk 标准 — 对于在亚马逊弹性计算云 (亚马逊 EC2) 上运行的环境,Elastic Beanstalk 预置了以下资源:

      • EC2 实例 — 配置为在您选择的平台上运行 Web 应用程序的 Amazon EC2 虚拟机。

        各平台运行一组特定软件、配置文件和脚本以支持特定的语言版本、框架、Web 容器或其组合。大多数平台使用 Apache 或 NGINX 作为 Web 应用程序前的反向代理,向其转发请求、提供静态资产以及生成访问和错误日志。

      • 实例安全组 - 配置为允许端口 80 上的入站流量的 Amazon EC2 安全组。通过此资源,HTTP 流量可以从负载均衡器到达运行您的 Web 应用程序的 EC2 实例。默认情况下,其他端口不允许流量进入。

      • 负载均衡器安全组 – 配置为允许端口 80 上的入站流量的 Amazon EC2 安全组。利用此资源,HTTP 流量可从 Internet 到达负载均衡器。默认情况下,其他端口不允许流量进入。

      • Auto Scaling 组 – 配置为在实例终止或不可用时替换实例的 Auto Scaling 组。

      • Amazon CloudWatch CloudWatch 警报 — 两个警报,用于监控环境中实例的负载,并在负载过高或过低时触发。警报触发后,您的 Auto Scaling 组会扩展或收缩以进行响应。

    • Beanstalk 集群 — 对于在亚马逊 EKS 上运行的环境,Elastic Beanstalk 预置了以下资源:

      • 亚马逊 EKS 集群 — 由 Elastic Beanstalk 创建和运行的亚马逊 EKS 集群。使用相同子网的同一个账户中的环境共享一个集群。

      • 计算 — 由 Amazon EKS 自动模式提供的节点容量,该模式添加和删除节点以适应集群上计划的应用程序副本。

      • IAM 角色 — 您为 Amazon EKS 提供的集群和节点角色,以及 Elastic Beanstalk 用于发布环境指标、日志和跟踪的可观察性角色。

      有关此基础架构的更多信息,请参阅Beanstalk 集群架构。

    • 负载均衡器 -一种负载均衡器,用于在您的应用程序中分配传入请求。负载均衡器还无需将您的应用程序直接暴露给互联网。

    • Amazon S3 存储桶 – 使用 Elastic Beanstalk 时创建的源代码、日志和其他构件的存储位置。

    • Amazon CloudFormation 堆栈 — Elastic Beanstalk Amazon CloudFormation 用于在您的环境中启动资源和传播配置更改。这些资源在您可通过 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

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

向环境的实例添加权限

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

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

  • AmazonDynamoDBFullAccess

  • AmazonSNSFullAccess

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

  2. 选择 aws-elasticbeanstalk-ec2-role。

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

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

  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 管理控制台管理控制台中验证 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_TABLE – nodejs-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 表将不会被删除。这使您可以在不冒数据丢失风险的情况下执行 blue/green部署、修改配置文件或关闭您的网站。

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

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

  2. 查找 nodejs-tutorial 表。

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

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

为您的环境配置高可用性

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

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

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

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

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

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

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

资源清理

演示代码使用完毕后,您可以终止环境。Elastic Beanstalk 会删除所有相关 Amazon 资源,例如 Amazon EC2 实例、数据库实例、负载均衡器、安全组和警报。

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

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

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

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

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

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

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

  2. 选择表。

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

  4. 选择删除。

后续步骤

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

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

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