こんにちは、佐野(マナティ)です!
AWS re:Invent 2025で、AWS Lambda Durable Functionsがリリースされました!
https://aws.amazon.com/jp/about-aws/whats-new/2025/12/lambda-durable-multi-step-applications-ai-workflows/
今回はLambda Durable Functionの機能を実際に試しましたので、その体験を共有したいと思います!
Lambda Durable Functionsとは?
Lambda Durable Functionsは、2025年12月2日にAWSが発表した新機能で、複数ステップのアプリケーションやAIワークフローを構築できる機能です。最大1年間の長時間実行が可能で、自動的な状態管理と障害回復を提供します。
※注意
タイムアウトが15分以内という処理は既存のLambda関数と変わらない点です。今回発表されたLambda Durable Functionsの機能を使用することで、最大1年間の長時間実行ができるということになります。
主な機能
1. チェックポイント&リプレイ機能
- 実行の進捗を自動的にチェックポイントとして保存
- 障害発生時は最後のチェックポイントから自動再開
- 完了済みの処理はスキップし、未完了の処理のみ実行
2. コスト効率
- 待機中(wait状態)はコンピュートコストが発生しない
- 実際の処理時間のみ課金される
- 長時間待機が必要なワークフローで大幅なコスト削減
3. 開発者体験
- 既存のLambda開発体験をそのまま活用
- 順次的なコードで記述可能(複雑なステートマシン不要)
- オープンソースのSDKを提供(Python、Node.js/TypeScript対応)
ベストプラクティス
https://docs.aws.amazon.com/lambda/latest/dg/durable-best-practices.html
紹介されているベストプラクティスを以下にまとめると下記の通りになります。
1. 決定論的なコードを書く
- ランダム値生成、現在時刻取得、外部API呼び出しは必ずステップ内で実行
- グローバル変数の使用を避け、戻り値でデータを渡す
2. 冪等性を考慮
- 冪等性トークンを使用して重複実行を防止
- リトライやリプレイで複数回実行される可能性を考慮
3. 効率的な状態管理
- チェックポイントごとに状態を永続化するため、状態サイズを最小限にする
- 大きなデータはS3やDynamoDBに保存する
4. 適切なステップ設計
- 関連する処理をグループ化
- 説明的な名前を使用
- 粒度のバランスを考慮
LambdaとLambda Durable Functionsの使い分け
既存のLambdaは以下の処理に向いています。
- 1回で完結する処理
- 15分以内で終わる処理
- 状態管理や途中再開が不要なもの
例:
- API処理
- 軽いETL
- 画像変換
- イベント駆動の単発処理
Lambda Durable Functionsは以下の処理に向いています。
- 複数ステップ
- 途中で待つ(外部イベント/承認待ち/タイマー待ち)
- 落ちても途中から再開したいもの
技術的な仕組み
https://docs.aws.amazon.com/lambda/latest/dg/durable-functions.html#durable-functions-how-it-works
● コア概念:
1. Steps(ステップ)
- context.step()メソッドで業務ロジックをラップする
- 自動リトライとチェックポイント機能を提供している
- 完了後はリプレイ時にスキップされる
2. Waits(待機)
- context.wait()で実行を一時停止する
- 関数を終了し、コンピュートコストなしで待機できる
- 指定時間後に自動再開される
3. Callbacks(コールバック)
- create_callback()で外部イベントを待機
- 人間の承認やAPI応答を待つ場合に使用する
4. 並列処理
- parallel()やmap()で複数処理を並行実行
現在利用可能なリージョンとランタイム(2025/12/18時点)
● リージョン:
- オハイオリージョン
- バージニア北部
- オレゴン
- アイルランド
- フランクフルト
- ミラノ
- ストックホルム
- スペイン
- シドニー
- 香港
- 東京
- シンガポール
- ムンバイ
- マレーシア
- タイ
● ランタイム:
- Python 3.13、3.14
- Node.js 22、24
- コンテナイメージもサポート
ユースケース
https://docs.aws.amazon.com/lambda/latest/dg/durable-functions.html#durable-functions-use-cases
まとめると以下の通りです。
1. 複数ステップの注文処理
2. AIワークフロー
- 複数のモデル呼び出しの連鎖
- 人間のフィードバック組み込み
3. 承認フロー
- 人間の承認待ちを含むビジネスプロセス
- 数日〜数週間かかるワークフロー
4. 決済処理
- 認証、不正検知、決済の多段階処理
- 障害時の自動ロールバック
Step Functionsとの比較
|
特徴
|
Durable Functions
|
Step Functions
|
|
アプローチ
|
コード
|
ビジュアル/JSON定義
|
|
複雑なロジック
|
コードで柔軟に記述できる
|
ステートマシン定義
|
|
適用場面
|
開発者中心
|
可視性重視、監査要件
|
Lambda Durable Functionsのデメリット(注意点)
● 書き方にルールがある
リプレイ(再実行)される前提なので、時刻取得・乱数・外部API呼び出しなどはStepの中で実行する必要があります。
● Stepは複数回実行され得るため、冪等性が重要になる
リトライ/リプレイで同じStepが再実行される可能性があるため、更新系は冪等性キーなどで二重実行対策が必要です。
料金
料金は従来のLambdaと同様に実行時間に対する課金(従量課金)となっており、実行の待機時間は無料となっています。また、チェックポイント保存のストレージコストは発生しますので詳細はAWS Lambda料金ページをご確認ください。(AWS Lambda プライシング)
実際に触って確かめた
「Durable execution」が追加されていますね。こちらを有効化することで利用できるみたいです。
今回はPython 3.14で試してみます。
Kiroにサンプルコードを作成してもらったので試してみましょう。
-------------------------------------------------------------------------------------
from aws_durable_execution_sdk_python import (
DurableContext,
durable_execution,
)
from aws_durable_execution_sdk_python.config import Duration
@durable_execution
def lambda_handler(event, context: DurableContext):
order_id = event.get("orderId", "12345")
# ステップ1: 注文検証
validated = context.step(
lambda _: {"order_id": order_id, "status": "validated"},
name="validate-order"
)
context.logger.info(f"Order validated: {validated}")
# ステップ2: 決済処理
payment = context.step(
lambda _: {"order_id": order_id, "status": "paid"},
name="process-payment"
)
context.logger.info(f"Payment processed: {payment}")
# ステップ3: 5秒待機
context.wait(Duration.from_seconds(5))
# ステップ4: 注文確認
confirmed = context.step(
lambda _: {"order_id": order_id, "status": "confirmed"},
name="confirm-order"
)
context.logger.info(f"Order confirmed: {confirmed}")
return {
"statusCode": 200,
"body": f"Order {order_id} completed successfully"
}
ccessfully"
}
-------------------------------------------------------------------------------------
testには、{"orderId": "ORDER-123"}を書いて実行しました。
CloudWatchのログを確認してみます。
関数が処理を始めて…
各ステップ "注文検証" と "決済処理" が実行されて、処理が終わったみたいです。
果たして、5秒間の待機後自動開始するのか…。チェックポイントは保存されているのか…。
5秒後自動開始していますね…!
また、先ほど処理された注文検証と決済処理がスキップされて "注文確認" のステップに進んだみたいです。チェックポイントも保存されていたみたいですね。
もし今回の処理が待機中も課金されていたとなると、約8.9秒の実行時間になっていました。しかし今回のLambda Durable Functionsを利用すると約3.9秒の実行時間になります。56%ものコスト削減につながりました!
もっと処理時間が伸びた時はこの違いはさらに明確に表れそうですね。
まとめ
Lambda Durable Functionsは、複雑な多段階ワークフローを簡単に構築できる画期的な機能です。従来はStep FunctionsやSQS、DynamoDBなどを組み合わせて実装していた処理を、シンプルなコードで記述できるようになりました。特に、待機時間のコストがかからない点は、長時間実行ワークフローにおいて大きなメリットと言えるのではないかと思います。