使用 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 20

nodejs20.x

Amazon Linux 2023

未排程

未排程

未排程

Node.js 18

nodejs18.x

Amazon Linux 2

2025 年 7 月 31 日

2025 年 9 月 1 日

2025 年 10 月 1 日

注意

Node.js 18 AWS SDK及更新版本執行時間用於 JavaScript v3。若要從較早的執行時間遷移函數,請遵循 上的遷移研討會 GitHub。如需第 3 JavaScript 版的詳細資訊 AWS SDK,請參閱適用於 的模組化 AWS SDK JavaScript 現已正式推出部落格文章。

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

  2. 選擇建立函數

  3. 進行下列設定:

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

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

  4. 選擇建立函數

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

  6. 事件名稱輸入 test

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

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

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

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

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

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

您的 Lambda 函數隨附 CloudWatch Logs 日誌群組。函數執行期會將每次調用的詳細資訊傳送至 CloudWatch Logs。它在調用期間會轉送您的函數輸出的任何記錄。如果您的函數傳回錯誤,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 模組。

Lambda 會在載入 ES 模組時搜尋NODE_PATH環境變數中的資料夾。您可以使用 ES AWS SDK模組import陳述式,載入包含在執行階段中的 。您也可以從分層載入 ES 模組。

包含執行期的SDK版本

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

注意

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

範例 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。Keep-alive 可以減少使用 進行多次API呼叫的 Lambda 函數的請求時間SDK。

在 AWS SDK JavaScript 3.x 版中,包含於 nodejs18.x和更新版本的 Lambda 執行階段中,依預設會啟用保持連線。若要停用保持連線,請參閱 適用於 3.x 開發人員指南 中的在 Node.js 中重複使用具有保持連線的連線AWS SDK JavaScript 如需使用保持連線的詳細資訊,請參閱 AWS 開發人員工具部落格上的 HTTP 模組化 AWS SDK 中的保持連線預設為開啟 JavaScript

CA 憑證載入

對於 Node.js 執行期版本,Lambda 會自動載入 Amazon 特定的 CA (憑證授權機構) 憑證,讓您更輕鬆地建立與其他 AWS 服務互動的函數。例如,Lambda 包含驗證安裝在 Amazon RDS 資料庫上的伺服器身分RDS憑證所需的 Amazon 憑證。 https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html此行為可能會在冷啟動期間產生效能影響。

從 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 載入憑證。