AWS Elastic Beanstalk
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

本教程和示例应用程序将指导您完成部署使用 AWS SDK for JavaScript in Node.js 与 Amazon DynamoDB 交互的 Node.js 应用程序的过程。您将在 AWS Elastic Beanstalk 环境外部创建一个 DynamoDB 表,并配置应用程序以使用此外部表,而不是在环境中创建一个表。在生产环境中,您将该表独立于 Elastic Beanstalk 环境保存,以免遭受意外数据丢失,并支持您执行蓝/绿部署

本教程的示例应用程序使用一个 DynamoDB 表存储用户提供的文本数据。示例应用程序使用配置文件创建表和 Amazon Simple Notification Service 主题。本教程还展示了如何使用 package.json 文件在部署期间安装程序包。

先决条件

  • 在开始之前,请从 GitHub 中下载该示例应用程序源包:eb-node-express-sample-v1.1.zip

  • 在过程中,您需要命令行终端或外壳,以便运行命令。示例命令以提示符 ($) 和当前目录名称 (如果有) 开头:

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

    注意

    您可以在 Linux 虚拟机、OS X 计算机或运行 Amazon Linux 的 Amazon EC2 实例上运行本教程中的所有命令。如果需要开发环境,您可启动单一实例 Elastic Beanstalk 环境,并使用 SSH 连接到该环境。

  • 本教程使用命令行 ZIP 实用工具创建一个源包,您可以将该源包部署到 Elastic Beanstalk。要在 Windows 中使用 zip 命令,您可以安装 UnxUtils,一个有用的命令行实用工具 (如 zipls) 的轻型集合。(或者,可以使用 Windows 资源管理器或任何其他 ZIP 实用工具创建源包存档。)

    安装 UnxUtils

    1. 下载 UnxUtils.

    2. 将存档提取到本地目录。例如:C:\Program Files (x86)

    3. 将二进制的路径添加到 Windows PATH 用户变量。例如:C:\Program Files (x86)\UnxUtils\usr\local\wbin

      1. 按下 Windows 键,然后键入 environment variables

      2. 选择 Edit environment variables for your account

      3. 选择 PATH,然后选择编辑

      4. Variable value 字段添加路径,中间用分号隔开。例如:C:\item1\path;C:\item2\path

      5. 选择 OK 两次以应用新设置。

      6. 关闭任何运行的命令提示符并重新打开命令提示符。

    4. 打开一个新的命令提示符窗口并运行 zip 命令,验证它是否有效。

      > zip -h Copyright (C) 1990-1999 Info-ZIP Type 'zip "-L"' for software license. ...

启动 Elastic Beanstalk 环境

您可使用 Elastic Beanstalk 控制台启动 Elastic Beanstalk 环境。您将选择 Node.js 平台并接受默认设置和示例代码。在配置环境的权限后,部署您从 GitHub 下载的示例应用程序。

启动环境 (控制台)

  1. 使用下面的预配置链接打开 Elastic Beanstalk 控制台:console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced

  2. 对于平台,选择与应用程序使用的语言匹配的平台。

  3. 对于应用程序代码,选择示例应用程序

  4. 选择复查并启动

  5. 检查可用选项。对它们感到满意之后,选择创建应用程序

Elastic Beanstalk 使用以下资源创建环境大约需要五分钟:

  • 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 组会扩展或收缩进行响应。

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

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

Elastic Beanstalk 管理所有这些资源。当您终止环境时,Elastic Beanstalk 会终止其包含的所有资源。

注意

Elastic Beanstalk 创建的 S3 存储桶将在多个环境之间共享并且在环境终止期间不会被删除。有关更多信息,请参阅 将 Elastic Beanstalk 用于 Amazon S3

向环境的实例添加权限

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

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

  • AmazonDynamoDBFullAccess

  • AmazonSNSFullAccess

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

  1. 打开 IAM 控制台中的“角色”页面

  2. 选择 aws-elasticbeanstalk-ec2-role

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

  4. 选择适用于应用程序使用的附加服务的托管策略。例如,AmazonSNSFullAccessAmazonDynamoDBFullAccess

  5. 选择 Attach policy

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

部署示例应用程序

现在,您的环境已准备就绪,供您向其部署示例应用程序并运行它。

注意

从 GitHub 中下载源包 (如果您尚未这样做):eb-node-express-sample-v1.1.zip

部署源包

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 Upload and Deploy

  4. 选择选择文件并使用对话框选择源包。

  5. 选择 Deploy

  6. 部署完成后,选择站点 URL 以在新选项卡中打开您的网站。

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

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

查看表

  1. 在 DynamoDB 控制台中打开表页面

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

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

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

查看主题

  1. 在 Amazon SNS 控制台中打开主题页面

  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 终止。

使用以下设置创建表:

  • 表名称nodejs-tutorial

  • 主键email

  • 主键类型 – String

创建 DynamoDB 表

  1. 在 DynamoDB 管理控制台中打开“表”页面

  2. 选择 Create Table

  3. 键入表名称主键

  4. 选择主键类型。

  5. 选择 Create

更新应用程序的配置文件

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

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

  1. 从源包提取项目文件:

    ~$ mkdir nodejs-tutorial ~$ cd nodejs-tutorial ~/nodejs-tutorial$ unzip ~/Downloads/eb-node-express-sample-v1.0.zip
  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"

    这会将应用程序配置为使用 nodejs-tutorial 表而不是 .ebextensions/create-dynamodb-table.config 创建的表,并设置 Amazon SNS 主题用于通知的电子邮件地址。

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

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

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

  4. 从已修改代码创建源包。

    ~/nodejs-tutorial$ zip nodejs-tutorial.zip -r * .[^.]* adding: LICENSE (deflated 65%) adding: README.md (deflated 56%) adding: app.js (deflated 63%) adding: iam_policy.json (deflated 47%) adding: misc/ (stored 0%) adding: misc/theme-flow.png (deflated 1%) adding: npm-shrinkwrap.json (deflated 87%) adding: package.json (deflated 40%) adding: static/ (stored 0%) adding: static/bootstrap/ (stored 0%) adding: static/bootstrap/css/ (stored 0%) adding: static/bootstrap/css/jumbotron-narrow.css (deflated 59%) adding: static/bootstrap/css/theme/ (stored 0%) adding: static/bootstrap/css/theme/united/ (stored 0%) adding: static/bootstrap/css/theme/united/bootstrap.css (deflated 86%) adding: static/bootstrap/css/theme/amelia/ (stored 0%) adding: static/bootstrap/css/theme/amelia/bootstrap.css (deflated 86%) adding: static/bootstrap/css/theme/slate/ (stored 0%) adding: static/bootstrap/css/theme/slate/bootstrap.css (deflated 87%) adding: static/bootstrap/css/theme/default/ (stored 0%) adding: static/bootstrap/css/theme/default/bootstrap.css (deflated 86%) adding: static/bootstrap/css/theme/flatly/ (stored 0%) adding: static/bootstrap/css/theme/flatly/bootstrap.css (deflated 86%) adding: static/bootstrap/LICENSE (deflated 65%) adding: static/bootstrap/js/ (stored 0%) adding: static/bootstrap/js/bootstrap.min.js (deflated 74%) adding: static/bootstrap/fonts/ (stored 0%) adding: static/bootstrap/fonts/glyphicons-halflings-regular.eot (deflated 1%) adding: static/bootstrap/fonts/glyphicons-halflings-regular.svg (deflated 73%) adding: static/bootstrap/fonts/glyphicons-halflings-regular.woff (deflated 1%) adding: static/bootstrap/fonts/glyphicons-halflings-regular.ttf (deflated 44%) adding: static/jquery/ (stored 0%) adding: static/jquery/jquery-1.11.3.min.js (deflated 65%) adding: static/jquery/MIT-LICENSE.txt (deflated 41%) adding: views/ (stored 0%) adding: views/index.ejs (deflated 67%) adding: .ebextensions/ (stored 0%) adding: .ebextensions/options.config (deflated 47%) adding: .ebextensions/create-sns-topic.config (deflated 56%)

将 nodejs-tutorial.zip 源包部署到您的环境。

部署源包

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 Upload and Deploy

  4. 选择选择文件并使用对话框选择源包。

  5. 选择 Deploy

  6. 部署完成后,选择站点 URL 以在新选项卡中打开您的网站。

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

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

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

查看表

  1. 在 DynamoDB 控制台中打开表页面

  2. 查找 nodejs-tutorial 表。

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

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

为您的环境配置高可用性

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

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

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 Configuration

  4. 容量配置卡上,选择修改

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

  6. 选择 Apply

清除

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

终止 Elastic Beanstalk 环境

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择操作,然后选择终止环境

  4. Confirm Termination (确认终止) 对话框中,键入环境名称,然后选择 Terminate (终止)

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

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

删除 DynamoDB 表

  1. 在 DynamoDB 控制台中打开表页面

  2. 选择表。

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

  4. 选择 Delete

后续步骤

当您继续部署应用程序时,您可能需要一种方式可以管理环境和部署应用程序,而无需手动创建 .zip 文件并将其上传至 Elastic Beanstalk 控制台。Elastic Beanstalk 命令行界面 (EB CLI) 提供了易于使用的命令,可用于从命令行创建、配置应用程序并将应用程序部署到 Elastic Beanstalk 环境。

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

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

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