将带 DynamoDB 的 Node.js 应用程序部署到 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
,一个有用的命令行实用工具 (如zip
和ls
) 的轻型集合。(或者,可以使用 Windows 资源管理器或任何其他 ZIP 实用工具创建源包存档。)安装 UnxUtils
-
下载
UnxUtils
. -
将存档提取到本地目录。例如:
C:\Program Files (x86)
。 -
将二进制的路径添加到 Windows PATH 用户变量。例如:
C:\Program Files (x86)\UnxUtils\usr\local\wbin
。-
按下 Windows 键,然后键入
environment variables
。 -
选择 Edit environment variables for your account(编辑您账户的环境变量)。
-
选择 PATH,然后选择 Edit(编辑)。
-
向 Variable value 字段添加路径,中间用分号隔开。例如:
C:\item1\path
;
C:\item2\path
-
选择 OK 两次以应用新设置。
-
关闭任何正在运行的命令提示符窗口,然后重新打开命令提示符窗口。
-
-
打开一个新的命令提示符窗口并运行
zip
命令,验证它是否有效。>
zip -h
Copyright (C) 1990-1999 Info-ZIP Type 'zip "-L"' for software license. ...
-
启动 Elastic Beanstalk 环境
使用 Elastic Beanstalk 控制台启动 Elastic Beanstalk 环境。您将选择 Node.js 平台并接受默认设置和示例代码。在配置环境的权限后,部署您从 GitHub 下载的示例应用程序。
启动环境(控制台)
-
使用下面的预配置链接打开 Elastic Beanstalk 控制台:console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced
-
对于 Platform(平台),选择与应用程序使用的语言匹配的平台和平台分支。
-
对于应用程序代码,选择示例应用程序。
-
选择复查并启动。
-
检查可用选项。选择要使用的可用选项,然后在准备就绪后选择创建应用程序。
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 组会扩展或收缩以进行响应。
-
Amazon CloudFormation 堆栈 – Elastic Beanstalk 使用 Amazon CloudFormation 启动您环境中的资源并传播配置更改。这些资源在您可通过 Amazon CloudFormation 控制台
查看的模板中定义。 -
域名 – 一个域名,它以下面的形式路由到您的 Web 应用程序:
subdomain
.region
.elasticbeanstalk.com。
Elastic Beanstalk 管理所有这些资源。当您终止环境时,Elastic Beanstalk 会终止其包含的所有资源。
Elastic Beanstalk 创建的 S3 存储桶将在多个环境之间共享并且在环境终止期间不会被删除。有关更多信息,请参阅将 Elastic Beanstalk 和 Amazon S3 结合使用。
向环境的实例添加权限
您的应用程序在负载均衡器后方的一个或多个 EC2 实例上运行,为来自 Internet 的 HTTP 请求提供服务。当应用程序接收到需要它使用Amazon服务的请求时,使用它在其上运行的实例的权限访问这些服务。
示例应用程序使用实例权限向 DynamoDB 表写入数据,并使用 SDK for JavaScript in Node.js 向 Amazon SNS 主题发送通知。将以下托管式策略添加到默认实例配置文件,以向您环境中的 EC2 实例授予对 DynamoDB 和 Amazon SNS 的访问权限:
-
AmazonDynamoDBFullAccess
-
AmazonSNSFullAccess
向默认实例配置文件添加策略
-
在 IAM 控制台中,打开 Roles(角色)页面
。 -
选择 aws-elasticbeanstalk-ec2-role。
-
在 Permissions(权限)选项卡上,选择 Attach policies(附加策略)。
-
选择适用于应用程序使用的附加服务的托管策略。例如,
AmazonSNSFullAccess
或AmazonDynamoDBFullAccess
。 -
选择 Attach policy(附加策略)。
请参阅 管理 Elastic Beanstalk 实例配置文件 以了解有关管理实例配置文件的更多信息。
部署示例应用程序。
现在,您的环境已准备就绪,供您向其部署示例应用程序并运行它。
从 GitHub 中下载源代码包(如果您尚未这样做):eb-node-express-sample-v1.1.zip
部署源包
打开 Elastic Beanstalk 控制台
,然后在 Regions(区域)列表中选择您的 Amazon Web Services 区域。 -
在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。
注意 如果您有多个环境,请使用搜索栏筛选环境列表。
-
在环境概述页面上,选择 Upload and deploy(上传和部署)。
-
使用屏幕上的对话框上传源包。
-
选择 Deploy(部署)。
-
部署完成后,选择站点 URL 以在新选项卡中打开您的网站。
此站点将收集用户联系信息并使用 DynamoDB 表来存储数据。要添加条目,请选择 Sign up today(立即注册),输入名称和电子邮件地址,然后选择 Sign Up!(注册!)。Web 应用程序会将表单内容写入表并触发 Amazon SNS 电子邮件通知。

现在,Amazon SNS 主题已使用通知的占位符电子邮件进行配置。您很快将更新该配置,但同时您可以在Amazon Web Services Management Console管理控制台中验证 DynamoDB 表和 Amazon SNS 主题。
查看表
-
在 DynamoDB 控制台中打开 Tables(表)页面
。 -
找到应用程序创建的表。名称以 awseb 开头且包含 StartupSignupsTable。
-
选择表,选择 Items(项目),然后选择 Start search(开始搜索)以查看表中所有项目。
在注册站点提交的每个电子邮件地址在表中都有一个条目。除了写入表,应用程序还会向具有两个订阅的 Amazon SNS 主题发送一条消息,一个订阅用于向您发送电子邮件通知,另一个订阅用于某个 Amazon Simple Queue Service 队列,工作线程应用程序可从该队列中读取数据,以处理请求和向感兴趣的客户发送电子邮件。
查看主题
-
在 Amazon SNS 控制台中打开 Topics(主题)页面
。 -
找到应用程序创建的主题。名称以 awseb 开头且包含 NewSignupTopic。
-
选择主题以查看其订阅。
应用程序 (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 表
-
在 DynamoDB 管理控制台中打开 Tables(表)页面
。 -
选择 Create Table(创建表)。
-
键入表名称和主键。
-
选择主键类型。
-
选择 Create(创建)。
更新应用程序的配置文件
更新应用程序源中的配置文件以使用 nodejs-tutorial 表,而不必创建一个新的表。
更新示例应用程序以供生产用
-
从源包提取项目文件:
~$
mkdir nodejs-tutorial
~$cd nodejs-tutorial
~/nodejs-tutorial$unzip ~/Downloads/eb-node-express-sample-v1.0.zip
-
打开
.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"这会将应用程序配置为使用 nodejs-tutorial 表而不是
.ebextensions/create-dynamodb-table.config
创建的表,并设置 Amazon SNS 主题用于通知的电子邮件地址。 -
-
删除
.ebextensions/create-dynamodb-table.config
.~/nodejs-tutorial$
rm .ebextensions/create-dynamodb-table.config
您下一次部署应用程序时,此配置文件创建的表将被删除。
-
从已修改代码创建源包。
~/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 源包部署到您的环境。
部署源包
打开 Elastic Beanstalk 控制台
,然后在 Regions(区域)列表中选择您的 Amazon Web Services 区域。 -
在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。
注意 如果您有多个环境,请使用搜索栏筛选环境列表。
-
在环境概述页面上,选择 Upload and deploy(上传和部署)。
-
使用屏幕上的对话框上传源包。
-
选择 Deploy(部署)。
-
部署完成后,选择站点 URL 以在新选项卡中打开您的网站。
部署时,Elastic Beanstalk 将更新 Amazon SNS 主题的配置并删除它在您部署应用程序的第一个版本时创建的 DynamoDB 表。
现在,当您终止环境时,nodejs-tutorial 表将不会被删除。这可让您执行蓝/绿部署、修改配置文件或关闭您的网站而不会有丢失数据的风险。
在浏览器中打开您的站点并验证表单是否按预期运行。创建一些条目,然后检查 DynamoDB 控制台以验证表。
查看表
-
在 DynamoDB 控制台中打开 Tables(表)页面
。 -
查找 nodejs-tutorial 表。
-
选择表,选择 Items(项目),然后选择 Start search(开始搜索)以查看表中所有项目。
您也可以看到 Elastic Beanstalk 删除了之前创建的表。
为您的环境配置高可用性
最后,使用较高的最低实例计数配置您环境的 Auto Scaling 组。请始终至少运行两个实例,以防止您环境中的 Web 服务器发生单点故障,并支持您在不中断站点服务的情况下部署更改。
配置您的环境的 Auto Scaling 组以获得高可用性
打开 Elastic Beanstalk 控制台
,然后在 Regions(区域)列表中选择您的 Amazon Web Services 区域。 -
在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。
注意 如果您有多个环境,请使用搜索栏筛选环境列表。
在导航窗格中,选择 Configuration (配置)。
-
在 Capacity (容量) 配置类别中,选择 Edit (编辑)。
-
在 Auto Scaling group(Auto Scaling 组)部分中,将 Min instances(最小实例数)设置为
2
。 -
在页面底部选择 Apply(应用)。
清除
Elastic Beanstalk 使用完毕时,您可以终止您的环境。Elastic Beanstalk 会终止与环境关联的所有 Amazon 资源,例如 Amazon EC2 s实例、数据库实例、负载均衡器、安全组和警报。
终止 Elastic Beanstalk 环境
打开 Elastic Beanstalk 控制台
,然后在 Regions(区域)列表中选择您的 Amazon Web Services 区域。 -
在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。
注意 如果您有多个环境,请使用搜索栏筛选环境列表。
-
选择 Actions(操作),然后选择 Terminate environment(终止环境)。
-
使用屏幕上的对话框确认环境终止。
利用 Elastic Beanstalk,可以随时为您的应用程序轻松创建新环境。
还可以删除由您创建的外部 DynamoDB 表。
删除 DynamoDB 表
-
在 DynamoDB 控制台中打开 Tables(表)页面
。 -
选择表。
-
选择操作,然后选择删除表。
-
选择 Delete (删除)。
后续步骤
当您继续开发应用程序时,您可能希望管理环境和部署应用程序,而无需手动创建 .zip 文件并将该文件上传到 Elastic Beanstalk 控制台。Elastic Beanstalk 命令行界面 (EB CLI) 提供了易于使用的命令,这些命令可用于从命令行创建、配置应用程序并将应用程序部署到 Elastic Beanstalk 环境。
示例应用程序使用配置文件配置软件设置和创建作为您的环境的一部分的Amazon资源。请参阅 使用配置文件 (.ebextensions) 进行高级环境自定义 以了解有关配置文件及其用途的详细信息。
本教程的示例应用程序使用适用于 Node.js 的 Express Web 框架。有关 Express 的更多信息,请参阅 expressjs.com
最后,如果您计划在生产环境中使用应用程序,请为环境配置自定义域名并为安全连接启用 HTTPS。