當我在 Node.js 中執行 Lambda 程式碼時,如何解決「找不到模組」或「找不到套件」錯誤?

2 分的閱讀內容
0

當我在 Node.js 中執行 AWS Lambda 程式碼時,我收到「找不到模組」或「找不到套件」錯誤訊息。

簡短說明

如果您的 Lambda 環境在 Node.js 程式碼中找不到指定的程式庫,則您會收到其中一個錯誤。之所以發生這些錯誤,是因為 Lambda 並未預先封裝所有 Node.js 程式庫。

  • 如果 CommonJS 中缺少模組,則會收到下列錯誤: Runtime.ImportModuleError: Error: Cannot find module.
  • 如果使用 JavaScript ES6 缺少模組,則會收到下列錯誤: Error [ERR_MODULE_NOT_FOUND]: Cannot find package.

若要解決這些錯誤,請建立部署套件或 Lambda 圖層,其中包含您要在 Node.js 程式碼中使用的程式庫。

對於 Node.js 執行階段 16 及更早版本,Lambda 不支援分層式 JavaScript ES 模組相依性。您必須在部署中包括相依性。
Lambda 支援 JavaScript ES 模組相依性 Node.js 18。

使用下列步驟建立 Lambda 圖層。建立 Lambda 圖層而非部署套件,以便跨多個 Lambda 函數重複使用該圖層。每個 Lambda 執行階段會將特定的 /opt 目錄資料夾新增至 PATH 變數。如果圖層使用相同的資料夾結構,則 Lambda 函數的程式碼無需指定路徑即可存取圖層內容。

**重要事項:**您為 Node.js 匯入的程式庫必須位於 nodejs/node_modules 資料夾結構內。

解決方法

最佳做法是在 Lambda 執行期所依據的相同作業系統上建立 Lambda 圖層。例如,所有版本的 Node.js 都是基於 Amazon Linux 2 Amazon Machine Images (AMI)。

為 Node.js 程式庫建立一個 Lambda 圖層:

1、 從 Amazon Linux 2 AMI 建立一個 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體

2、 建立具有許可的 AWS 身份和存取管理 (IAM) 角色,以呼叫發佈層版本 API。然後,將 IAM 角色附加到 EC2 執行個體

注意:您的 EC2 執行個體現在具有上傳 Lambda 圖層以進行發佈層版本 API 呼叫的許可。

3、 連接至您的 EC2 執行個體,然後安裝 Node.js:

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
$ . ~/.nvm/nvm.sh
$ nvm install node

4、 建立一個 nodejs 資料夾:

$ mkdir nodejs

5、 將 aws-xray-sdk 程式庫安裝到 nodejs 資料夾中:

$ cd nodejs
$ npm init  ***answer all queries regarding initialization that create a package.json file***
$ npm install --save aws-xray-sdk

**注意:**將 aws-xray-sdk 範例程式庫取代為您要匯入的 Node.js 程式庫。

6、 為 aws-xray-sdk 程式庫建立一個壓縮存檔:

$ zip -r layer.zip nodejs

**注意:**aws-xray-sdk 程式庫採用 Node.js 圖層所需的資料夾格式:nodejs/node_modules

7、 發佈 Lambda 圖層:

$ aws lambda publish-layer-version --layer-name xray --zip-file fileb://layer.zip --compatible-runtimes nodejs12.x --region us-east-1

**注意:**要在您的代碼中添加模组 ECMAScript 6 (ES6) 或 CommonJS,請參閱 JavaScript ES6/CommonJS syntax

相關資訊

如何疑難排解上傳 Lambda 部署套件時的「權限被拒絕」或「無法匯入模組」錯誤?

AWS 官方
AWS 官方已更新 1 年前