本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Python 中 Lambda 義函數處理程序
Lambda 函數處理常式是您的函數程式碼中處理事件的方法。當有人呼叫您的函數時,Lambda 會執行處理常式方法。函數會執行,直到處理常式傳回回應、結束或逾時為止。
在 Python 中建立函數處理常式時,您可以使用下列一般語法:
def
handler_name
(event, context): ... returnsome_value
命名
建立 Lambda 函數時指定的 Lambda 函數處理常式名稱衍生自下列項目:
-
Lambda 處理常式函數所在的檔案名稱。
-
Python 處理常式函數的名稱。
函數處理常式可以是任何名稱;但 Lambda 主控台中的預設名稱為 lambda_function.lambda_handler
。此函數處理常式名稱會反映函數名稱 (lambda_handler
),以及存放處理常式程式碼的檔案 (lambda_function.py
)。
如果要在主控台中使用不同檔案名稱或函數處理常式名稱建立函數,您必須編輯預設處理常式名稱。
變更函數處理常式名稱的方式 (主控台)
-
開啟 Lambda 主控台的函數
頁面,然後選擇您的函數。 -
選擇 程式碼 索引標籤。
-
向下捲動至執行時間設定窗格,並選擇編輯。
-
在處理常式中,輸入函數處理常式的新名稱。
-
選擇 儲存 。
運作方式
Lambda 調用函數處理常式時,Lambda 執行時間會將兩個引數傳遞給函數處理常式:
-
第一個引數是事件物件。事件是JSON格式化的文件,其中包含要處理之 Lambda 函數的資料。Lambda 執行時間會將事件轉換為物件,再將它傳遞到您的函數程式碼。其通常屬於 Python
dict
類型。同時也屬於list
、str
、int
、float
或NoneType
類型。事件物件包含調用服務的資訊。當您呼叫函數時,您決定事件的結構和內容。當 AWS 服務叫用您的函數時,服務會定義事件結構。如需有關來自 AWS 服務之事件的詳細資訊,請參閱使用來自其他服務的事件叫用 Lambda AWS。
-
第二個引數是內容物件。Lambda 在執行時間將內容物件傳遞到您的函數。此物件提供的方法和各項屬性提供了有關調用、函式以及執行時間環境的資訊。
傳回值
處理常式也可選擇傳回值。傳回值的情況取決於調用該函數的調用類型和服務。例如:
-
如果您使用
RequestResponse
叫用類型,例如同步叫用 Lambda 函數,會將 Python 函數呼叫的結果 AWS Lambda 傳回給用戶端叫用 Lambda 函數 (在回HTTP應呼叫要求時,序列化為)。JSON例如, AWS Lambda 主控台使用RequestResponse
調用類型。因此,當您在主控台上調用函數時,主控台即會顯示傳回值。 -
如果處理常式傳回
json.dumps
無法序列化的物件,則執行時間會傳回錯誤。 -
如果處理常式傳回
None
(如沒有return
陳述式的 Python 函數隱含作業),則執行時間會傳回null
。 -
如果使用
Event
調用類型 (非同步調用),便會捨棄該值。
注意
在 Python 3.9 及更高版本中,Lambda 會在錯誤回應中包含呼叫 requestId 的內容。
範例
下述章節顯示您可以與 Lambda 搭配使用的 Python 函數範例。如果您使用 Lambda 主控台編寫您的函數,則不需要附加 .zip 封存檔即可執行本節中的函數。這些函數使用標準 Python 程式庫,其包含在您選擇的 Lambda 執行時間內。如需詳細資訊,請參閱部署套件。
傳回訊息
下列範例顯示稱為 lambda_handler
的函數。該函數接受使用者的名字和姓氏輸入,並傳回一則訊息,其中包含其作為輸入接收的事件資料。
def lambda_handler(event, context): message = 'Hello {} {}!'.format(event['first_name'], event['last_name']) return { 'message' : message }
您可以使用下列事件資料來調用函數:
{ "first_name": "John", "last_name": "Smith" }
該回應顯示作為輸入傳遞的事件資料:
{ "message": "Hello John Smith!" }
剖析回應
下列範例顯示稱為 lambda_handler
的函數。該函數會使用在執行時間由 Lambda 傳遞的事件資料。它解析JSON響應中AWS_REGION
返回的環境變量。
import os import json def lambda_handler(event, context): json_region = os.environ['AWS_REGION'] return { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": json.dumps({ "Region ": json_region }) }
您可以使用任何事件資料來調用函數:
{ "key1": "value1", "key2": "value2", "key3": "value3" }
Lambda 執行時間會在初始化期間設定數個環境變數。如需在執行時間回應傳回的環境變數詳細資訊,請參閱使用 Lambda 環境變數來設定程式碼中的值。
此範例中的函數取決於來自 Invoke 的成功回應 (in200
) API。如需有關「呼叫API」狀態的詳細資訊,請參閱呼叫回應語法。
傳回計算
下列範例顯示稱為 lambda_handler
的函數。該函數接受使用者輸入並將計算傳回給使用者。如需有關此範例的詳細資訊,請參閱aws-doc-sdk-examples GitHub 存放庫
import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): ... result = None action = event.get('action') if action == 'increment': result = event.get('number', 0) + 1 logger.info('Calculated result of %s', result) else: logger.error("%s is not a valid action.", action) response = {'result': result} return response
您可以使用下列事件資料來調用函數:
{ "action": "increment", "number": 3 }
Python 函數的程式碼最佳實務
在建置 Lambda 函數時,請遵循下列清單中的準則,以使用最佳程式碼撰寫實務:
-
區隔 Lambda 處理常式與您的核心邏輯。能允許您製作更多可測單位的函式。例如,在 Python 中,這可能看起來像:
def lambda_handler(event, context): foo = event['foo'] bar = event['bar'] result = my_lambda_function(foo, bar) def my_lambda_function(foo, bar): // MyLambdaFunction logic here
-
控制函數部署套件內的相依性。 AWS Lambda 執行環境包含許多程式庫。對於 Node.js 和 Python 執行階段,這些執行階段包括. AWS SDKs 若要啟用最新的一組功能與安全更新,Lambda 會定期更新這些程式庫。這些更新可能會為您的 Lambda 函數行為帶來細微的變更。若要完全掌控您函式所使用的相依性,請利用部署套件封裝您的所有相依性。
-
最小化依存項目的複雜性。偏好更簡易的框架,其可快速在執行環境啟動時載入。
-
將部署套件最小化至執行時間所必要的套件大小。這能減少您的部署套件被下載與呼叫前解壓縮的時間。
-
請利用執行環境重新使用來改看函式的效能。初始化函數處理常式之外的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 函數等冪?)。