使用 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 |
|
3.188.0 |
Amazon Linux 2 |
x86_64,arm64 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Node.js 16 |
|
2.1083.0 |
Amazon Linux 2 |
x86_64,arm64 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Node.js 14 |
|
2.1055.0 |
Amazon Linux 2 |
x86_64,arm64 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Node.js 12 |
|
2.1055.0 |
Amazon Linux 2 |
x86_64,arm64 |
2023 年 3 月 31 日 |
注意
Node 18 執行階段使用適用於 JavaScript v3 的 AWS SDK。若要將函數從較舊的執行階段遷移至 Node 18,請依照 GitHub 上遷移研討會
Lambda 函數使用執行角色取得許可,可將記錄寫入 Amazon CloudWatch Logs,並存取其他服務和資源。如果您還沒有執行角色可用於進行函式開發,請建立該角色。
若要建立執行角色
-
在 IAM 主控台中開啟 角色頁面
。 -
選擇 建立角色。
-
建立具備下列屬性的角色。
-
信任實體 - Lambda。
-
許可 - AWSLambdaBasicExecutionRole。
-
角色名稱 -
lambda-role
。
AWSLambdaBasicExecutionRole 政策具備函數將日誌寫入到 CloudWatch Logs 所需的許可。
-
您可以稍後再為該角色新增許可,或將其與特定於單一函式的另一角色互換。
若要建立 Node.js 函數
-
開啟 Lambda 主控台
。 -
選擇 建立函數。
-
進行下列設定:
-
Name (名稱) –
my-function
。 -
執行階段 - Node.js 18.x。
-
Role (角色) – 選擇現有的角色。
-
Existing role (現有角色) -
lambda-role
。
-
-
選擇 建立函數。
-
若要設定測試事件,請選擇 Test (測試)。
-
Event name (事件名稱) 輸入
test
。 -
選擇 Save changes (儲存變更)。
-
若要叫用函數,請選擇 Test (測試)。
主控台會建立一個 Lambda 函數,其具有名為 index.js
或 index.mjs
的單一來源檔案。您可以使用內建的程式碼編輯器編輯該檔案並加入更多檔案。選擇 Save (儲存) 以儲存變更。然後,若要執行程式碼,請選擇 Test (測試)。
注意
Lambda 主控台使用 AWS Cloud9 在瀏覽器中提供整合式開發環境。您也可以使用 AWS Cloud9 在您自己的環境中開發 Lambda 函數。如需詳細資訊,請參閱《AWS Cloud9 使用者指南》中的使用 Lambda 函數。
index.js
或 index.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 模組。