在 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 關鍵字來提供啟動命令。現在,在 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檔案中指定您的相依性,請使用相依性和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 environment 屬性設定為 false。透過此設定,我們不會在執行 npm 安裝時使用上述選項。這將導致安裝devDependencies套件。

SSH 和 HTTPS

從 2023 年 3 月 7 日開始,您也可以使用 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 標記法指定版本範圍。如需版本範圍語法的詳細資訊,請參閱 上的使用 npm 的語意版本控制 Node.js 網站。中的engines關鍵字 Node.js package.json 檔案會取代aws:elasticbeanstalk:container:nodejs命名空間中的舊版NodeVersion選項。

範例 package.json – 單一 Node.js version
{ ... "engines": { "node" : "14.16.0" } }
範例 package.json – Node.js 版本範圍
{ ... "engines": { "node" : ">=10 <11" } }

指定版本範圍時,Elastic Beanstalk 會安裝最新的 Node.js 平台在 範圍內可用的版本。在此範例中,範圍指出版本必須大於或等於版本 10,但小於版本 11。因此,Elastic Beanstalk 安裝最新的 Node.js version 10.x.y,其可在支援的平台 上使用。

請注意,您只能指定 Node.js 與您的平台分支對應的版本。例如,如果您使用 Node.js 16 個平台分支,您只能指定 16.x.y Node.js 版本。您可以使用 npm 支援的版本範圍選項以允許更多的靈活性。對於有效 Node.js 每個平台分支的版本,請參閱 Node.js AWS 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目錄部署到 AL2023/AL2 Node.js 平台版本,Elastic Beanstalk 假設您提供自己的相依性套件,並避免安裝 package.json 檔案中指定的相依性。Node.js 在node_modules目錄中尋找相依性。如需詳細資訊,請參閱中的從 node_modules 資料夾載入 Node.js 文件中)。

注意

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