View a markdown version of this page

Lambda の耐久性のある関数を作成する - AWS Lambda

Lambda の耐久性のある関数を作成する

Lambda の耐久性のある関数の使用を開始するには、Lambda コンソールを使用して耐久性のある関数を作成します。数分で、ステップを使用してチェックポイントベースの実行のデモンストレーションを待機する耐久性のある関数を作成してデプロイできます。

チュートリアルを実行すると、DurableContext オブジェクトの使用方法、ステップを含むチェックポイントの作成、待機で実行の一時停止など、基礎的な耐久性のある関数の概念について学習します。待機後に関数が再開されると、再生が機能する方法についても説明します。

分かりやすくするため、関数の作成には Python または Node.js ランタイムを使用します。これらはインタープリター言語なので、コンソールの組み込みコードエディタで関数のコードを直接編集できます。

注記

耐久性のある関数は現在、Python、Node.js (JavaScript/TypeScript)、Java ランタイムに加えて、コンテナイメージ (OCI)をサポートしています。サポートされているランタイムバージョンとコンテナイメージオプションの詳細なリストについては、「耐久関数のサポートされているランタイム」を参照してください。Lambda によるコンテナイメージの使用に関する詳細については、「Lambda デベロッパーガイド」の「コンテナイメージを使用した Lambda 関数の作成」を参照してください。

ヒント

サーバーレスソリューションを構築する方法については、「サーバーレスデベロッパーガイド」を参照してください。

コンソールで Lambda の耐久性のある関数を作成します

この例では、耐久性のある関数は自動チェックポイントを使用して、複数のステップで注文を処理します。関数によって注文 ID を含む JSON オブジェクトを受け取り、注文が検証され、支払いが処理され、注文が確認されます。各ステップは自動的にチェックポイントされるため、関数が中断された場合、最後に完了したステップから再開されます。

関数では待機オペレーションも示され、外部確認の待機をシミュレーションするため、実行が短時間一時停止されます。

コンソールで耐久性のある関数を作成する方法
  1. Lambda コンソールの [関数] ページを開きます。

  2. [関数の作成] を選択してください。

  3. [一から作成] を選択します。

  4. [基本情報] ペインで、[関数名] に「myDurableFunction」を入力します。

  5. [ランタイム] で、[Node.js 24] または [Python 3.14] のいずれかを選択します。

  6. [耐久性のある実行の有効化] を選択します。

Lambda によってチェックポイントオペレーション (lambda:CheckpointDurableExecution および lambda:GetDurableExecutionState) のアクセス許可を含む実行ロールが使用され、耐久性のある関数が作成されます。

注記

Lambda ランタイムには Durable Execution SDK が含まれているため、依存関係をパッケージ化せず、耐久性のある関数をテストできます。ただし、本番稼働用のデプロイパッケージに SDK を含めることをお勧めします。バージョン整合性が確保され、関数に影響を与える可能性があるランタイム更新を回避できます。

コンソールの組み込み Code Editor を使用して、耐久性のある関数コードを追加します。

Node.js
コンソールでコードを変更するには
  1. [コード] タブを選択します。

    Lambda が関数コードを作成すると、それがコンソールの組み込みコードエディタに表示されます。コードエディターに index.mjs タブが表示されない場合は、次の図に示すように、ファイルエクスプローラーで index.mjs を選択します。

    コンソールのコードエディターとファイルエクスプローラーの index.mjs ファイルを示す図
  2. 次のコードを index.mjs タブに貼り付け、Lambda が作成したコードを置き換えます。

    import { withDurableExecution, } from "@aws/durable-execution-sdk-js"; export const handler = withDurableExecution( async (event, context) => { const orderId = event.orderId; // Step 1: Validate order const validationResult = await context.step(async (stepContext) => { stepContext.logger.info(`Validating order ${orderId}`); return { orderId, status: "validated" }; }); // Step 2: Process payment const paymentResult = await context.step(async (stepContext) => { stepContext.logger.info(`Processing payment for order ${orderId}`); return { orderId, status: "paid", amount: 99.99 }; }); // Wait for 10 seconds to simulate external confirmation await context.wait({ seconds: 10 }); // Step 3: Confirm order const confirmationResult = await context.step(async (stepContext) => { stepContext.logger.info(`Confirming order ${orderId}`); return { orderId, status: "confirmed" }; }); return { orderId: orderId, status: "completed", steps: [validationResult, paymentResult, confirmationResult] }; } );
  3. [DEPLOY] セクションで、[デプロイ] を選択して関数のコードを更新します。

    Lambda コンソールコードエディタの [デプロイ] ボタン
耐久性のある関数コードの概要

次のステップに進む前に、関数コードについて紹介し、耐久性のある関数の主な概念について説明します。

  • withDurableExecution ラッパー

    耐久性のある関数は withDurableExecution でラップされます。このラッパーによって DurableContext オブジェクトが提供され、チェックポイントオペレーションが管理されることで、耐久性のある実行が実現されます。

  • DurableContext オブジェクト

    標準の Lambda コンテキストではなく、関数は DurableContext を受け取ります。このオブジェクトは、チェックポイントを作成する step()wait() などの耐久性のあるオペレーションの方法について説明します。

  • ステップとチェックポイント

    context.step() の呼び出しは、実行前と実行後にチェックポイントを作成します。関数が中断された場合、最後に完了したチェックポイントから再開されます。関数は完了したステップを再実行しません。代わりに、保存された結果を使用します。

  • 待機オペレーション

    context.wait() 呼び出しにより、コンピューティングリソースが消費されずに実行が一時停止されます。待機が完了すると、Lambda によって関数が再度呼び出されてチェックポイントログが再生され、保存された値が完了したステップに置き換えられます。

  • 再生メカニズム

    待機または中断後に関数が再開されると、Lambda によって最初からコードが実行されます。ただし、完了したステップは再実行されません。Lambda によってチェックポイントログの結果が再生されます。そのため、コードは決定的である必要があります。

Python
コンソールでコードを変更するには
  1. [コード] タブを選択します。

    Lambda が関数コードを作成すると、それがコンソールの組み込みコードエディタに表示されます。コードエディターに lambda_function.py タブが表示されない場合は、次の図に示すように、ファイルエクスプローラーで lambda_function.py 選択します。

    コンソールのコードエディターとファイルエクスプローラーの lambda_function.py ファイルを示す図
  2. 次のコードを lambda_function.py タブに貼り付け、Lambda が作成したコードを置き換えます。

    from aws_durable_execution_sdk_python import ( DurableContext, durable_execution, durable_step, ) from aws_durable_execution_sdk_python.config import Duration @durable_step def validate_order(step_context, order_id): step_context.logger.info(f"Validating order {order_id}") return {"orderId": order_id, "status": "validated"} @durable_step def process_payment(step_context, order_id): step_context.logger.info(f"Processing payment for order {order_id}") return {"orderId": order_id, "status": "paid", "amount": 99.99} @durable_step def confirm_order(step_context, order_id): step_context.logger.info(f"Confirming order {order_id}") return {"orderId": order_id, "status": "confirmed"} @durable_execution def lambda_handler(event, context: DurableContext): order_id = event['orderId'] # Step 1: Validate order validation_result = context.step(validate_order(order_id)) # Step 2: Process payment payment_result = context.step(process_payment(order_id)) # Wait for 10 seconds to simulate external confirmation context.wait(Duration.from_seconds(10)) # Step 3: Confirm order confirmation_result = context.step(confirm_order(order_id)) return { "orderId": order_id, "status": "completed", "steps": [validation_result, payment_result, confirmation_result] }
  3. [DEPLOY] セクションで、[デプロイ] を選択して関数のコードを更新します。

    Lambda コンソールコードエディタの [デプロイ] ボタン
耐久性のある関数コードの概要

次のステップに進む前に、関数コードについて紹介し、耐久性のある関数の主な概念について説明します。

  • @durable_execution デコレータ

    ハンドラー関数は @durable_execution でデコレーションされています。このデコレータによって DurableContext オブジェクトが提供されてチェックポイントオペレーションが管理されることで、耐久性のある実行が実現されます。

  • @durable_step デコレータ

    各ステップ関数は @durable_step でデコレーションされています。このデコレータにより、チェックポイントを作成する耐久性のあるステップとして関数がマークされます。

  • DurableContext オブジェクト

    標準の Lambda コンテキストではなく、関数は DurableContext を受け取ります。このオブジェクトは、チェックポイントを作成する step()wait() などの耐久性のあるオペレーションの方法について説明します。

  • ステップとチェックポイント

    context.step() の呼び出しは、実行前と実行後にチェックポイントを作成します。関数が中断された場合、最後に完了したチェックポイントから再開されます。関数は完了したステップを再実行しません。代わりに、保存された結果を使用します。

  • 待機オペレーション

    context.wait() 呼び出しにより、コンピューティングリソースが消費されずに実行が一時停止されます。待機が完了すると、Lambda によって関数が再度呼び出されてチェックポイントログが再生され、保存された値が完了したステップに置き換えられます。

  • Python SDK は同期します。

    Python SDK では、await が使用されないことに注意してください。耐久性のあるオペレーションは、すべて同期メソッドの呼び出しです。

コンソールの Code Editor を使用して耐久性のある関数を呼び出す

明示的なバージョンが指定されていない (または公開されていない) 場合、コンソールは $LATEST バージョン修飾子を使用して耐久性のある関数を呼び出します。ただし、コードの確定的な実行には、常に安定したバージョンを指す修飾 ARN を使用する必要があります。

関数のバージョンを発行する方法
  1. [バージョニング] タブを選択します。

  2. [新しいバージョンを発行] を選択します。

  3. [バージョンの説明] には、「Initial version」と入力します (オプション)。

  4. [公開] を選択します。

  5. Lambda によって関数のバージョン 1 が作成されます。関数 ARN の末尾に :1 が含まれるようになり、バージョン 1 であることが示されていることに注意してください。

次に、関数に送信するテストイベントを作成します。イベントは、注文 ID を含む JSON 形式のドキュメントです。

テストイベントを作成するには
  1. コンソールコードエディタの [TEST EVENTS] セクションで、[テストイベントを作成] を選択します。

    Lambda コンソールコードエディタでテストイベントボタンを作成する
  2. [イベント名] で、「myTestEvent」と入力します。

  3. [Event JSON] セクションで、デフォルトの JSON を次のように置き換えます。

    { "orderId": "order-12345" }
  4. [保存] を選択します。

耐久性のある関数をテストして実行を表示する方法

コンソールコードエディタの [TEST EVENTS] セクションで、テストイベントの横にある実行アイコンを選択します。

Lambda コンソールコードエディタでテストイベントボタンを実行する

耐久性のある関数の実行が開始されます。10 秒の待機が含まれるため、最初の呼び出しはすぐに完了します。関数は待機期間後に再開されます。実行の進行状況は、[耐久性のある実行] タブで確認できます。

耐久性のある関数の実行を表示する方法
  1. [耐久性のある実行] タブを選択します。

  2. リストで実行を検索します。実行には現在のステータス (実行中、成功、失敗) が表示されます。

  3. 実行 ID を選択して詳細を確認します。以下の情報が含まれます。

    • 各ステップが完了した日時が示される実行タイムライン

    • チェックポイント履歴

    • 待機期間

    • ステップの結果

CloudWatch Logs で関数のログを表示し、各ステップのコンソール出力を確認することもできます。

CloudWatch Logs で関数の呼び出しレコードを表示するには
  1. Amazon CloudWatch コンソールの [[Log groups (ロググループ)] ページ] を開きます。

  2. 関数のロググループの名前を選択します (/aws/lambda/myDurableFunction) 。

  3. 下にスクロールし、表示したい関数呼び出しのログストリームを選択します。

    Lambda 関数のログストリームの一覧。

    関数の呼び出しごとにログエントリ (最初の実行および待機後の再生を含む) を確認してください。

注記

DurableContext (context.loggerstepContext.logger など) からロガーを使用すると、Lambda コンソールの耐久性のある実行ビューとステップビューにもログが表示されます。これらのログのロードには時間がかかる場合があります。

クリーンアップ

耐久性のある関数のサンプルで作業が完了したら、削除します。また、関数のログを保存するロググループと、コンソールが作成した実行ロールも削除できます。

Lambda 関数を削除するには
  1. Lambda コンソールの [関数] ページを開きます。

  2. 作成した関数を選択します。

  3. [アクション] で、[削除] を選択します。

  4. テキスト入力フィールドに confirm と入力し、[削除] を選択します。

ロググループを削除するには
  1. Amazon CloudWatch コンソールの [Log groups (ロググループ)] ページを開きます。

  2. 関数のロググループ (/aws/lambda/myDurableFunction) を選択します。

  3. [アクション]、[ロググループの削除] の順にクリックします。

  4. ロググループの削除ダイアログボックスで、[削除] をクリックします。

実行ロールを削除するには
  1. AWS Identity and Access Management (IAM) コンソールの [Roles (ロール)] ページを開きます。

  2. 関数の実行ロールを選択します (myDurableFunction-role-31exxmpl など)。

  3. [削除] を選択します。

  4. [ロールを削除] ダイアログボックスにロール名を入力し、[削除] を選択します。

その他のリソースと次のステップ

コンソールを使用してシンプルな耐久性のある関数を作成してテストを行ったら、次の各ステップを実行してください。

  • 分散トランザクション、注文処理、人間によるレビューワークフローなど、耐久性のある関数の一般的なユースケースについて説明します。「」を参照してください。

  • CloudWatch メトリクスおよび実行履歴を使用し、耐久性のある関数の実行をモニタリングする方法について説明します。「モニタリングとデバッグ」を参照してください。

  • 耐久性のある関数を同期的および非同期的に呼び出し、長時間の実行を管理する方法について説明します。「耐久性のある関数の呼び出し」を参照してください。

  • 決定的コードの記述、チェックポイントサイズの管理、コストの最適化に関するベストプラクティスに従います。「ベストプラクティス」を参照してください。

  • 耐久性のある関数をローカルやクラウドでテストする方法について説明します。「耐久性のある関数のテスト」を参照してください。

  • 耐久性のある関数と Step Functions を比較して、各アプローチがどのような場合に最も効果的かを明らかにします。「耐久性のある関数か Step Functions か」を参照してください。