當我在 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 層,請完成下列步驟:
-
從 Amazon Linux 2 AMI 建立 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。
-
建立具有呼叫 publish-layer-version API 權限的 AWS Identity and Access Management (IAM) 角色。
-
將 IAM 角色附加至 Amazon EC2 執行個體。
**注意:**您的 EC2 執行個體現在有權限為 publish-layer-version API 呼叫上傳 Lambda 層。
-
使用 SSH 連線到 EC2 執行個體。
-
安裝 Node.js:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash$ . ~/.nvm/nvm.sh
nvm install node
-
建立 nodejs 資料夾:
mkdir nodejs
-
將 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 程式庫。
-
為 aws-xray-sdk 程式庫建立 .zip 檔案封存:
zip -r layer.zip nodejs
**注意:**aws-xray-sdk 程式庫採用 Node.js 層所需的資料夾格式:nodejs/node_modules。
-
若要發佈 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 部署套件?