使用 Node.js 建置 Lambda 函數 - AWS Lambda

使用 Node.js 建置 Lambda 函數

您可以在 AWS Lambda 中執行具有 Node.js 的 JavaScript 程式碼。Lambda 提供用於執行程式碼來處理事件的 Node.js 執行時間。您的程式碼將使用您所管理的 AWS Identity and Access Management (IAM) 角色的登入資料,在含有 AWS SDK for JavaScript 的環境中執行。

Lambda 支援以下 Node.js 執行時間。

Node.js
名稱 識別符 SDK 作業系統 架構 棄用 (階段 1)

Node.js 18

nodejs18.x

3.188.0

Amazon Linux 2

x86_64,arm64

Node.js 16

nodejs16.x

2.1083.0

Amazon Linux 2

x86_64,arm64

Node.js 14

nodejs14.x

2.1055.0

Amazon Linux 2

x86_64,arm64

Node.js 12

nodejs12.x

2.1055.0

Amazon Linux 2

x86_64,arm64

2023 年 3 月 31 日

注意

Node 18 執行階段使用適用於 JavaScript v3 的 AWS SDK。若要將函數從較舊的執行階段遷移至 Node 18,請依照 GitHub 上遷移研討會的說明操作。如需有關適用於 JavaScript 第 3 版的 AWS SDK 詳細資訊,請參閱 Modular AWS SDK for JavaScript is now generally available (適用於 JavaScript 的模組化 AWS SDK 現已正式推出) 部落格文章。

Lambda 函數使用執行角色取得許可,可將記錄寫入 Amazon CloudWatch Logs,並存取其他服務和資源。如果您還沒有執行角色可用於進行函式開發,請建立該角色。

若要建立執行角色
  1. 在 IAM 主控台中開啟 角色頁面

  2. 選擇 建立角色

  3. 建立具備下列屬性的角色。

    • 信任實體 - Lambda

    • 許可 - AWSLambdaBasicExecutionRole

    • 角色名稱 - lambda-role

    AWSLambdaBasicExecutionRole 政策具備函數將日誌寫入到 CloudWatch Logs 所需的許可。

您可以稍後再為該角色新增許可,或將其與特定於單一函式的另一角色互換。

若要建立 Node.js 函數
  1. 開啟 Lambda 主控台

  2. 選擇 建立函數

  3. 進行下列設定:

    • Name (名稱) – my-function

    • 執行階段 - Node.js 18.x

    • Role (角色) – 選擇現有的角色

    • Existing role (現有角色) - lambda-role

  4. 選擇 建立函數

  5. 若要設定測試事件,請選擇 Test (測試)

  6. Event name (事件名稱) 輸入 test

  7. 選擇 Save changes (儲存變更)

  8. 若要叫用函數,請選擇 Test (測試)。

主控台會建立一個 Lambda 函數,其具有名為 index.jsindex.mjs 的單一來源檔案。您可以使用內建的程式碼編輯器編輯該檔案並加入更多檔案。選擇 Save (儲存) 以儲存變更。然後,若要執行程式碼,請選擇 Test (測試)。

注意

Lambda 主控台使用 AWS Cloud9 在瀏覽器中提供整合式開發環境。您也可以使用 AWS Cloud9 在您自己的環境中開發 Lambda 函數。如需詳細資訊,請參閱《AWS Cloud9 使用者指南》中的使用 Lambda 函數

index.jsindex.mjs 檔案會匯出名為 handler 的函數,用於接受事件物件與內容物件。這就是在叫用函數時,Lambda 呼叫的處理常式函數。Node.js 函數執行時間會從 Lambda 中取得叫用事件並將它們傳遞至處理常式。在函式組態中,處理常式值為 index.handler

當您儲存函數程式碼時,Lambda 主控台會建立 .zip 封存檔部署套件。當您在主控台之外開發函數程式碼 (使用 IDE) 時,您需要建立部署套件將您的程式碼上傳到 Lambda 函數。

注意

若要開始在您的本機環境中開發應用程式,請部署本指南 GitHub 儲存庫中可用的其中一個範例應用程式。

以 Node.js 編寫的範例 Lambda 應用程式
  • blank-nodejs - 一個 Node.js 函數,它示範如何使用記錄、環境變數、AWS X-Ray 追蹤、層、單元測試以及 AWS 開發套件。

  • nodejs-apig - 具有公有 API 端點的函數,它會處理來自 API Gateway 的事件並傳回 HTTP 回應。

  • rds-mysql - 可將查詢轉送至 MySQL for RDS 資料庫的函數。此範例包括已在 AWS Secrets Manager 中設定密碼的私有 VPC 和資料庫執行個體。

  • efs-nodejs - 在 Amazon VPC 中使用 Amazon EFS 檔案系統的函數。此範例包含設為與 Lambda 搭配使用的 VPC、檔案系統、掛載目標以及存取點。

  • list-manager - 可處理來自 Amazon Kinesis 資料串流的事件並更新 Amazon DynamoDB 中的彙總清單的函數。函數會針對 RDS 資料庫的 MySQL 中的每個事件在私有 VPC 中存放一筆記錄。此範例包括具有 DynamoDB 適用之 VPC 端點的私有 VPC 和資料庫執行個體。

  • error-processor - 一種 Node.js 函數,可針對指定的請求百分比產生錯誤。記錄錯誤時,CloudWatch Logs 訂閱會叫用第二個函數。處理器函數使用 AWS 開發套件收集有關請求的詳細資訊,並將它們存放在 Amazon S3 儲存貯體中。

除了傳遞叫用事件外,函式執行時間還會傳遞內容物件至處理常式。內容物件包含了有關叫用、函式以及執行環境的額外資訊。更多詳細資訊將另由環境變數提供。

Lambda 函數隨附有 CloudWatch Logs 記錄群組。函數執行時間會將每次叫用的詳細資訊傳送至 CloudWatch Logs。它在叫用期間會轉送您的函數輸出的任何記錄。如果您的函數傳回錯誤,Lambda 會對該錯誤進行格式化之後傳回給叫用端。

Node.js 初始化

Node.js 有一個唯一的事件迴圈模型,導致其初始化行為與其他執行時間不同。具體而言,Node.js 使用支援異步操作的非阻塞 I/O 模型。此模型允許 Node.js 高效地執行大多數工作負載。例如,如果 Node.js 函數進行網路呼叫,則該請求可能被指定為異步操作並放入回呼佇列中。函數可能會繼續處理主呼叫堆疊中的其他操作,而不會透過等待網路呼叫返回而被阻止。網路呼叫完成後,系統會執行其回呼,然後從回呼佇列中移除。

某些初始化任務可異步執行。不能保證這些異步任務在叫用之前完成執行。例如,發出網路呼叫以便從 AWS 參數存放區中擷取參數的程式碼在 Lambda 執行處理常式函數時可能不完整。因此,在叫用期間,變數可能為空。為避免這種情況,請務必在繼續執行其餘的函數核心商業邏輯之前,將變數和其他非同步程式碼完全初始化。

或者,您可以將函數程式碼指定為 ES 模組,這樣便能使用位於檔案最上層的 await,超出了函數處理常式的範圍。當您對每個 Promise 執行 await,非同步初始化程式碼會在處理常式叫用之前完成,從而在降低冷啟動延遲方面最大限度地提高佈建並行的效率。如需詳細資訊和範例,請參閱在 AWS Lambda 中使用 Node.js ES 模組和頂層 await

將函數處理常式指定為 ES 模組

預設情況下,Lambda 會將帶有 .js 尾碼的檔案視為 CommonJS 模組。您可以選擇將程式碼指定為 ES 模組。您可利用兩種方式進行:在函數的 package.json 檔案中將 type 指定為 module,或使用 .mjs 副檔名。若使用第一種方式下,函數程式碼會將所有 .js 檔案視為 ES 模組,而在第二種情況下,只有您使用 .mjs 指定的檔案為 ES 模組。您可以透過分別將它們命名為 .mjs.cjs 來混合 ES 模組和 CommonJS 模組,因為 .mjs 檔案一律為 ES 模組,而 .cjs 檔案一律為 CommonJS 模組。

在 Node.js 14 和 Node.js 16 中,Lambda 執行階段會從與函數處理常式相同的資料夾或子資料夾載入 ES 模組。從 Node.js 18 開始,當載入 ES 模組時,Lambda 會在 NODE_PATH 環境變數中搜尋資料夾。使用 Node.js 18 時,您可以使用 ES 模組 import 陳述式載入執行階段中包含的 AWS SDK。您也可以從分層載入 ES 模組。