![[小ネタ]Durable Functionsのリトライ時はチェックポイントの直後から処理が再開されるわけではありません #AWSreInvent](https://images.ctfassets.net/ct0aopd36mqt/3cSNU2biOZjSIpzhzUgtBJ/eeb74bd4d0c8f041ce027f3258cd249f/reinvent2025_devio_try_w1200h630__1_.png?w=3840&fm=webp)
[小ネタ]Durable Functionsのリトライ時はチェックポイントの直後から処理が再開されるわけではありません #AWSreInvent
リテールアプリ共創部@大阪の岩田です。
durable functionsを使うとLambda Functionの進捗状況を管理してチェックポイントを自動的に作成できます。このチェックポイントを利用することで障害発生時等のリトライ処理における状態管理が簡素化できるのですが、リトライ時の挙動についてはきちんと理解しておく必要があります。
やってみる
試しに以下のコードを実行してみます。
from aws_durable_execution_sdk_python.config import Duration
from aws_durable_execution_sdk_python.context import DurableContext, StepContext, durable_step
from aws_durable_execution_sdk_python.execution import durable_execution
import time
print('init')
@durable_step
def step1(step_context: StepContext) -> str:
step_context.logger.info("step1")
return "step1"
@durable_step
def step2(step_context: StepContext) -> str:
step_context.logger.info("step2")
return "step2"
@durable_execution
def lambda_handler(event, context) -> dict:
print('before step1')
context.step(step1())
context.wait(Duration.from_minutes(30))
print('before step2')
context.step(step2())
return {
"statusCode": 200,
"body": '',
}
step1の実行完了後に30分間のwaitを挟んでstep2を実行するというだけのシンプルな内容です。
このLambda FunctionのDurable executionが完了するとログはどのように出力されるでしょうか?
答えはこちらです。

わかりやすいように簡略化すると以下のようなログになります。
// 初回実行時のログ
init
before step1
step1
// ここから30分wait後の再試行時のログ
init
before step1
before step2
step2
参考までにwaitする時間を1分など短い時間にするとリトライ時にコールドスタートが発生せず、以下のようなログに変わりました。
// 初回実行時のログ
init
before step1
step1
// ここから1分wait後の再試行時のログ
before step1
before step2
step2
これらのログから、リトライ時にもコールドスタート時のinit処理やstep1のチェックポイント手前の処理が再実行されていることが分かります。「チェックポイント」と聞くと再実行時はチェックポイント以後の処理から継続して実行してくれそうな印象を持ちますが、そうではなくコードの最初から再実行されるということに注意が必要です。
公式ドキュメントには以下のように記載されています。
After your function resumes from a pause or interruption, the system performs replay. During replay, your code runs from the beginning but skips over completed checkpoints, using stored results instead of re-executing completed operations.
完了済のチェックポイントについては処理がスキップされ、保存された結果が再利用されるということです。今回の例でいくと@durable_stepというアノテーションを付与した関数は自動的に以下のように展開されると考えると理解しやすいです。
if チェックポイント完了済み:
return キャッシュされた結果
res = アノテーションを付与した関数の呼び出し
チェックポイントログの保存(res)
まとめ
小ネタではありますが、初めてdurable functionsを利用したときに少しハマってしまったので紹介しておきます。
durable functionsを利用する際はご注意ください。








