これはフェンリル デザインとテクノロジー Advent Calendar2025 1日目の記事です。
こんにちは、インフラ担当の森井康平です。
先日のAWS re:Invent 2025でLambda Durable Functionsが発表されました。
Lambdaはサーバーの管理を行うことなくコードを実行できるコンピューティングサービスです。短時間使用するユースケースに特化しているため15分以上は実行できないという制限がありました。しかし、Lambda Durable Functionsを使えばなんと1年間(!?)も一時停止しておくことができるということで、もしかすると一時停止を挟めば実行時間の15分制限を超えることができるのでは、と思いついたので早速検証してみました。
Lambda Durable Functions とは
Lambda Durable Functionsとは、AWS Lambdaで複数のステップの処理や長時間ワークフローを実行する仕組みで、途中の進行状況を自動でチェックポイントとして保存し、失敗や中断から再開できる機能です。 最大1年まで処理を一時停止し、待機中は料金が発生しないため、人の承認待ちや外部イベント待ちを伴う長時間ワークフローにも向いています。
今まで、サーバーレスアーキテクチャで処理を待機させたい場合はStep Functionsを使用してワークフローを組む必要がありましたが、Durable FunctionsがあればLambda単体で実現できるようになりました。
詳細については、フェンリルの関が公開したセッションレポートをご覧ください。
検証
検証内容
- ランタイム:Python 3.14
- タイムアウト:15分
- 実行タイムアウト:30分
- 保持期間:14日間
- リージョン:us-west-2(オレゴン)
実行タイムアウトでLambdaがDurable Functionを終了するまでの実行時間を指定します。1 秒から最長 1 年までの期間がサポートされています。
保持期間はLambdaがDurable Functionの実行履歴を保持する時間です。
検証コード
from aws_durable_execution_sdk_python import ( DurableContext, durable_execution, durable_step, ) from aws_durable_execution_sdk_python.config import Duration import time @durable_step def do_something_long(step_context, i: int, sleep_time: int): print(f"sleep {sleep_time} sec wait start: {i}") time.sleep(sleep_time) print(f"sleep {sleep_time} sec wait end: {i}") step_context.logger.info(f"do something {i}") return @durable_execution def lambda_handler(event, context: DurableContext): loop_count = event['loop_count'] sleep_time = event['sleep_time'] for i in range(loop_count): context.step(do_something_long(i,sleep_time)) context.wait(Duration.from_seconds(3)) return { "status": "completed", }
今回は検証のためにループで sleep させていますが、本来Durable Functionsは注文受付、支払い承認、在庫割り当て、のように、処理をステップごとに区切ってつなぐ使い方をします。
コード内で使用しているtime.sleep()はPythonの時間のかかる処理の代わりに使用しています。スリープ中もLambdaとしては起動し続けています。一方、context.wait()はDurable Functionsの機能で、Lambdaが待機状態になります。
検証コードの使い方
Lambda呼び出し時にイベントJSON{ "loop_count": 10, "sleep_time": 300 }を付与して起動します。
この設定の場合は「5分間(sleep_time)の実行、チェックポイント作成、Durable Functionsの機能で3秒待機」が10回(loop_count)繰り返される挙動をします。
結果
| No. | 呼び出し方法 | スリープする時間 | ループ回数 | 検証の狙い | 結果 |
|---|---|---|---|---|---|
| ① | 同期 | - | - | - | エラー |
| ② | 非同期 | 20分 | 1 | 単体の実行で15分を超えられるか | タイムアウト |
| ③ | 非同期 | 10分 | 2 | 15分以内にcontext.waitで一時停止すれば合計15分以上実行できるか | 成功🎉 |
実行結果:①
①の同期呼び出しでは以下のエラーが発生し呼び出すことができませんでした。

API アクションの呼び出しに失敗しました。エラーメッセージ: You cannot synchronously invoke a durable function with an executionTimeout greater than 15 minutes.
実は、同期呼び出しで15分以上実行できないことは公式ドキュメントに明記されています。 同期呼び出しはAPI Gatewayのバックエンドとして使うようなユースケースで使うため、長時間実行することを意図していないということでしょう。
同期呼び出し:永続関数を呼び出し、応答を待機します。同期呼び出しは、Lambda によって 15 分(または、設定された関数と実行タイムアウトに応じてそれ以下)に制限されます。
実行結果:②
ExecutionTimedOutが発生しエラーとなりました。 Durable Functionsであっても、一度に(context.waitを挟まずに)15分以上実行し続けることはできませんでした。

実行結果:③
成功しました。
非同期呼び出しであれば、15分でタイムアウトする前にcontext.waitで一時停止すれば、合計で15分以上実行できることがわかりました!

おわりに
Durable Functionsを非同期呼び出しすれば、理論上1年間近く実行できることがわかりました。 一方で、同期呼び出しでは15分以上の実行タイムアウトを設定できず、非同期呼び出しでもcontext.waitを挟まなければ15分以上実行できませんでした。
Durable Functionsを使用するとしても、Lambdaが短命のイベント処理に向いているということは変わらないようです。
非同期呼び出しであれば長時間待機、長時間実行を実現することはできますが、タイムアウトするかどうかのチェックを実装するのは非効率です。一度に15分以上実行し続けることが予見される場合はECSやEC2などのサービスを検討するのが良いでしょう。