こんにちは。クロスイノベーション本部エンジニアリングテクノロジーセンターの宮原です。
本記事は電通総研 Advent Calendar 2025の19日目の記事になります。12/1から始まっている電通総研 Advent Calendarもいよいよ最終日となります。執筆されたみなさん、お疲れ様でした!
さて、本記事ではAWS re:Invent 2025で発表された新機能の一つであるAWS Lambda Durable Functionsの機能をご紹介できればと思います。
AWS re:Invent 2025に関連する記事は宮崎さんの『AWS re: Invent2025で登場した3つのFrontier Agentsの1つである「AWS DevOps Agent」を触りつつ、概要について整理してみる。』
や『AWS re:Invent2025 Keynote現地速報』もありますので、あわせてご覧いただけると嬉しいです。
速報の記事でも記載したように今年のAWS re:InventではAI関連のアップデートが多くあった一方でAWS Lambdaなどのコンピューティング関連のアップデートは少なかった印象です。
そんな中でAWS Lambda Durable Functionsの機能がリリースされています!
本記事では注目の新機能AWS Lambda Durable Functionsの機能についてサンプルコードを共有しながら、ご紹介できればと思います。
AWS Lambda Durable Functionsとは
製品ドキュメントのページではAWS Lambda Durable Functionsについて以下の記載があります。
AWS Lambda の既存のプログラミングモデル内で、Lambda Durable Functions を使って複数ステップのアプリケーションや AI ワークフローの構築を簡単にします。Durable Functions は、進行状況を自動的にチェックポイントし、長時間実行されるタスクの間に最大1年間実行を一時停止し、障害から回復します。追加のインフラを管理したり、独自の状態管理やエラー処理コードを書く必要はなく、より早くイノベーションを進めることができます。
この文面だけだとわかりにくいのですが、以下が重要だと認識しています。
- AWS Lambdaの中でチェックポイントを設けることができる
- 実行待ち時間を指定し、チェックポイントから処理を再開できる
例えば、EC2を起動して、一定時間待機し、その上でEC2インスタンスを停止するなどのオペレーションがAWS Lambda Durable Functionsを利用することで可能になります。
Lambdaといえば最大実行時間が15分という制約がありますが、AWS Lambda Durable Functions内で指定した待ち時間は実行時間には含まれず、課金も行われません。
また、複数ステップの処理の中でチェックポイントを設け、特定のステップで失敗した際に、失敗したステップからリトライ、再開することも可能です。
AWS Lambda Durable Functionsのサンプルコード
ドキュメントを読むだけではわかりにくい部分もあったため実際にサンプルコードを書きながら理解を深めてみました。
今回最初に実行したAWS Lambda Durable Functionsのサンプルコードは以下になります。
import { type DurableContext, withDurableExecution } from "@aws/durable-execution-sdk-js"; export const handler = withDurableExecution(async (_event: unknown, context: DurableContext): Promise<void> => { await context.step("step1", async () => console.log("step 1 executed")); await context.wait({ seconds: 5 }); await context.step("step2", async () => console.log("step 2 executed")); });
console.logを実行し、5秒待ち、再度console.logを実行するだけのシンプルなものになっています。Lambdaのテスト機能経由で関数を実行したところDurable execution detailsというリンクが表示されました。クリックすると永続オペレーションとイベント履歴が確認できる以下のような画面が表示されます。


こちらの画面からstep1、待機、step2の処理が成功していることを確認できます。
次にサンプルコードについてです。
AWS Lambda Durable Functionsを実行する際には別途@aws/durable-execution-sdk-jsをインストールし、通常のLambda関数のハンドラをwithDurableExecution関数でラップします。
context.step関数を利用し、チェックポイントを作成しながら、処理を記述します。
context.wait関数を利用すると指定した実行時間だけ処理を待つことができます。
冒頭にも記載の通り、この待ち時間はLambdaの実行時間には含まれず、課金の対象外になります。
処理を失敗させてみる
今度は処理の途中でエラーが発生した際にどのような挙動になるかを確かめてみます。
以下のコードをLambda関数にデプロイし、テストを実行しました。
このコードでは2番目のステップで乱数を生成し、数字が偶数の場合に例外を送出するようにしています。
import { type DurableContext, withDurableExecution } from "@aws/durable-execution-sdk-js"; export const handler = withDurableExecution(async (_event: unknown, context: DurableContext): Promise<void> => { await context.step("step1", async () => { console.log("step 1 executed"); }); await context.step("step2", async () => { const num = Math.floor(Math.random() * 100); if (num % 2 === 0) { throw new Error("Random failure occurred"); } console.log("step 2 executed"); }); await context.step("step3", async () => { console.log("step 3 executed"); }); });
エラーが発生した場合の永続オペレーションとイベント履歴は以下のようになっていました。


step2で処理が失敗し、リトライが自動で実行され、step2から処理が再開されていることがわかります。このようにAWS Lambda Durable Functionsを利用することでエラー発生時に処理が自動リトライされ、失敗したステップから処理を再開することが可能になっています。
また、リトライロジックの制御は、context.step関数の第3引数にオプションとして渡すことが可能です。試行回数やエラーのクラスを受け取り、値に応じてリトライロジックを細かく制御できます。以下はリトライロジックを制御する場合のサンプルコードになります。
await context.step( "step2", async () => { const num = Math.floor(Math.random() * 100); if (num % 2 === 0) { throw new Error("Random failure occurred"); } console.log("step 2 executed"); }, { retryStrategy(_error: Error, attemptCount: number) { if (3 < attemptCount) { return { shouldRetry: false }; } return { shouldRetry: true }; }, }, );
実践例
今回は、このAWS Lambda Durable Functionsの機能を利用して、EC2インスタンスを起動して、20分経過後に、再度EC2インスタンスを停止するスクリプトを実装して、動かしてみました。EC2インスタンスの計画停止を想定した簡単なスクリプトになっています。
こちらも待ち時間を含めるとLambdaの15分の実行時間上限を超えていますが、問題なく動作しています。
このような状態を持ったスクリプトは、AWS Step Functionsなどを利用して実行することが多かったと思いますが、AWS Lambda Durable Functionsを利用することでAWS Lambdaのロジックとして実装できるようになったのは嬉しいポイントだと思います。
import { type DurableContext, withDurableExecution } from "@aws/durable-execution-sdk-js"; import { DescribeInstanceStatusCommand, EC2Client, StartInstancesCommand, StopInstancesCommand } from "@aws-sdk/client-ec2"; const ec2 = new EC2Client({ region: "ap-northeast-1" }); const instanceId = process.env.EC2_INSTANCE_ID; if (!instanceId) { throw new Error("EC2_INSTANCE_ID environment variable is not set."); } export const handler = withDurableExecution(async (_event: unknown, context: DurableContext): Promise<void> => { await context.step("startInstance", async () => { console.log(`Starting instance: ${instanceId}`); const startResp = await ec2.send(new StartInstancesCommand({ InstanceIds: [instanceId] })); console.log("Start response:", JSON.stringify(startResp.StartingInstances, null, 2)); }); await context.wait({ minutes: 20 }); await context.step("stopInstance", async () => { console.log(`Stopping instance: ${instanceId}`); const statusResp = await ec2.send(new DescribeInstanceStatusCommand({ InstanceIds: [instanceId], IncludeAllInstances: true })); if (statusResp.InstanceStatuses?.[0].InstanceState?.Name !== "running") { console.log(`Instance ${instanceId} is not in running state`); return; } const stopResp = await ec2.send(new StopInstancesCommand({ InstanceIds: [instanceId] })); console.log("Stop response:", JSON.stringify(stopResp.StoppingInstances, null, 2)); }); });
所感
AWS Lambda Durable Functionsを利用してみた感想です。
context.step関数でラップすることで処理が自動的にリトライされるようになり、エラーが発生しても特定のステップからリトライ、再開されるようになります。
通常のLambda関数のようなロジックでもリトライを想定し、AWS Lambda Durable Functionsの形式で実装していくことでAWS Lambdaの処理がより安定すると思います。
また、context.wait関数を利用して、Lambdaの実行上限を超えて、一定時間待ち、処理を再開するようなロジックが書けるようになったのも大きいと思います。
今回はcontext.wait関数を呼び出しましたが、context.createCallback関数やcontext.waitForCallback関数なども用意されており、callbackが呼び出されるまで実行を停止するようなロジックも書けるようです。
AIエージェントのHuman-In-the-Loopもこちらの機能を使うことで簡単に実装できそうです。
終わりに
今回はAWS Lambda Durable Functionsの新機能を試してみました。待ち時間や処理の再開などの機能が追加され、AWS Lambdaの利用範囲がまた拡大したのではないでしょうか。
私自身もAWS Lambda Durable Functionsにマッチする実際のユースケースを考えていきたいと思いました。
最後までお読みいただきありがとうございました!
執筆:@miyahara.hikaru
レビュー:@miyazawa.hibiki
(Shodoで執筆されました)



