Serverless Days Tokyo 2026 で使用したスライドです。
本セッションでは、AWS Lambda の Durable Functionsを題材に、ワークフローを中断・再開可能にする仕組みと、その正しさを支える「決定性」について、数学の言葉を用いて解説します。
Durable Functions では、「途中で人間の承認を待つ」「失敗した処理を再試行する」「複数の処理を並列に実行する」といった複雑なワークフローを、通常のプログラムに近い形で記述できます。しかし、ドキュメントを読み進めると、ワークフローのコードには「決定性」が要求されていることに気づきます。現在時刻の取得、乱数、UUID の生成、外部 APIの呼び出しなどは決定性を破壊する要因であり、これらは実装者が注意して一つのステップの中に閉じ込める必要があります。通常のプログラムのように書けるという割には、ずいぶん神経質ですね。
では、この「神経質な実行基盤」によって、我々は何を得ているのでしょうか?
Durable Executionでは、中断時のメモリやコールスタックをそのまま保存する代わりに、完了した処理の履歴を保存します。再開時には関数を先頭から実行し直し、完了済みの処理について保存された結果を返すことで、過去の実行をリプレイします。このとき、最初の実行とリプレイされた実行が異なる分岐へ進んでしまえば、履歴から元の状態を復元できません。決定性は単なる SDK 上の制約ではなく、限られた履歴から中断前の実行状態を一意に復元するための条件なのです。
この仕組みに理論的な説明を与えるのが、Burckhardt らによる 2021 年の論文 “Durable Functions: Semantics for Stateful Serverless” です。論文では、決定的なワークフローについて、実行状態そのものを保存する方式と、履歴を保存して再生する方式とが、外部から観測できる範囲で同じように振る舞うことを数学的に証明しています。
本セッションでは、現在時刻や外部 API に依存するコードがリプレイ時にどのように破綻するかを、短いコード例と実行履歴を使って追跡します。また、「リプレイ時に同じ実行パスを通る」という決定性と、「処理が再試行されても結果が壊れない」という冪等性の違いも整理し、実務的なサーバレスの実装知識と論文の内容を接続・再構成して解説します。
受講にあたって必要なものは、サーバーレスを一度でも書いたことがある程度の知識と、ほんの少しの知的好奇心だけです。形式的意味論の前提知識は要求しません。便利な SDK の但し書きの背後には、障害に満ちたサーバーレス環境と通常のプログラムの世界を接続する、きちんとした数学があります。そしてそれは、普段コードを書いている他ならぬあなた自身とも、決して無関係の世界ではないことを知っていただけると幸いです。
イベント情報:https://tokyo.serverlessdays.io