AWS Lambda Durable Functionを使って簡単なAIワークフローを動かしてみた #AWSreInvent

AWS Lambda Durable Functionを使って簡単なAIワークフローを動かしてみた #AWSreInvent

2025.12.03

こんにちは、森田です。

以下で発表された AWS Lambda Durable Function は、従来まで難しかった長時間にわたるワークフローを実現できる機能となっています。

https://dev.classmethod.jp/articles/lambda-durable-function-25/

本記事では、この Durable Function を Python で実際に実装し、その挙動を検証してみたいと思います。

やってみた

Lambda の作成

Durable Functionは、2025年12月現在、us-east-2(オハイオ)リージョンでのみ利用可能です。

AWSマネジメントコンソールでLambdaを作成する際、必ず Durable execution を有効化する必要があります。
(この設定を見落とすと動作しないため、私はここで少し時間を要しました...!作成時に忘れずにチェックしましょう。 )

スクリーンショット_2025-12-02_11_23_45.png

デフォルトで作成されるコードの確認

Lambdaを正常に作成すると、以下のPythonコードがデフォルトで用意されます。

デフォルトで用意されているコード
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

@durable_step
def my_step(step_context: StepContext, my_arg: int) -> str:
    step_context.logger.info("Hello from my_step")
    return f"from my_step: {my_arg}"

@durable_execution
def lambda_handler(event, context) -> dict:
    msg: str = context.step(my_step(123))

    context.wait(Duration.from_seconds(10))

    context.logger.info("Waited for 10 seconds without consuming CPU.")

    return {
        "statusCode": 200,
        "body": msg,
    }

このコードでは、@durable_executionデコレーターでハンドラーを定義し、内部でcontext.wait(Duration.from_seconds(10))を使って10秒間の実行一時停止を行っています。

デフォルトコードの実行と挙動の確認

では、このままのコードでテスト実行してみます。

実行完了後、通常のLambdaと同様に最終的な出力結果を確認できます。

スクリーンショット_2025-12-02_11_34_25.png

ただし、この画面では最終結果しか分かりません。
実行の一時停止や再開といった詳細な処理内容を確認するには、Lambdaの「永続実行」タブを利用します。

スクリーンショット 2025-12-02 11.37.26.png

実行名をクリックすることで以下のように詳細画面が開き、イベント情報を追跡することができます。

スクリーンショット_2025-12-02_11_37_50.png

コールバック

上記はシンプルに待機するだけの処理でしたが、他にも様々な処理ケースに対応しています。

https://github.com/aws/aws-durable-execution-sdk-python/tree/main/docs/core

その中のコールバックについて実装してみます。

コールバックを使うことで、長時間かかる外部処理の完了までLambdaの実行を中断・待機させることが可能です。

durable-function.py
import json
import os
import boto3
from typing import Any
from aws_durable_execution_sdk_python import DurableContext, durable_execution
from aws_durable_execution_sdk_python.config import CallbackConfig, Duration

# ステートマシンのARN
state_machine_arn = os.getenv('STATE_MACHINE_ARN')

def send_to_external_system(data: dict) -> None:
    sfn = boto3.client('stepfunctions')
    response = sfn.start_execution(
            stateMachineArn=state_machine_arn,
            input=json.dumps(data)
        )

@durable_execution
def lambda_handler(event: Any, context: DurableContext) -> dict:
    """Create a callback and wait for external system response."""
    # Step 1: Create the callback
    callback_config = CallbackConfig(
        timeout=Duration.from_minutes(2),
        heartbeat_timeout=Duration.from_seconds(60),
    )

    callback = context.create_callback(
        name="example_callback",
        config=callback_config,
    )

    # Step 2: Send callback ID to external system
    # In a real scenario, you'd send this to a third-party API,
    # message queue, or webhook endpoint
    send_to_external_system({
        "callback_id": callback.callback_id,
        "text": event.get("text")
    })

    # Step 3: Wait for the result - execution suspends here
    result = callback.result()

    # Step 4: Execution resumes when result is received
    return {
        "status": "completed",
        "result": result,
    }

上記のコードでは、send_to_external_system関数で、外部システムとしてStepFunctionを利用するケースとなります。

実行結果を取得するまでresult = callback.result()で待機を行います。

StepFunction

StepFunctionは、以下のようにBedrockでモデル呼び出し、Callback処理(Lambda)を実行するように構成しています。
(まだ、StepFunctionのアクションでは、send_durable_executionなどは対応していないので)

スクリーンショット 2025-12-02 12.37.49.png

全体のアーキテクチャ

Untitled.png

Callback処理(Lambda)

send.py
import json
import boto3

lambda_client = boto3.client('lambda')

def lambda_handler(event, context):
    callback_id = event['callback_id']
    status = event['status']
    result_data = event['result_data']

    if status == 'success':
        lambda_client.send_durable_execution_callback_success(
            CallbackId=callback_id,
            Result=result_data
        )
    else:
        lambda_client.send_durable_execution_callback_failure(
            CallbackId=callback_id,
            Error={
                'ErrorType': 'Error',
                'ErrorMessage': result_data
            }
        )
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

実行結果

実行してみると今度はサブタイプがCallbackとして認識されました。

スクリーンショット 2025-12-02 12.44.43.png

実行結果も正常に取得することができています。

{
  "status": "completed",
  "result": "# AWSサービスのおすすめポイント\n\n## 1. 圧倒的なスケーラビリティ\n\nAWSの最大の魅力は、ビジネスの成長に合わせて柔軟にリソースを拡張できる点です。スタートアップの小規模なWebサイトから、数百万ユーザーを抱える大規模サービスまで、需要に応じて自動的にサーバー容量を調整できます。急なアクセス増加にも即座に対応でき、ビジネスチャンスを逃しません。\n\n## 2. 従量課金制によるコスト最適化\n\n従来のオンプレミス環境では、高額な初期投資が必要でした。AWSでは使った分だけ支払う従量課金制を採用しており、初期費用を大幅に削減できます。また、リザーブドインスタンスやスポットインスタンスを活用すれば、さらなるコスト削減も可能です。無駄なリソースを持つ必要がなく、経営効率の向上に直結します。\n\n## 3. 豊富なサービスラインナップ\n\nAWSは200以上のサービスを提供しており、あらゆるニーズに対応できます。コンピューティング(EC2)、ストレージ(S3)、データベース(RDS、DynamoDB)、機械学習(SageMaker)、IoT、セキュリティなど、必要な機能をすぐに利用開始できます。これにより、開発期間の短縮とイノベーションの加速が実現します。\n\n## 4. 高いセキュリティと信頼性\n\nAWSは世界中の政府機関や金融機関も採用する、業界最高水準のセキュリティを誇ります。データセンターは物理的なセキュリティから、暗号化、アクセス管理まで多層的に保護されています。また、複数のアベイラビリティゾーンを活用することで、99.99%以上の可用性を実現し、障害時も事業継続が可能です。\n\n## 5. グローバル展開の容易さ\n\n世界30以上のリージョンにデータセンターを持つAWSなら、海外展開も簡単です。数クリックで世界各地にサービスを展開でき、現地ユーザーに低遅延でサービスを提供できます。グローバルビジネスを目指す企業にとって、これは大きなアドバンテージとなります。\n\n## 6. 充実したサポートとエコシステム\n\nAWSには豊富なドキュメント、トレーニング、認定資格プログラムが用意されています。また、世界中のパートナー企業やコミュニティからのサポートも受けられます。技術的な課題に直面しても、解決策を見つけやすい環境が整っています。\n\n## まとめ\n\nAWSは、コスト効率、拡張性、セキュリティ、グローバル対応のすべてを兼ね備えたクラウドプラットフォームです。デジタルトランスフォーメーションを推進し、競争力を高めたい企業にとって、AWSは最適な選択肢といえるでしょう。"
}

さいごに

この記事では、デフォルトのDurable Functionの実行やコールバックを試しましたが、様々なユースケースで適用できるサービスだと感じました。
他にも並列処理なども対応していそうなので、また機会があれば触ってみたいと思います。

この記事をシェアする

FacebookHatena blogX

関連記事