

# 耐久性のある Lambda 関数の呼び出し
<a name="durable-invoking"></a>

耐久性のある Lambda 関数では、標準の Lambda 関数と同じ呼び出し方法がサポートされます。耐久性のある関数は同期的に、非同期的に、イベントソースマッピングを通じて呼び出すことができます。呼び出しプロセスは標準関数と同じですが、耐久性のある関数は長時間の実行および自動状態管理には追加機能を提供します。

## 呼び出し方法
<a name="durable-invoking-methods"></a>

**同期呼び出し:** 耐久性のある関数を呼び出して、レスポンスを待ちます。同期呼び出しは、Lambda によって 15 分 (設定された関数および実行タイムアウトに応じて 15 分以下) に制限されます。結果が即時に必要な場合、またはレスポンスが予想される API やサービスと統合する場合、同期呼び出しを使用します。呼び出し元を中断せず、待機オペレーションを使用して効率的な計算を行うことができます。呼び出しは耐久性のある実行全体が完了するまで待機します。べき等実行を開始するには、[べき等性](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
```

**イベントソースマッピング:** Amazon SQS、Kinesis、DynamoDB などのストリームまたはキューベースのサービスでレコードが利用可能な場合、耐久性のある関数を自動的に呼び出すように Lambda を設定します。イベントソースマッピングではイベントソースがポーリングされ、レコードのバッチで関数が呼び出されます。実行期間の制限を含め、耐久性のある関数でイベントソースマッピングの使用に関する詳細については、「[耐久性のある関数でイベントソースマッピング](durable-invoking-esm.md)」を参照してください。

各呼び出し方法の詳細については、「[同期呼び出し](invocation-sync.md)」および「[非同期呼び出し](invocation-async.md)」を参照してください。

**注記**  
耐久性のある関数では、エラー処理用のデッドレターキュー (DLQ) がサポートされていますが、Lambda 送信先はサポートされていません。DLQ を設定し、失敗した呼び出しのレコードをキャプチャします。

## 修飾 ARN の要件
<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. **実行とチェックポイント:** 関数が耐久性のあるオペレーションを実行すると、SDK によって進行状況が追跡されるチェックポイントが作成されます。

1. **停止 (必要な場合):** 関数が `wait` や `waitForCallback` などの耐久性のある待機を使用した場合、または自動ステップ再試行を使用した場合、Lambda は実行を停止してコンピューティング時間の課金を停止します。

1. **再開:** 再開するとき (再試行後を含む)、Lambda によって関数が再度呼び出されます。SDK によってチェックポイントログが再生され、実行が一時停止した時点から続行されます。

1. **完了:** 関数が最終結果を返すか、未処理のエラーをスローすると、耐久性のある実行が完了します。

同期呼び出しの場合、呼び出し元は、耐久性のある実行全体が完了するまで待機します (待機操作を含む)。実行が呼び出しタイムアウト (15 分以下) を超えた場合、呼び出しはタイムアウトします。非同期呼び出しの場合、Lambda はすぐに返して実行は独立して続行されます。耐久性のある実行 API を使用して実行ステータスを追跡し、最終結果を取得します。

## アプリケーションコードからの呼び出し
<a name="durable-invoking-with-sdk"></a>

AWS SDK を使用して、アプリケーションコードから耐久性のある関数を呼び出します。呼び出しプロセスは標準関数と同じです。

------
#### [ 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>

耐久性のある関数によって `DurableContext` からの `invoke`オペレーションが使用されて、他の耐久性のある関数および耐久性のない関数を呼び出すことができます。呼び出される関数が完了するまで、呼び出し元の関数が待機 (一時停止) する連鎖呼び出しが作成されます。

------
#### [ 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 アカウントに存在する必要があります。