在 Ruby 中定義 Lambda 函數處理程 - AWS Lambda

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

在 Ruby 中定義 Lambda 函數處理程

Lambda 函數處理常式是您的函數程式碼中處理事件的方法。當有人呼叫您的函數時,Lambda 會執行處理常式方法。函數會執行,直到處理常式傳回回應、結束或逾時為止。

Ruby 處理程序基礎

以下範例中,檔案 function.rb 定義了一個名為 handler 的處理常式方法。處理函數需要兩個對象作為輸入,並返回一個JSON文檔。

範例 function.rb
require 'json' def handler(event:, context:) { event: JSON.generate(event), context: JSON.generate(context.inspect) } end

在您的函數組態中,handler 設定會告知 Lambda 應至何處尋找處理常式。接續前述範例,此設定的正確值為 function.handler。其包括兩個以句點分隔的名稱:檔案的名稱和處理常式方法的名稱。

您也可以透過類別定義處理常式方法。以下範例在名為 LambdaFunctions 的模組之下透過名為 Handler 的類別定義 process 處理常式方法。

範例 source.rb
module LambdaFunctions class Handler def self.process(event:,context:) "Hello!" end end end

就本例而言,handler 設定是 source.LambdaFunctions::Handler.process

處理常式接受的兩個物件分別為叫用事件和內容。事件是 Ruby 物件,其包含了由叫用端所提供的承載。如果有效負載是JSON文檔,則事件對象是 Ruby 哈希值。否則將會是字串。內容物件具有方法和各項屬性,提供了有關叫用、函式以及執行環境的資訊。

每次叫用您的 Lambda 函數時都將執行函數處理常式。位於處理常式外部的靜態程式碼則是按照函式的每一執行個體各執行一次。如果您的處理常式使用用SDK戶端和資料庫連線等資源,您可以在處理常式方法之外建立這些資源,以便在多次呼叫中重複使用這些資源。

函式的每一執行個體均可處理多個叫用事件,但是一次僅處理一個事件。在任何特定時間內處理某一事件的執行個體數目稱為函式的並行數。如需 Lambda 執行環境的詳細資訊,請參閱 瞭解 Lambda 執行環境生命週期

Ruby 函數的程式碼最佳作法

在建置 Lambda 函數時,請遵循下列清單中的準則,以使用最佳程式碼撰寫實務:

  • 區隔 Lambda 處理常式與您的核心邏輯。能允許您製作更多可測單位的函式。例如,在 Ruby 中,這可能看起來像:

    def lambda_handler(event:, context:) foo = event['foo'] bar = event['bar'] result = my_lambda_function(foo:, bar:) end def my_lambda_function(foo:, bar:) // MyLambdaFunction logic here end
  • 控制函數部署套件內的相依性。 AWS Lambda 執行環境包含許多程式庫。對於 Ruby 運行時,這些包括 AWS SDK. 若要啟用最新的一組功能與安全更新,Lambda 會定期更新這些程式庫。這些更新可能會為您的 Lambda 函數行為帶來細微的變更。若要完全掌控您函式所使用的相依性,請利用部署套件封裝您的所有相依性。

  • 最小化依存項目的複雜性。偏好更簡易的框架,其可快速在執行環境啟動時載入。

  • 將部署套件最小化至執行時間所必要的套件大小。這能減少您的部署套件被下載與呼叫前解壓縮的時間。對於使用 Ruby 編寫的函數,請避免將整個 AWS SDK庫作為部署包的一部分上傳。相反,有選擇地取決於拿起所需組件的SDK寶石(例如 DynamoDB 或 Amazon S3 SDK 寶石)。

  • 請利用執行環境重新使用來改看函式的效能。初始化函數處理常式之外的SDK用戶端和資料庫連線,並在/tmp目錄本機快取靜態資產。由您函式的相同執行個體處理的後續叫用可以重複使用這些資源。這可藉由減少函數執行時間來節省成本。

    若要避免叫用間洩漏潛在資料,請不要使用執行環境來儲存使用者資料、事件,或其他牽涉安全性的資訊。如果您的函式依賴無法存放在處理常式內記憶體中的可變狀態,請考慮為每個使用者建立個別函式或個別函式版本。

  • 使用 Keep-Alive 指令維持持續連線的狀態。Lambda 會隨著時間的推移清除閒置連線。叫用函數時嘗試重複使用閒置連線將導致連線錯誤。若要維護持續連線,請使用與執行階段相關聯的 keep-alive (保持啟用) 指令。如需範例,請參閱在 Node.js 中重複使用 Keep-Alive 的連線

  • 使用環境變數將操作參數傳遞給您的函數。例如,如果您正在寫入到 Amazon S3 儲存貯體,而非對您正在寫入的儲存貯體名稱進行硬式編碼,請將儲存貯體名稱設定為環境變數。

  • 避免在 Lambda 函數中使用遞迴叫用,函數會自行叫用或啟動可能再次叫用函數的程序。這會導致意外的函式呼叫量與升高的成本。如果您看到非預期的叫用量,請在更新程式碼時0立即將保留並行的函數設定為限制函數的所有叫用。

  • 請勿在 Lambda 函數程式碼中使用非公開APIs的非公開文件。對於 AWS Lambda 受管執行階段,Lambda 會定期將安全性和功能更新套用至 Lambda 的內部APIs。這些內部API更新可能向後不兼容,導致意外後果,例如,如果您的函數依賴於這些非公共功能,則會導致調用失敗。APIs如需公開可用的清單,請API參閱參考資料APIs。

  • 撰寫等冪程式碼。為函數撰寫等冪程式碼可確保採用相同方式來處理重複事件。程式碼應正確驗證事件並正常處理重複的事件。如需詳細資訊,請參閱 How do I make my Lambda function idempotent? (如何讓 Lambda 函數等冪?)。