

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

# 叫用耐用的 Lambda 函數
<a name="durable-invoking"></a>

耐用的 Lambda 函數支援與標準 Lambda 函數相同的調用方法。您可以同步、非同步或透過事件來源映射叫用耐久函數。叫用程序與標準 函數相同，但耐用的 函數為長時間執行和自動狀態管理提供額外的功能。

## 調用方法
<a name="durable-invoking-methods"></a>

**同步叫用：**叫用耐久的 函數並等待回應。同步調用受到 Lambda 限制為 15 分鐘 （或更少，取決於設定的函數和執行逾時）。當您需要立即結果或與預期回應APIs 和服務整合時，請使用同步調用。您可以使用等待操作進行有效率的運算，而不會中斷發起人 — 調用會等待整個耐久執行完成。對於等冪性執行啟動，請使用[等冪性](durable-execution-idempotency.md)中所述的執行名稱參數。

```
aws lambda invoke \
  --function-name my-durable-function:1 \
  --cli-binary-format raw-in-base64-out \
  --payload '{"orderId": "12345"}' \
  response.json
```

**非同步調用：**將事件排入佇列以進行處理，而無需等待回應。Lambda 會將事件置於佇列中並立即傳回。非同步調用支援長達 1 年的執行持續時間。將非同步叫用用於fire-and-forget的情況，或在背景中可能發生處理時。對於等冪性執行開始，請使用[等冪性](durable-execution-idempotency.md)中所述的執行名稱參數。

```
aws lambda invoke \
  --function-name my-durable-function:1 \
  --invocation-type Event \
  --cli-binary-format raw-in-base64-out \
  --payload '{"orderId": "12345"}' \
  response.json
```

**事件來源映射：**將 Lambda 設定為在 Amazon SQS、Kinesis 或 DynamoDB 等串流或佇列型服務提供記錄時，自動叫用您的耐久函數。事件來源映射會輪詢事件來源，並使用批次記錄叫用函數。如需搭配耐久函數使用事件來源映射的詳細資訊，包括執行持續時間限制，請參閱[搭配持久函數的事件來源映射](durable-invoking-esm.md)。

如需每個調用方法的完整詳細資訊，請參閱[同步調用](invocation-sync.md)和非[同步調用](invocation-async.md)。

**注意**  
耐用的函數支援無效字母佇列 (DLQs) 來處理錯誤，但不支援 Lambda 目的地。設定 DLQ 以從失敗的調用中擷取記錄。

## 合格 ARNs需求
<a name="durable-invoking-qualified-arns"></a>

耐用的函數需要合格的識別符才能叫用。您必須使用版本編號、別名或 叫用耐久函數`$LATEST`。您可以搭配版本/別名尾碼使用完整的合格 ARN 或函數名稱。您無法使用不合格的識別符 （沒有版本或別名尾碼）。

**有效的調用：**

```
# Using full ARN with version number
arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1

# Using full ARN with alias
arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:prod

# Using full ARN with $LATEST
arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:$LATEST

# Using function name with version number
my-durable-function:1

# Using function name with alias
my-durable-function:prod
```

**無效的叫用：**

```
# Unqualified ARN (not allowed)
arn:aws:lambda:us-east-1:123456789012:function:my-durable-function

# Unqualified function name (not allowed)
my-durable-function
```

此要求可確保持久的執行在整個生命週期中保持一致。當持久性執行開始時，它會固定到特定的函數版本。如果您的函數暫停並在數小時或數天後恢復，Lambda 會叫用開始執行的相同版本，以確保整個工作流程的程式碼一致性。

**最佳實務**  
將編號版本或別名用於生產耐久函數，而非 `$LATEST`。編號版本不可變，並支援確定性重播。或者，別名提供穩定的參考，您可以更新以指向新版本，而無需變更調用程式碼。當您更新別名時，新的執行會使用新版本，而進行中的執行會繼續其原始版本。您可以使用 `$LATEST`進行原型設計，或縮短開發期間的部署時間，了解如果基礎程式碼在執行期間變更，執行可能無法正確重播 （甚至失敗）。

## 了解執行生命週期
<a name="durable-invoking-execution-lifecycle"></a>

當您叫用耐久的函數時，Lambda 會建立持久的執行，可以跨越多個函數叫用：

1. **初始調用：**您的調用請求會建立新的耐久執行。Lambda 會指派唯一的執行 ID 並開始處理。

1. **執行和檢查點：**當函數執行持久性操作時，開發套件會建立檢查點來追蹤進度。

1. **暫停 （如果需要）：**如果您的函數使用持久的等待，例如 `wait`或 `waitForCallback`，或自動步驟重試，Lambda 會暫停執行，並在運算時間內停止收費。

1. **恢復：**當需要繼續時 （包括重試後），Lambda 會再次叫用您的函數。SDK 會重播檢查點日誌，並從執行暫停的位置繼續。

1. **完成：**當您的函數傳回最終結果或擲出未處理的錯誤時，持久性執行就會完成。

對於同步調用，發起人會等待整個耐久執行完成，包括任何等待操作。如果執行超過呼叫逾時 (15 分鐘或更短），則呼叫會逾時。對於非同步調用，Lambda 會立即傳回 ，且執行會獨立繼續。使用耐久APIs 來追蹤執行狀態並擷取最終結果。

## 從應用程式碼叫用
<a name="durable-invoking-with-sdk"></a>

使用 AWS SDKs從您的應用程式程式碼叫用耐久的函數。叫用程序與標準函數相同：

------
#### [ TypeScript ]

```
import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda';

const client = new LambdaClient({});

// Synchronous invocation
const response = await client.send(new InvokeCommand({
  FunctionName: 'arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1',
  Payload: JSON.stringify({ orderId: '12345' })
}));

const result = JSON.parse(Buffer.from(response.Payload!).toString());

// Asynchronous invocation
await client.send(new InvokeCommand({
  FunctionName: 'arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1',
  InvocationType: 'Event',
  Payload: JSON.stringify({ orderId: '12345' })
}));
```

------
#### [ Python ]

```
import boto3
import json

client = boto3.client('lambda')

# Synchronous invocation
response = client.invoke(
    FunctionName='arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1',
    Payload=json.dumps({'orderId': '12345'})
)

result = json.loads(response['Payload'].read())

# Asynchronous invocation
client.invoke(
    FunctionName='arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1',
    InvocationType='Event',
    Payload=json.dumps({'orderId': '12345'})
)
```

------

## 鏈結調用
<a name="durable-invoking-chained"></a>

耐用的 函數可以使用 的 `invoke`操作叫用其他耐用和非耐用的 函數`DurableContext`。這會建立鏈結叫用，呼叫函數會等待 （暫停） 叫用函數完成：

------
#### [ TypeScript ]

```
export const handler = withDurableExecution(
  async (event: any, context: DurableContext) => {
    // Invoke another durable function and wait for result
    const result = await context.invoke(
      'process-order',
      'arn:aws:lambda:us-east-1:123456789012:function:order-processor:1',
      { orderId: event.orderId }
    );
    
    return { statusCode: 200, body: JSON.stringify(result) };
  }
);
```

------
#### [ Python ]

```
@durable_execution
def handler(event, context: DurableContext):
    # Invoke another durable function and wait for result
    result = context.invoke(
        'arn:aws:lambda:us-east-1:123456789012:function:order-processor:1',
        {'orderId': event['orderId']},
        name='process-order'
    )
    
    return {'statusCode': 200, 'body': json.dumps(result)}
```

------

鏈結調用會在呼叫函數中建立檢查點。如果呼叫函數中斷，它會使用調用函數的結果從檢查點繼續，而無需重新調用函數。

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