创建您的第一个 Node.js 堆栈 - AWS OpsWorks

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

创建您的第一个 Node.js 堆栈

重要

AWS OpsWorks Stacks 不再接受新客户。在 2024 年 5 月 26 日之前,现有客户将能够正常使用 OpsWorks 控制台、API、CLI 和 CloudFormation 资源,届时它们将停产。为准备此过渡,我们建议您尽快将堆栈过渡到AWS Systems Manager。有关更多信息,请参阅 AWS OpsWorks Stacks 生命周期终止常见问题解答将 AWS OpsWorks Stacks 应用程序迁移到 AWS Systems Manager Application Manager

此示例介绍如何创建支持 Node.js 应用程序服务器的 Linux 堆栈以及如何部署简单的应用程序。堆栈包括以下组件:

先决条件

本演练假定:

  • 您拥有一个 Amazon Web Services account 并且大致了解如何使用 AWS OpsWorks Stacks。

    如果您是首次使用 AWS OpsWorks Stacks 或 AWS,请完成 Chef 11 Linux 堆栈入门 中的介绍性教程以了解基础知识。

  • 您大致了解如何实施 Node.js 应用程序。

    如果您是首次使用 Node.js,请完成介绍性教程 (例如 节点:启动并运行) 以了解基础知识。

  • 您已在 Amazon Web Services Region 中创建至少一个计划用于此示例的堆栈。

    当您在区域中创建第一个堆栈时,AWS OpsWorks Stacks 会为每个层类型创建一个 Amazon Elastic Compute Cloud (Amazon EC2) 安全组。您需要这些安全组来创建 Amazon RDS 数据库 (DB) 实例。如果您是首次使用 AWS OpsWorks Stacks,建议您对此示例使用您在完成Chef 11 Linux 堆栈入门中的教程时使用的同一区域。如果您想使用新区域,请在该区域中创建一个新堆栈;该堆栈不需要具有层或实例。创建堆栈后,AWS OpsWorks Stacks 会自动将一组安全组添加到区域。

  • 您将在默认 VPC 中创建您的堆栈。

    您可以在本演练中使用 EC2-Classic,但某些详细信息略为不同。例如,对于 EC2-Classic,您可以指定实例的可用区 (AZ) 而不是其子网。

  • 您的 IAM 用户具有 AWS OpsWorks Stacks 的完全访问权限。

    出于安全原因,强烈建议您不要在本演练中使用账户的根凭证。而是创建一个具有 AWS OpsWorks Stacks 的完全访问权限的用户,并将这些凭证用于 AWS OpsWorks Stacks。有关更多信息,请参阅 创建 管理用户

实施应用程序

本演练使用一个简单的 Express 应用程序,该应用程序连接到 Amazon RDS 数据库实例并列出该实例的数据库。

要实施应用程序,请在工作站上的方便位置创建一个名为 nodedb 的目录,并向该目录添加以下三个文件。

程序包描述符

要创建应用程序的程序包描述符,请将一个名为 package.json 的包含以下内容的文件添加到 nodedb 目录。package.json 是 Express 应用程序必需的,并且必须位于应用程序的根目录中。

{ "name": "Nodejs-DB", "description": "Node.js example application", "version": "0.0.1", "dependencies": { "express": "*", "ejs": "*", "mysql": "*" } }

package.json 示例是相当少的。它定义所需的 nameversion 属性并列出依赖程序包:

  • express 引用 Express 程序包。

  • ejs 引用 EJS 程序包,应用程序使用此程序包将文本插入 HTML 布局文件中。

  • mysql 引用 node-mysql 程序包,应用程序使用此程序包连接到 RDS 实例。

有关程序包描述符文件的更多信息,请参阅 package.json

布局文件

要创建应用程序的布局文件,请将 views 目录添加到 nodedb 目录,然后将文件添加到一个名为 views 的包含以下内容的文件添加到 index.html

<!DOCTYPE html> <html> <head> <title>AWS Opsworks Node.js Example</title> </head> <body> <h1>AWS OpsWorks Node.js Example</h1> <p>Amazon RDS Endpoint: <i><%= hostname %></i></p> <p>User: <i><%= username %></i></p> <p>Password: <i><%= password %></i></p> <p>Port: <i><%= port %></i></p> <p>Database: <i><%= database %></i></p> <p>Connection: <%= connectionerror %></p> <p>Databases: <%= databases %></p> </body> </html>

在本示例中,布局文件是一个简单的 HTML 文档,该文档将显示 Amazon RDS 中的某些数据。每个 <%= ... => 元素均表示一个在应用程序的代码文件 (我们接下来将创建该文件) 中定义的变量的值。

代码文件

要创建应用程序的代码文件,请将 server.js 文件与以下内容一起添加到 nodedb 目录。

重要

对于 AWS OpsWorks Stacks,Node.js 应用程序的主代码文件必须名为 server.js,并且位于应用程序的根文件夹中。

var express = require('express'); var mysql = require('mysql'); var dbconfig = require('opsworks'); //[1] Include database connection data var app = express(); var outputString = ""; app.engine('html', require('ejs').renderFile); //[2] Get database connection data app.locals.hostname = dbconfig.db['host']; app.locals.username = dbconfig.db['username']; app.locals.password = dbconfig.db['password']; app.locals.port = dbconfig.db['port']; app.locals.database = dbconfig.db['database']; app.locals.connectionerror = 'successful'; app.locals.databases = ''; //[3] Connect to the Amazon RDS instance var connection = mysql.createConnection({ host: dbconfig.db['host'], user: dbconfig.db['username'], password: dbconfig.db['password'], port: dbconfig.db['port'], database: dbconfig.db['database'] }); connection.connect(function(err) { if (err) { app.locals.connectionerror = err.stack; return; } }); // [4] Query the database connection.query('SHOW DATABASES', function (err, results) { if (err) { app.locals.databases = err.stack; } if (results) { for (var i in results) { outputString = outputString + results[i].Database + ', '; } app.locals.databases = outputString.slice(0, outputString.length-2); } }); connection.end(); app.get('/', function(req, res) { res.render('./index.html'); }); app.use(express.static('public')); //[5] Listen for incoming requests app.listen(process.env.PORT);

该示例显示数据库连接信息,还将查询数据库服务器并显示服务器的数据库。您可以根据需要轻松泛化它以便与数据库进行交互。以下说明是指上一代码中的已编号注释。

[1] 包括数据库连接数据

require 语句包含数据库连接数据。如后面所述,当您将数据库实例连接到应用程序时,AWS OpsWorks Stacks 会将连接数据放置到名为 opsworks.js 的文件中,这类似于以下内容:

exports.db = { "host":"nodeexample.cdlqlk5uwd0k.us-west-2.rds.amazonaws.com", "database":"nodeexampledb", "port":3306, "username":"opsworksuser", "password":"your_pwd", "reconnect":true, "data_source_provider":"rds", "type":"mysql"}

opsworks.js 位于应用程序的 shared/config 目录中,即 /srv/www/app_shortname/shared/config。但是,AWS OpsWorks Stacks 会将 opsworks.js 的符号链接放置在应用程序的根目录中,这样一来,您只需使用 require 'opsworks' 即可包含对象。

[2] 获取数据库连接数据

这组语句通过以下方式显示 opsworks.js 的连接数据:将 db 对象中的值分配给一组 app.locals 属性(每个属性映射到 index.html 文件中的一个 <%= ... %> 元素)。呈现的文档将 <%= ... %> 元素替换为对应的属性值。

[3] 连接到 Amazon RDS 实例

该示例使用 node-mysql 访问数据库。为了连接到数据库,该示例会通过将连接数据传递到 connection 来创建 createConnection 对象,然后调用 connection.connect 来建立连接。

[4] 查询数据库

建立连接后,该示例会调用 connection.query 以查询数据库。此示例只查询服务器的数据库名称。query 返回一个 results 对象数组(每个数据库对应一个该对象)以及分配给 Database 属性的数据库名称。该示例将串联这些名称并将其分配给 app.locals.databases,,后者将在渲染的 HTML 页面中显示此列表。

本示例包含五个数据库,一个是您在创建 RDS 实例时指定的 nodeexampledb 数据库,其他四个是由 Amazon RDS 自动创建的数据库。

[5] 侦听传入请求

最后一个语句将侦听指定端口上的传入请求。您无需指定明确的端口值。当您将应用程序添加到堆栈时,可指定应用程序是否支持 HTTP 或 HTTPS 请求。AWS OpsWorks随后,Stacks 会将 PORT 环境变量设置为 80 (HTTP) 或 443 (HTTPS),并且您可以在应用程序中使用此变量。

可以在其他端口上进行侦听,但是 Node.js App Server 层的内置安全组 AWS OpsWorks-nodejs-App-Server 仅允许进入端口 80、443 和 22 (SSH) 的入站用户流量。要允许流入其他端口的入站用户流量,请使用适当的入站规则创建安全组将其分配给 Node.js App Server 层。请勿通过编辑内置安全组来修改入站规则。每当您创建堆栈时,AWS OpsWorks Stacks 会使用标准设置覆盖内置安全组,因此,您所做的任何更改都将丢失。

注意

创建更新关联的应用程序时,可以将自定义环境变量与您的应用程序关联。您也可以通过使用自定义 JSON 和自定义配方将数据传递到您的应用程序。有关更多信息,请参阅 传递数据到应用程序

创建数据库服务器和负载均衡器

此示例使用 Amazon RDS 数据库服务器和 Elastic Load Balancing 负载均衡器实例。您必须先单独创建每个实例,然后将其合并到堆栈中。本部分介绍如何创建新的数据库和负载均衡器实例。相反,您可以使用现有实例,但建议您通读此过程以确保正确配置这些实例。

下面介绍了如何创建足够此示例使用的最低配置的 RDS 数据库实例。有关更多信息,请参阅 Amazon RDS 用户指南

创建 RDS 数据库实例
  1. 打开 控制台。

    打开 Amazon RDS 控制台,并将区域设置为美国西部(俄勒冈州)。在导航窗格中,选择 RDS Dashboard,然后选择 Launch DB Instance

  2. 指定数据库引擎。

    选择 MySQL Community Edition 作为数据库引擎。

  3. 拒绝多可用区部署。

    选择 No, this instance...,然后选择 Next。在此示例中,您不需要多可用区部署。

  4. 配置基本设置。

    DB Instance Details 页面上,指定以下设置:

    • DB Instance Classdb.t2.micro

    • Multi-AZ DeploymentNo

    • 分配的存储空间5 GB

    • 数据库实例标识符nodeexample

    • 主用户名opsworksuser

    • Master Password:所选密码

    记录实例标识符、用户名和密码以供将来使用,接受其他选项的默认设置,然后选择 Next

  5. 配置高级设置。

    Configure Advanced Settings 页面上,指定以下设置:

    • 数据库名称nodeexampledb

    • 数据库安全组:AWS--db- Master OpsWorks- Server

    注意

    AWS-OpsWorks db-Master-Server 安全组只允许您的堆栈的实例访问数据库。如果您需要直接访问数据库,请使用适当的入站规则将其他安全组连接到 RDS 数据库实例。有关更多信息,请参阅 Amazon RDS 安全组。您也可以通过将实例放置到 VPC 中来控制访问。有关更多信息,请参阅 在 VPC 中运行堆栈

    记录数据库名称以供将来使用,接受其他设置的默认值,然后选择 Launch DB Instance

以下过程介绍如何在此示例中创建 Elastic Load Balancing 负载均衡器。有关更多信息,请参阅 Elastic Load Balancing 用户指南

创建负载均衡器
  1. 打开 Amazon EC2 控制台。

    打开 Amazon EC2 控制台,并将区域设置为美国西部(俄勒冈州)。在导航窗格中,选择 Load Balancers,然后选择 Create Load Balancer

  2. 定义负载均衡器。

    Define Load Balancer 页面上,指定以下设置。

    • 名称Node-LB

    • 创建内部 LB - My Default VPC

    接受其他选项的默认设置,然后选择 Next

  3. 分配安全组。

    Assign Security Groups 页面上,指定以下组:

    • default VPC security group

    • AWS-nodej OpsWorks s-App-Server

    请选择 Next(下一步)。在 Configure Security Settings 页面上,选择 Next。在此示例中,您不需要安全侦听器。

  4. 配置运行状况检查。

    配置运行状况检查页面上,将 Ping 路径设置为 / 并接受其他设置的默认值。请选择 Next(下一步)。在 Add EC2 Instances 页面上,选择 Next。在 Add Tags 页面上,选择 Review and Create。在此示例中, Stacks 处理将 EC2 实例添加到负载均衡器的任务,并且您不需要标签。

  5. 创建负载均衡器。

    Review 页面上,选择 Create 以创建您的负载均衡器。

创建堆栈

现在,您已拥有创建堆栈所需的所有组件。

要创建 堆栈,请执行以下操作:
  1. 登录到 AWS OpsWorks Stacks 控制台。

    登录 AWS OpsWorks Stacks 控制台并选择 Add Stack (添加堆栈)

  2. 创建堆栈。

    要创建新的堆栈,请选择 Chef 11 stack,然后指定以下设置。

    • NodeStack

    • 区域 - 美国西部(俄勒冈)

      虽然您可在任何 Amazon Web Services Region 中创建堆栈,但在教程中,建议您在美国西部(俄勒冈州)中创建堆栈。

    选择 Add Stack。有关堆栈配置设置的更多信息,请参阅创建新堆栈

  3. 使用连接的负载均衡器添加 Node.js App Server 层。

    NodeStack页面上,选择添加图层,然后指定以下设置:

    • 图层类型Node.js App Server

    • 弹性负载均衡器Node-LB

    接受其他设置的默认值,然后选择 Add Layer

  4. 将实例添加到层并启动实例。

    在导航窗格中,选择 Instances,然后将两个实例添加到 Rails App Server 层,如下所示。

    1. Node.js App Server 下,选择添加实例

      Size 设置为 t2.micro,接受其他设置的默认值,然后选择 Add Instance

    2. 选择 +Instance,然后将另一个 t2.micro 实例添加到其他子网中的层。

      这会将实例放置在其他可用区 (AZ) 中。

    3. 选择 Add instance

    4. 要启动两个实例,请选择 Start All Instances

    您已向此层分配 Elastic Load Balancing 负载均衡器。当实例进入或退出联机状态时,AWS OpsWorks Stacks 会自动将实例注册到负载均衡器或取消注册实例。

    注意

    对于生产堆栈,建议您跨多个可用区分配您的应用程序服务器实例。如果用户无法连接到可用区,负载均衡器会将传入流量路由到剩余区域中的实例,并且您的站点将继续工作。

  5. 将 RDS 数据库实例注册到堆栈。

    在导航窗格中,选择 Resources 并将 RDS 数据库实例注册到堆栈,如下所示。

    1. 选择 RDS 选项卡,然后选择 Show Unregistered RDS DB 实例。

    2. 选择 nodeexampledb 实例,然后指定以下设置:

      • 用户 在创建实例时指定的主用户名;在此示例中为 opsworksuser

      • 密码 - 创建实例时指定的主密码。

    3. 选择 注册到堆栈 以将 RDS 数据库实例作为 Amazon RDS 服务层添加到堆栈。

    警告

    AWS OpsWorks Stacks 不会验证 User (用户)Password (密码) 值,而只是将其传递给应用程序。如果您错误地输入这些值,您的应用程序将无法连接到数据库。

    选择 注册到堆栈 以将 RDS 数据库实例作为 Amazon RDS 服务层添加到堆栈。

部署应用程序

您必须在远程存储库中存储应用程序。在您部署应用程序时,AWS OpsWorks Stacks 会将代码和相关文件从存储库部署到应用程序服务器实例。为方便起见,此示例将公有 Amazon Simple Storage Service (Amazon S3) 存档用作存储库,但您也可以使用多种其他存储库类型,包括 Git 和 Subversion。有关更多信息,请参阅 应用程序源

部署 应用程序
  1. 将应用程序打包到存档文件中。

    创建 .zip 目录和子目录的 nodedb 存档,名为 nodedb.zip。您还可以使用其他类型的存档文件,包括 gzip、bzip2 和 tarball。请注意,AWS OpsWorks Stacks 不支持未压缩的 tarball。有关更多信息,请参阅 应用程序源

  2. 将存档文件上传到 Amazon S3。

    nodedb.zip 上传到 Amazon S3 存储桶,使该文件成为公有文件,然后复制文件的 URL 以供将来使用。有关如何创建存储桶和上传文件的更多信息,请转至 Amazon Simple Storage Service 入门指南

    注意

    AWS OpsWorks Stacks 也可以部署 Amazon S3 存储桶中的私有文件,但为了简单起见,此示例使用公有文件。有关更多信息,请参阅 应用程序源

  3. 创建 AWS OpsWorks Stacks 应用程序。

    返回 AWS OpsWorks Stacks 控制台,在导航窗格中,选择 Apps (应用程序),然后选择 Add an app (添加应用程序)。指定以下设置:

    • 名称NodeDB

      该字符串是应用程序的显示名称。对于大多数用途而言,您需要应用程序的短名称,AWS OpsWorks Stacks 通过将所有字符转换为小写形式并删除标点符号来从显示名称生成该短名称。在本示例中,短名称是 nodedb。要验证应用程序的短名称,请在创建应用程序后,在 Apps 页上选择应用程序以显示其详细信息页面。

    • TypeNode.js

    • Data source type - RDS

    • Database instance - 选择之前注册的 Amazon RDS 数据库实例。

    • Database name - 指定您之前创建的数据库名称 (本示例中为 nodeexampledb)。

    • Repository type - Http Archive

      您必须对公有 Amazon S3 文件使用此存储库类型。S3 Archive 类型仅用于私有存档。

    • Repository URL - 存档文件的 Amazon S3 URL。

    对其余设置使用默认值,然后单击 Add App 创建应用程序。

  4. 部署应用程序。

    转至 Apps 页面,然后在 NodeDB 应用程序的 Actions 列中,选择 deploy。然后,选择 Deploy 以将该应用程序部署到服务器实例。AWS OpsWorksStacks 在每个实例上运行部署配方,这将从存储库下载应用程序并重新启动服务器。当每个实例均有一个绿色复选标记且 Statussuccessful 时,表示部署已完成,并且应用程序已准备好开始处理请求。

    注意

    如果部署失败,请选择 Log 列中的 show 以显示部署的 Chef 日志。错误信息显示在底部附近。

  5. 打开 应用程序。

    要打开应用程序,请选择 Layers,再选择负载均衡器,然后选择负载均衡器的 DNS 名称,这会将 HTTP 请求发送到负载均衡器。您应看到类似于以下内容的信息。

注意

设置期间,AWS OpsWorks Stacks 会自动将应用程序部署到新实例。仅联机实例需要手动部署。有关更多信息,请参阅 部署应用程序。有关部署的一般讨论 (包括一些更高级的部署策略),请参阅管理和部署应用程序和说明书

接下来做什么?

重要

AWS OpsWorks Stacks 不再接受新客户。在 2024 年 5 月 26 日之前,现有客户将能够正常使用 OpsWorks 控制台、API、CLI 和 CloudFormation 资源,届时它们将停产。为准备此过渡,我们建议您尽快将堆栈过渡到AWS Systems Manager。有关更多信息,请参阅 AWS OpsWorks Stacks 生命周期终止常见问题解答将 AWS OpsWorks Stacks 应用程序迁移到 AWS Systems Manager Application Manager

本演练将指导您了解设置简单的 Node.js 应用程序服务器堆栈的基础知识。以下是有关后续操作的一些建议。

检查 Node.js 内置说明书

如果您想详细了解实例的配置方式,请参阅层的内置说明书 opsworks_nodejs(此说明书包含 AWS OpsWorks Stacks 用来安装和配置软件的配方和相关文件)和内置部署说明书(此说明书包含 AWS OpsWorks Stacks 用来部署应用程序的配方)。

自定义服务器配置

该示例堆栈是非常基本的堆栈。要在生产中使用,您可能需要自定义堆栈。有关更多信息,请参阅 自定义 AWS OpsWorks 堆栈

添加 SSL 支持

在创建应用程序时,您可以启用对应用程序的 SSL 支持并为 AWS OpsWorks Stacks 提供适当的证书。AWS OpsWorks随后,Stacks 将在适当的目录中安装证书。有关更多信息,请参阅 使用 SSL

添加内存中数据缓存

生产级站点通常会通过在内存中的关键字/值存储 (如 Redis 或 Memcache) 中缓存数据来提高性能。您可将任一项用于 AWS OpsWorks Stacks 堆栈。有关更多信息,请参阅 ElastiCache RedisMemcached

使用更高级的部署策略

该示例使用一个简单的应用程序部署战略,该战略将更新同时部署到每个实例。此方法简单快捷,但不允许犯错误。如果部署失败或更新存在任何问题,则可能影响生产堆栈中的每个实例,从而可能中断或禁用您的站点,直到您解决该问题。有关部署策略的更多信息,请参阅管理和部署应用程序和说明书

扩展 Node.js App Server 层

您可以通过多种方式扩展层。例如,您可以实施配方以在实例上运行脚本,或实施 Chef 部署说明书以自定义应用程序部署。有关更多信息,请参阅 扩展层

定义环境变量

您可以通过定义关联应用程序的环境变量来将数据传递到您的应用程序。在部署应用程序时,AWS OpsWorks Stacks 将导出这些变量,以便您能够从应用程序进行访问。有关更多信息,请参阅 使用环境变量