AWS LambdaNode.js 中的 函數處理常式 - AWS Lambda

AWS LambdaNode.js 中的 函數處理常式

Lambda 函數處理常式是您的函數程式碼中處理事件的方法。當有人呼叫您的函數時,Lambda 會執行處理常式方法。當處理常式結束或傳回回應時,就可以處理另一個事件。

以下範例函式紀錄事件物件的內容和傳回日誌的位置。

範例 index.js

exports.handler = async function(event, context) { console.log("EVENT: \n" + JSON.stringify(event, null, 2)) return context.logStreamName }

當您設定函數時,處理常式的設定值就是檔案名稱,以及已匯出之處理常式方法的名稱,並且以點分隔。主控台中的預設值,例如在此指南中為 index.handler。這表示 handler 方法是透過 index.js 檔案匯出的。

執行時間通過三個引述到處理常式方法。第一個引數是 event 物件,其中包含來自叫用端的資訊。呼叫者會在呼叫 Invoke 時,以 JSON 格式的字串傳遞此資訊,然後執行時間將它轉換為物件。當 AWS 服務叫用您的函式時,事件結構會依服務變化

第二個引數為 內容物件,其中包含有關呼叫、函式和執行環境的資訊。在上述範例中,該函式從內容物件取得日誌串流的名稱並傳回給叫用端。

第三個引數為 callback,這是您可以在非異步處理常式中呼叫以傳送回應的函數。回乎函式需要兩個引數,一個 Error 和回應。當您呼叫函數時,Lambda 會等待事件循環為空,然後將回應或錯誤傳回給叫用者。回應物件必須與 JSON.stringify 相容。

對於非同步函數,您傳回回應、錯誤或承諾到執行時間,而不是使用 callback

如果您的函數有額外的相依項,使用 npm 將它們包含在您的部署套件中

非同步處理常式

對於非同步函數,您可以使用 returnthrow 傳送回應或錯誤。函式必須使用 async 關鍵字來使用這些方法傳回回應或錯誤。

如果您的程式碼執行非同步任務,則會傳回承諾以確保完成執行。當您解決或拒絕承諾,則 Lambda 傳送回應或錯誤給叫用者。

範例 index.js 檔案 - 具有非同步處理常式和承諾的 HTTP 請求

const https = require('https') let url = "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" exports.handler = async function(event) { const promise = new Promise(function(resolve, reject) { https.get(url, (res) => { resolve(res.statusCode) }).on('error', (e) => { reject(Error(e)) }) }) return promise }

對於程式庫的傳回承諾,您可以直接傳回承諾到執行時間。

範例 index.js 檔案 - 具有非同步處理常式和承諾的 AWS 開發套件

const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = async function(event) { return s3.listBuckets().promise() }

使用 Node.js 模組和頂級等待

您可以將函數程式碼指定為 ES 模組,允許您使用位於檔案最上層的 await,超出了函數處理常式的範圍。這可以保證在處理常式叫用之前完成異步初始化程式碼,從而在降低冷啟動延遲方面最大限度地提高佈建並行的效率。您可利用兩種方式進行:在函數的 package.json 檔案中將 type 指定為 module,或使用 .mjs 副檔名。

在第一種情況下,函數程式碼將所有 .js 檔案視為 ES 模組,而在第二種情況下,只有使用 .mjs 指定的檔案為 ES 模組。可以透過分別將它們命名為 .mjs 和 .cjs 來混合 ES 模組和 CommonJS 模組,因為 .mjs 檔案始終是 ES 模組,而 .cjs 檔案始終是 CommonJS 模組。

如需詳細資訊和範例,請參閱在 AWS Lambda 中使用 Node.js ES 模組和頂級等待

非異步處理常式

以下範例函式檢查 URL 及傳回狀態碼給叫用端。

範例 index.js 檔案 - 具有回呼的 HTTP 請求

const https = require('https') let url = "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" exports.handler = function(event, context, callback) { https.get(url, (res) => { callback(null, res.statusCode) }).on('error', (e) => { callback(Error(e)) }) }

對於非異步處理常式,函數將繼續執行,直到事件迴圈清空或函數逾時。直到完成所有的事件迴圈任務,回應才會傳送到叫用端。如果函式逾時,便會傳回錯誤。您可以透過設定 context.callbackWaitsForEmptyEventLoop 為「false (失敗)」來設定執行時間立即傳回回應。

在下列範例中,Amazon S3 的回應會在可用時立即傳回給叫用者。逾時的事件迴圈已凍結,並繼續執行下一個時間叫用的函式。

範例 index.js 檔案 - callbackWaitsForEmptyEventLoop

const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = function(event, context, callback) { context.callbackWaitsForEmptyEventLoop = false s3.listBuckets(null, callback) setTimeout(function () { console.log('Timeout complete.') }, 5000) }