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

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Node.js 建置 Lambda 函數

您可以在中使用 Node.js 執行 JavaScript 程式碼 AWS Lambda。Lambda 提供用於執行程式碼來處理事件的 Node.js 執行期。您的程式碼會在包含您管理之 AWS SDK for JavaScript AWS Identity and Access Management (IAM) 角色的登入資料的環境中執行。若要進一步瞭解 Node.js 執行階段隨附的 SDK 版本,請參閱包含執行階段的 SDK 版本

Lambda 支援以下 Node.js 執行期。

Node.js
名稱 識別符 作業系統 取代日期 封鎖函數建立 封鎖函數更新

Node.js 20

nodejs20.x

Amazon Linux 2023

Node.js 18

nodejs18.x

Amazon Linux 2

Node.js 16

nodejs16.x

Amazon Linux 2

2024 年 6 月 12 日

2024 年 7 月 15 日

2024 年 8 月 15 日

注意

Node.js 18 及更新版本的執行階段會針對 JavaScript v3 使用 AWS SDK。若要從較早的執行階段移轉函數,請遵循上的移轉研討會 GitHub。如需有關第 3 JavaScript 版 AWS SDK 的詳細資訊,請參閱模組化 AWS SDK 的部落格文章。 JavaScript

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

  2. 選擇建立函數

  3. 進行下列設定:

    • 函數名稱:輸入函數名稱。

    • 執行期:選擇 Node.js 20.x

  4. 選擇建立函數

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

  6. 事件名稱輸入 test

  7. 選擇儲存變更

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

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

注意

Lambda 主控台用 AWS Cloud9 來在瀏覽器中提供整合式開發環境。您也可以使用 AWS Cloud9 在自己的環境中開發 Lambda 函數。若要取得更多資訊,請參閱使用指南 AWS 工具組中的〈使用 AWS Lambda 函數〉。 AWS Cloud9

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

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

注意

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

以 Node.js 編寫的範例 Lambda 應用程式
  • 空白 nodejs-一個 Node.js 函數,顯示日誌記錄,環境變量, AWS X-Ray 跟踪,圖層,單元測試和 SDK 的使用。 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 SDK 收集有關請求的詳細資訊,並將其存放在 Amazon S3 儲存貯體中。

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

您的 Lambda 函數隨附一個 CloudWatch 日誌記錄群組。函數運行時將有關每次調用的詳細信息發送到 CloudWatch 日誌。它在調用期間會轉送您的函數輸出的任何記錄。如果您的函數傳回錯誤,Lambda 會對該錯誤進行格式化之後傳回給調用端。

Node.js 初始化

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

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

或者,您可以將函數程式碼指定為 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 16 的 Node.js 執行期版本,Lambda 執行期會從與函數處理常式相同的資料夾或子資料夾載入 ES 模組。從 Node.js 18 開始,當載入 ES 模組時,Lambda 會在 NODE_PATH 環境變數中搜尋資料夾。此外,從 Node.js 18 開始,您可以使用 ES 模組import陳述式載入執行階段中包含的 AWS SDK。您也可以從分層載入 ES 模組。

包含執行階段的 SDK 版本

Node.js 執行階段中包含的 AWS SDK 版本取決於執行階段版本和您的 AWS 區域. 若要尋找您正在使用的執行階段中包含的 SDK 版本,請使用下列程式碼建立 Lambda 函數。

注意

下面顯示的 Node.js 版本 18 及以上的示例代碼使用 CommonJS 格式。如果您在 Lambda 主控台中建立函數,請務必將包含程式碼的檔案重新命名為index.js

範例 Node.js 16
const { version } = require("aws-sdk/package.json"); exports.handler = async () => ({ version });

這會傳回下列格式的回應:

{ "version": "2.1374.0" }
範例 Node.js 18 及以上版本
const { version } = require("@aws-sdk/client-s3/package.json"); exports.handler = async () => ({ version });

這會傳回下列格式的回應:

{ "version": "3.462.0" }

使用保持連線保持 TCP 連線

預設 Node.js HTTP/HTTPS 代理程式會為每個新的請求建立新的 TCP 連線。為了避免建立新連接的成本,您可以使keepAlive: true用重複使用函數使用 AWS SDK 進行的連接 JavaScript。保持連線可以減少使用 SDK 進行多次 API 呼叫的 Lambda 函數的請求次數。保持連線的行為會因為您使用的 SDK 版本而有所不同:

  • 在包含在 Lambda 執行階段nodejs18.x及更新版本的 JavaScript 3.x 版 AWS SDK 中,依預設會啟用保持活動狀態。若要停用保持活動狀態,請參閱 3.x AWS 版 SDK 開發人員指南中的 Node.js 中以保持活動狀態重複使用連線。 JavaScript

  • 在包含在 nodejs16.x Lambda 執行階段中的 JavaScript 2.x AWS 版 SDK 中,依預設會停用保持活動狀態。若要啟用保持活動狀態,請參閱 2.x AWS 版 SDK 開發人員指南中的 Node.js 中以保持活動狀態重複使用連線。 JavaScript

有關使用保持活動的更多信息,請參閱開發人員工具博客上的模塊化 AWS SDK 中默認打開 HTTP 保持活動狀態。 JavaScript AWS

CA 憑證載入

對於 Node.js 18 以下的 Node.js 執行階段版本,Lambda 會自動載入亞馬遜特定的 CA (憑證授權單位) 憑證,讓您更輕鬆地建立與其他 AWS 服務互動的函數。例如,Lambda 包含在 Amazon RDS 資料庫上安裝的驗證伺服器身分憑證所需的 Amazon RDS 憑證。此行為可能會在冷啟動期間產生效能影響。

從 Node.js 20 開始,在預設情況下,Lambda 不再載入額外的 CA 憑證。Node.js 20 執行期包含一個憑證檔案,其中包含所有 Amazon CA 憑證位於 /var/runtime/ca-cert.pem。若要從 Node.js 18 及更早版本的執行期還原相同的行為,請將 NODE_EXTRA_CA_CERTS環境變數設定為 /var/runtime/ca-cert.pem

為了獲得最佳效能,我們建議您只將需要的憑證與部署套件搭配,並透過 NODE_EXTRA_CA_CERTS 環境變數載入憑證。憑證檔案應包含一或多個 PEM 格式的受信任根憑證或中繼 CA 憑證。例如,對於 RDS,請在程式碼旁包含所需的憑證做為 certificates/rds.pem。然後,藉由將 NODE_EXTRA_CA_CERTS 設定為 /var/task/certificates/rds.pem 載入憑證。