跳至內容

如何解決當我在 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]: 找不到套件。

解決方法

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

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

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

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

最佳做法是在 Lambda 支援的執行時期所依據的相同作業系統 (OS) 上建立 Lambda 層。例如,Node.js 的最新版本是依據 Amazon Linux 2023 Amazon Machine Image (AMI)。

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

若要為 Node.js 程式庫建立 Lambda 層,請完成下列步驟:

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

  2. 建立具有呼叫 publish-layer-version API 權限的 AWS Identity and Access Management (IAM) 角色

  3. 將 IAM 角色附加至 Amazon EC2 執行個體
    **注意:**您的 EC2 執行個體現在有權限為 publish-layer-version API 呼叫上傳 Lambda 層。

  4. 使用 SSH 連線到 EC2 執行個體

  5. 安裝 Node.js:

    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash$ . ~/.nvm/nvm.sh
    nvm install node
    
  6. 建立 nodejs 資料夾:

    mkdir nodejs
    
  7. aws-xray-sdk 程式庫安裝到 nodejs 資料夾中:

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

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

  8. aws-xray-sdk 程式庫建立 .zip 檔案封存:

    zip -r layer.zip nodejs
    

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

  9. 若要發佈 Lambda 層,請執行下列 publish-layer-version 命令:

    aws lambda publish-layer-version --layer-name xray --zip-file fileb://layer.zip --compatible-runtimes nodejs12.x --region your-region
    

    **注意:**將 your-region 替換為您的 AWS 區域。

若要在程式碼中新增模組 ECMAScript 6 (ES6) 或 CommonJS,請參閱 JavaScript ES6/CommonJS 語法

相關資訊

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

如何建置 Node.js 的 Lambda 部署套件?

AWS 官方已更新 1 年前