安裝您應用程式的相依性 - AWS Elastic Beanstalk

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

安裝您應用程式的相依性

您的應用程式可能與一些 Node.js 模組有相依性,例如您在 require() 陳述式中指定的模組。這些模組儲存在 node_modules 目錄中。當您的應用程式執行時,Node.js 會從此目錄載入模組。如需詳細資訊,請參閱 Node.js 文件中的從 node_modules 資料夾載入

您可以使用 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 登錄檔的相依性的問題。而由於相依性模組來自本機目錄,所以這可能也有助於縮短部署時間。如需詳細資訊,請參閱 在 a node_modules 目錄中納入 Node.js 相依性

使用 package.json 檔案指定 Node.js 相依性

package.json 檔案包含在專案來源根目錄中來指定相依性套件並提供啟動命令。當有 package.json 檔案存在且您專案來源的根目錄中沒有 node_modules 目錄時,Elastic Beanstalk 會以 webapp 使用者的身分執行 npm install,以安裝來自公共 npm 登錄檔的相依性。Elastic Beanstalk 也會使用 start 命令來啟動您的應用程式。如需有關 package.json 檔案的詳細資訊,請參閱 npm Docs 網站中的《package.json 檔案中指定相依性》。

使用 scripts 關鍵字來提供啟動命令。現在,在 aws:elasticbeanstalk:container:nodejs 命名空間中使用 scripts 關鍵字來取代舊版的 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 檔案中指定相依性,請使用 dependenciesdevDependencies 屬性。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 套件,請將 PM_USE_PRODUCTION 環境屬性設為 false。透過此設定,我們不會在執行 npm 安裝時使用上述選項。這將導致安裝 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" }

版本和版本範圍

重要

指定版本範圍的功能不適用於在 AL2023 上執行的 Node.js 平台分支。在 AL2023 上特定的 Node.js 分支內,只支援一個 Node.js 版本。如果 package.json 檔案指定了版本範圍,我們將予以忽略,並預設為 Node.js 的平台分支版本。

package.json 檔案中使用 engines 關鍵字,來指定您希望應用程式使用的 Node.js 版本。您也可以使用 npm 標記法指定版本範圍。如需有關版本範圍語法的詳細資訊,請參閱 Node.js 網站上的 Semantic Versioning using npm (使用 npm 的語意版本控制)。Node.js package.json 檔案中的 engines 關鍵字取代 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 版本,請參閱 AWS Elastic Beanstalk 平台指南中的 Node.js

注意

如果您所使用的 Node.js 版本的支援已從平台移除,您必須在平台更新之前變更或移除 Node.js 版本設定。當發現一個或多個版本的 Node.js 存在安全漏洞時,可能會出現此種狀況。

此時,如果嘗試將不支援已設定 Node.js 版本的平台更新至新版本,此動作將會失敗。為省去建立新環境的必要,請將 package.json 中的 Node.js 版本設定變更為新舊平台版本皆支援的 Node.js 版本。您可以選擇指定包含支援版本的 Node.js 版本範圍,如本主題之前所述。您也可以選擇移除設定,然後部署新的來源套件。

在 a node_modules 目錄中納入 Node.js 相依性

若要將相依性套件與應用程式程式碼一起部署至環境執行個體,請將它們包含在專案來源根中名為 node_modules 的目錄內。如需詳細資訊,請參閱 npm Docs 網站中的《在本機下載和安裝套件》。

當您將 node_modules 目錄部署到 Amazon Linux 2 Node.js 平台版本時,Elastic Beanstalk 會假設您提供自己的相依性套件,並避免安裝 package.json 檔案中指定的相依性。Node.js 會在 node_modules 目錄中找尋相依性。如需詳細資訊,請參閱 Node.js 文件中的從 node_modules 資料夾載入

注意

如果您在 Elastic Beanstalk 執行 npm install 時遭遇任何部署問題,在調查問題時,請考慮使用本主題中描述的方法作為變通措施。