基本概念 - AWS Lambda

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

基本概念

Lambda 提供適用於 JavaScript、TypeScript 和 Python SDKs。這些 SDKs是建置耐用函數的基礎,提供您檢查點進度、處理重試和管理執行流程所需的基本概念。如需完整的 SDK 文件和範例,請參閱 GitHub 上的 JavaScript/TypeScript SDKPython SDK

持久性執行

持久性執行代表 Lambda 持久性函數的完整生命週期,使用檢查點和重播機制來追蹤業務邏輯進度、暫停執行並從失敗中復原。當函數在暫停或中斷後恢復時,會重新播放先前完成的檢查點,且函數會繼續執行。

生命週期可能包含 Lambda 函數的多次調用以完成執行,特別是在暫停或故障復原之後。此方法可讓您的函數長時間執行 (長達一年),同時在中斷的情況下維持可靠的進度。

重播的運作方式

Lambda 會在函數執行時保留所有耐久操作 (步驟、等待和其他操作) 的執行中日誌。當您的函數需要暫停或遇到中斷時,Lambda 會儲存此檢查點日誌並停止執行。當需要繼續時,Lambda 會從頭再次叫用您的函數,並重播檢查點日誌,取代已完成操作的預存值。這表示您的程式碼會再次執行,但先前完成的步驟不會重新執行。而是改用其儲存的結果。

此重播機制對於了解耐用函數至關重要。您的程式碼在重播期間必須具有決定性,這表示它在相同的輸入下會產生相同的結果。避免在步驟之外出現副作用的操作 (例如產生隨機數字或取得目前時間),因為這些操作可能會在重播期間產生不同的值,並導致非確定性的行為。

DurableContext

DurableContext 是您耐用函數接收的內容物件。它提供持久性操作的方法,例如建立檢查點和管理執行流程的步驟和等待。

您的耐用函數會收到 DurableContext而非預設 Lambda 內容:

TypeScript
import { DurableContext, withDurableExecution, } from "@aws/durable-execution-sdk-js"; export const handler = withDurableExecution( async (event: any, context: DurableContext) => { const result = await context.step(async () => { return "step completed"; }); return result; }, );
Python
from aws_durable_execution_sdk_python import ( DurableContext, durable_execution, durable_step, ) @durable_step def my_step(step_context, data): # Your business logic return result @durable_execution def handler(event, context: DurableContext): result = context.step(my_step(event["data"])) return result

適用於耐用函數的 Python SDK 使用同步方法,不支援 await。TypeScript SDK 使用 async/await

步驟

步驟會使用內建重試和自動檢查點來執行商業邏輯。每個步驟都會儲存其結果,確保您的函數可以在中斷後從任何完成的步驟恢復。

TypeScript
// Each step is automatically checkpointed const order = await context.step(async () => processOrder(event)); const payment = await context.step(async () => processPayment(order)); const result = await context.step(async () => completeOrder(payment));
Python
# Each step is automatically checkpointed order = context.step(lambda: process_order(event)) payment = context.step(lambda: process_payment(order)) result = context.step(lambda: complete_order(payment))

等待狀態

等待狀態是您的函數停止執行 (並停止充電) 的計劃暫停,直到繼續為止。使用它們來等待期間、外部回呼或特定條件。

TypeScript
// Wait for 1 hour without consuming resources await context.wait({ seconds:3600 }); // Wait for external callback const approval = await context.waitForCallback( async (callbackId) => sendApprovalRequest(callbackId) );
Python
# Wait for 1 hour without consuming resources context.wait(3600) # Wait for external callback approval = context.wait_for_callback( lambda callback_id: send_approval_request(callback_id) )

當您的函數遇到等待或需要暫停時,Lambda 會儲存檢查點日誌並停止執行。恢復時,Lambda 會再次叫用您的函數,並重播檢查點日誌,以儲存的值取代已完成的操作。

對於更複雜的工作流程,耐用的 Lambda 函數也隨附進階操作,例如parallel()用於並行執行、map()用於處理陣列、runInChildContext()用於巢狀操作,以及waitForCondition()用於輪詢。如需何時使用每個操作的詳細範例和指引,請參閱範例

叫用其他 函數

調用允許耐用的函數呼叫其他 Lambda 函數,並等待其結果。呼叫函數會在調用函數執行時暫停,建立保留結果的檢查點。這可讓您建置模組化工作流程,讓專門的 函數處理特定任務。

使用 從耐用函數內context.invoke()呼叫其他函數。調用是檢查點的,因此如果您的函數在調用函數完成後中斷,它會繼續以儲存的結果繼續,而不會重新調用函數。

TypeScript
// Invoke another function and wait for result const customerData = await context.invoke( 'validate-customer', 'arn:aws:lambda:us-east-1:123456789012:function:customer-service:1', { customerId: event.customerId } ); // Use the result in subsequent steps const order = await context.step(async () => { return processOrder(customerData); });
Python
# Invoke another function and wait for result customer_data = context.invoke( 'arn:aws:lambda:us-east-1:123456789012:function:customer-service:1', {'customerId': event['customerId']}, name='validate-customer' ) # Use the result in subsequent steps order = context.step( lambda: process_order(customer_data), name='process-order' )

調用函數可以是耐用或標準 Lambda 函數。如果您叫用持久性函數,呼叫函數會等待完全持久性執行完成。此模式在微服務架構中很常見,其中每個函數都會處理特定網域,讓您從專業、可重複使用的函數編寫複雜的工作流程。

注意

不支援跨帳戶調用。調用函數必須與呼叫函數位於相同的 AWS 帳戶中。

耐用的函數組態

耐用函數具有特定的組態設定,可控制執行行為和資料保留。這些設定與標準 Lambda 函數組態分開,並套用至整個耐久執行生命週期。

DurableConfig 物件會定義耐用函數的組態:

{ "ExecutionTimeout": Integer, "RetentionPeriodInDays": Integer }

Execution timeout (執行逾時)

執行逾時可控制持久性執行從開始到完成的執行時間。這與 Lambda 函數逾時不同,它控制單一函數調用可以執行的時間長度。

當 Lambda 函數通過檢查點、等待和重播時,耐久執行可以跨越多個 Lambda 函數叫用。執行逾時適用於持久性執行的總經過時間,不適用於個別函數叫用。

了解差異

Lambda 函數逾時 (最多 15 分鐘) 會限制函數的每個個別調用。持久性執行逾時 (最長 1 年) 會限制從執行開始到完成、失敗或逾時的總時間。在此期間,您的函數可能會在處理步驟、等待並從失敗中復原時被叫用多次。

例如,如果您將持久執行逾時設定為 24 小時,Lambda 函數逾時設定為 5 分鐘:

  • 每個函數調用必須在 5 分鐘內完成

  • 整個耐久執行最多可執行 24 小時

  • 在這 24 小時內,您的函數可以被叫用多次

  • 等待操作不會計入 Lambda 函數逾時,但會計入執行逾時

您可以使用 Lambda 主控台或 建立耐用函數時 AWS CLI,設定執行逾時 AWS SAM。在 Lambda 主控台中,選擇您的函數,然後選擇組態、持久性執行。以秒為單位設定執行逾時值 (預設值:86400 秒 / 24 小時,最小值:60 秒,最大值:31536000 秒 / 1 年)。

注意

執行逾時和 Lambda 函數逾時的設定不同。Lambda 函數逾時控制每個個別調用可以執行的時間長度 (最長 15 分鐘)。執行逾時可控制整個持久性執行的總經過時間 (最長 1 年)。

保留期間

保留期間控制 Lambda 在持久性執行完成後保留執行歷史記錄和檢查點資料的時間長度。此資料包含步驟結果、執行狀態和完整的檢查點日誌。

保留期間到期後,Lambda 會刪除執行歷史記錄和檢查點資料。您無法再擷取執行詳細資訊或重播執行。保留期會在執行達到結束狀態 (SUCCEEDED、FAILED、STOPPED 或 TIMED_OUT) 時開始。

您可以使用 Lambda 主控台 AWS CLI或 來設定建立耐用函數時的保留期間 AWS SAM。在 Lambda 主控台中,選擇您的函數,然後選擇組態、持久性執行。以天為單位設定保留期間值 (預設值:14 天,下限:1 天,上限:90 天)。

根據您的合規要求、除錯需求和成本考量,選擇保留期。較長的保留期提供更多偵錯和稽核的時間,但會增加儲存成本。