配置应用程序对 Elastic Beanstalk 的依赖关系 - AWS Elastic Beanstalk

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

配置应用程序对 Elastic Beanstalk 的依赖关系

您的应用程序可能依赖于某些应用程序 Node.js 模块,例如您在require()语句中指定的模块。这些模块存储在 node_modules 目录中。当您的应用程序运行时,Node.js 从这个目录加载模块。有关更多信息,请参阅中的 “从 node_modules 文件夹加载” Node.js 文档中)。

您可以使用 package.json 文件指定这些模块依赖项。如果 Elastic Beanstalk 检测到此文件,但 node_modules 目录不存在,则 Elastic Beanstalk 将以 webapp 用户身份运行 npm installnpm install 命令将依赖项安装在 Elastic Beanstalk 事先创建的 node_modules 目录中。npm install 命令会从公共 npm 注册表或其他位置访问 package.json 文件中列出的软件包。有关更多信息,请参阅 npm Docs 网站。

如果 Elastic Beanstalk 检测到 node_modules 目录,则即使存在 package.json 文件,Elastic Beanstalk 也不会运行 npm install。Elastic Beanstalk 假设依赖包在以下目录中可用 node_modules Node.js 访问和加载。

以下各节提供了有关建立您的 Node.js 应用程序的模块依赖关系。

注意

如果您在 Elastic Beanstalk 运行 npm install 时遇到任何部署问题,请考虑其他方法。在您的应用程序源包中包括含依赖模块的 node_modules 目录。这样做可以避免在调查问题时从公共 npm 注册表安装依赖项时出现问题。由于依赖模块来自本地目录,这样做也可能有助于缩短部署时间。有关更多信息,请参阅 包括 Node.js node_modules 目录中的依赖关系

指定 Node.js 与 package.json 文件的依赖关系

包含项目源的根目录中的 package.json 文件来指定依赖项包并提供启动命令。当 package.json 文件存在,且项目源的根目录中不存在 node_modules 目录时,Elastic Beanstalk 会以 webapp 用户的身份运行 npm install 来从公共 npm 注册表安装依赖项。Elastic Beanstalk 还使用 start 命令来启动您的应用程序。有关 package.json 文件的更多信息,请参阅 npm Docs 网站中的package.json 文件中指定依赖项

使用 scripts 关键字来提供启动命令。当前使用 scripts 关键字,而不是 aws:elasticbeanstalk:container:nodejs 命名空间中的原有 NodeCommand 选项。

例 package.json - Express
{ "name": "my-app", "version": "0.0.1", "private": true, "dependencies": { "ejs": "latest", "aws-sdk": "latest", "express": "latest", "body-parser": "latest" }, "scripts": { "start": "node app.js" } }
生产模式和开发依赖项

要在package.json文件中指定依赖关系,请使用依赖关系devDependencies属性。dependencies 属性指定您的应用程序在生产中所需的软件包。该devDependencies属性指定仅在本地开发和测试中需要的软件包。

Elastic Beanstalk 使用以下命令以 webapp 用户身份运行 npm install。命令选项因运行应用程序的平台分支中包含的 npm 版本而异。

  • npm v6 – 默认情况下,Elastic Beanstalk 在生产模式下安装依赖项。它使用命令 npm install --production

  • npm v7 或更高版本 — Elastic Beanstalk 省略了。devDependencies它使用命令 npm install --omit=dev

上面列出的两个命令都不会安装相应的软件包devDependencies

如果需要安装devDependencies软件包,请将 NPM USE _ PRODUCTION 环境属性设置为false。使用此设置,在运行 npm install 时将不使用上述选项。这将导致devDependencies软件包被安装。

SSH和 HTTPS

从 2023 年 3 月 7 日的 Amazon Linux 2 平台版本开始,您还可以使用SSH和HTTPS协议从 Git 存储库中检索软件包。平台分支 Node.js 16 同时支持SSH和HTTPS协议。Node.js 14 仅支持该HTTPS协议。

例 package.json Node.js 16 同时支持HTTPS和 SSH
... "dependencies": { "aws-sdk": "https://github.com/aws/aws-sdk-js.git", "aws-chime": "git+ssh://git@github.com:aws/amazon-chime-sdk-js.git" }

版本和版本范围

重要

指定版本范围的功能不适用于在 AL2 023 上运行的 Node.js 平台分支。在 AL2 023,我们只支持特定 Node.js 分支中的一个 Node.js 版本。如果您的 package.json 文件指定了版本范围,我们将忽略它并默认设为 Node.js 的平台分支版本。

package.json文件中使用engines关键字指定 Node.js 你想让你的应用程序使用的版本。您还可以使用 npm 表示法指定版本范围。有关版本范围语法的更多信息,请参阅上的 “使用 npm 进行语义版本控制” Node.js 网站。中的engines关键字 Node.js package.jsonfile 取代了aws:elasticbeanstalk:container:nodejs命名空间中的旧版NodeVersion选项。

package.json— 单曲 Node.js 版本
{ ... "engines": { "node" : "14.16.0" } }
package.json – Node.js 版本范围
{ ... "engines": { "node" : ">=10 <11" } }

当显示版本范围时,Elastic Beanstalk 会安装最新版本 Node.js 该平台在该范围内可用的版本。在此示例中,范围指示版本必须大于或等于版本 10,但小于版本 11。因此,Elastic Beanstalk 安装了最新的 Node.js 版本 10.x.y,可在支持的平台上使用。

请注意,您只能指定 Node.js 与您的平台分支相对应的版本。例如,如果你使用的是 Node.js 16 个平台分支,你只能指定 16.x.y Node.js 版本。您可以使用 npm 支持的版本范围选项来提高灵活度。为了有效 Node.js 每个平台分支的版本,请参阅 Node.jsAWS Elastic Beanstalk 平台指南中。

注意

如果对您正在使用的 Node.js 版本的支持已从平台中移除,则您必须先更改或移除 Node.js 版本设置再进行平台更新。当在一个或多个 Node.js 版本中识别到安全漏洞时,可能会发生这种情况。

发生此情况时,尝试更新到不支持所配置的 Node.js 版本的新平台版本会失败。为避免需要创建新环境,请将 package.json 中的 Node.js 版本设置更改为旧平台版本和新平台版本都支持的 Node.js 版本。您可以选择指定包含受支持版本的 Node.js 版本范围,如本主题前面所述。您还可以选择删除设置,然后部署新的源包。

包括 Node.js node_modules 目录中的依赖关系

要将依赖项程序包与应用程序代码一起部署到环境实例,请将它们包括在项目源根目录下名为 node_modules 的目录中。有关更多信息,请参阅 npm Docs 网站中的在本地下载和安装软件包

当您将node_modules目录部署到 AL2 023/ AL2 Node.js 平台版本,Elastic Beanstalk 假设你提供了自己的依赖包,并且避免安装在 package.json 文件中指定的依赖项。Node.js 在node_modules目录中查找依赖关系。有关更多信息,请参阅《从 node_modules 文件夹加载》中的 Node.js 文档中)。

注意

如果您在 Elastic Beanstalk 运行 npm install 时遇到任何部署问题,请在调查问题时考虑使用本主题中描述的方法作为解决方法。