

# Lambda の耐久性のある関数を作成する
<a name="durable-getting-started"></a>

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

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

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

**注記**  
耐久性のある関数は現在、Python、Node.js (JavaScript/TypeScript)、Java ランタイムに加えて、コンテナイメージ (OCI)をサポートしています。サポートされているランタイムバージョンとコンテナイメージオプションの詳細なリストについては、「[耐久関数のサポートされているランタイム](durable-supported-runtimes.md)」を参照してください。Lambda によるコンテナイメージの使用に関する詳細については、「Lambda デベロッパーガイド」の「[コンテナイメージを使用した Lambda 関数の作成](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html)」を参照してください。

**ヒント**  
**サーバーレスソリューション**を構築する方法については、「[サーバーレスデベロッパーガイド](https://docs.aws.amazon.com/serverless/latest/devguide/)」を参照してください。

## 前提条件
<a name="durable-getting-started-prerequisites"></a>

### AWS アカウント にサインアップする
<a name="sign-up-for-aws"></a>

AWS アカウント がない場合は、以下のステップを実行して作成します。

**AWS アカウント にサインアップするには**

1. [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup) を開きます。

1. オンラインの手順に従います。

   サインアップ手順の一環として、電話またはテキストメッセージを受け取り、電話キーパッドで検証コードを入力します。

   AWS アカウントにサインアップすると、*AWS アカウントのルートユーザー*が作成されます。ルートユーザーには、アカウントのすべての AWS のサービス とリソースへのアクセス権があります。セキュリティのベストプラクティスとして、ユーザーに管理アクセスを割り当て、ルートユーザーのみを使用して[ルートユーザーアクセスが必要なタスク](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)を実行してください。

サインアップ処理が完了すると、AWS からユーザーに確認メールが送信されます。[https://aws.amazon.com/](https://aws.amazon.com/) の **[マイアカウント]** をクリックして、いつでもアカウントの現在のアクティビティを表示し、アカウントを管理することができます。

### 管理アクセスを持つユーザーを作成する
<a name="create-an-admin"></a>

AWS アカウントにサインアップしたら、AWS アカウントのルートユーザーをセキュリティで保護し、AWS IAM アイデンティティセンター を有効にして、管理ユーザーを作成します。これにより、日常的なタスクにルートユーザーを使用しないようにします。

**AWS アカウントのルートユーザー をセキュリティで保護する**

1.  **[ルートユーザー]** を選択し、AWS アカウント のメールアドレスを入力して、アカウント所有者として [AWS マネジメントコンソール](https://console.aws.amazon.com/) にサインインします。次のページでパスワードを入力します。

   ルートユーザーを使用してサインインする方法については、「*AWS サインイン ユーザーガイド*」の「[ルートユーザーとしてサインインする](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)」を参照してください。

1. ルートユーザーの多要素認証 (MFA) を有効にします。

   手順については、「*IAM ユーザーガイド*」の「[AWS アカウント ルートユーザーの仮想 MFA デバイスを有効にする (コンソール)](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html)」を参照してください。

**管理アクセスを持つユーザーを作成する**

1. IAM アイデンティティセンターを有効にします。

   手順については、「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[AWS IAM アイデンティティセンター の有効化](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)」を参照してください。

1. IAM アイデンティティセンターで、ユーザーに管理アクセスを付与します。

   IAM アイデンティティセンターディレクトリ をアイデンティティソースとして使用するチュートリアルについては、「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[デフォルトの IAM アイデンティティセンターディレクトリ を使用してユーザーアクセスを設定する](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html)」を参照してください。

**管理アクセス権を持つユーザーとしてサインインする**
+ IAM アイデンティティセンターのユーザーとしてサインインするには、IAM アイデンティティセンターのユーザーの作成時に E メールアドレスに送信されたサインイン URL を使用します。

  IAM アイデンティティセンターユーザーを使用してサインインする方法については、「*AWS サインイン ユーザーガイド*」の「[AWS アクセスポータルにサインインする](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)」を参照してください。

**追加のユーザーにアクセス権を割り当てる**

1. IAM アイデンティティセンターで、最小特権のアクセス許可を適用するというベストプラクティスに従ったアクセス許可セットを作成します。

   手順については、「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[アクセス許可セットを作成する](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)」を参照してください。

1. グループにユーザーを割り当て、そのグループにシングルサインオンアクセス権を割り当てます。

   手順については、「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[グループを追加する](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)」を参照してください。

## コンソールで Lambda の耐久性のある関数を作成します
<a name="getting-started-create-durable-function"></a>

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

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

**コンソールで耐久性のある関数を作成する方法**

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開きます。

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

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

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

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

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

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

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

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

------
#### [ Node.js ]

**コンソールでコードを変更するには**

1. **[コード]** タブを選択します。

   Lambda が関数コードを作成すると、それがコンソールの組み込みコードエディタに表示されます。コードエディターに **index.mjs** タブが表示されない場合は、次の図に示すように、ファイルエクスプローラーで **index.mjs** を選択します。  
![コンソールのコードエディターとファイルエクスプローラーの index.mjs ファイルを示す図](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/durable-nodejs.png)

1. 次のコードを **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]
       };
     }
   );
   ```

1. **[DEPLOY]** セクションで、**[デプロイ]** を選択して関数のコードを更新します。  
![Lambda コンソールコードエディタの [デプロイ] ボタン](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

**耐久性のある関数コードの概要**  
次のステップに進む前に、関数コードについて紹介し、耐久性のある関数の主な概念について説明します。
+ `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 ファイルを示す図](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/durable-python.png)

1. 次のコードを **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]
       }
   ```

1. **[DEPLOY]** セクションで、**[デプロイ]** を選択して関数のコードを更新します。  
![Lambda コンソールコードエディタの [デプロイ] ボタン](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

**耐久性のある関数コードの概要**  
次のステップに進む前に、関数コードについて紹介し、耐久性のある関数の主な概念について説明します。
+ `@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 を使用して耐久性のある関数を呼び出す
<a name="get-started-invoke-durable-manually"></a>

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

**関数のバージョンを発行する方法**

1. **[バージョニング]** タブを選択します。

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

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

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

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

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

**テストイベントを作成するには**

1. コンソールコードエディタの **[TEST EVENTS]** セクションで、**[テストイベントを作成]** を選択します。  
![Lambda コンソールコードエディタでテストイベントボタンを作成する](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/getting-started-tutorial/test-event.png)

1. **[イベント名]** で、「**myTestEvent**」と入力します。

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

   ```
   {
     "orderId": "order-12345"
   }
   ```

1. **[保存]** を選択します。

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

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

![Lambda コンソールコードエディタでテストイベントボタンを実行する](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/getting-started-tutorial/run-test-event.png)


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

**耐久性のある関数の実行を表示する方法**

1. **[耐久性のある実行]** タブを選択します。

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

1. 実行 ID を選択して詳細を確認します。以下の情報が含まれます。
   + 各ステップが完了した日時が示される実行タイムライン
   + チェックポイント履歴
   + 待機期間
   + ステップの結果

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

**CloudWatch Logs で関数の呼び出しレコードを表示するには**

1. Amazon CloudWatch コンソールの [[[Log groups (ロググループ)] ページ](https://console.aws.amazon.com/cloudwatch/home#logs:)] を開きます。

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

1. 下にスクロールし、表示したい関数呼び出しの**ログストリーム**を選択します。  
![Lambda 関数のログストリームの一覧。](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/log-stream.png)

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

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

## クリーンアップ
<a name="gettingstarted-durable-cleanup"></a>

耐久性のある関数のサンプルで作業が完了したら、削除します。また、関数のログを保存するロググループと、コンソールが作成した[実行ロール](lambda-intro-execution-role.md)も削除できます。

**Lambda 関数を削除するには**

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開きます。

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

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

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

**ロググループを削除するには**

1. Amazon CloudWatch コンソールの [[Log groups (ロググループ)] ページ](https://console.aws.amazon.com/cloudwatch/home#logs:)を開きます。

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

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

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

**実行ロールを削除するには**

1. AWS Identity and Access Management (IAM) コンソールの [[Roles (ロール)] ページ](https://console.aws.amazon.com/iam/home?#/roles)を開きます。

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

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

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

## その他のリソースと次のステップ
<a name="durable-getting-started-more-resources"></a>

コンソールを使用してシンプルな耐久性のある関数を作成してテストを行ったら、次の各ステップを実行してください。
+ 分散トランザクション、注文処理、人間によるレビューワークフローなど、耐久性のある関数の一般的なユースケースについて説明します。「[例](durable-examples.md)」を参照してください。
+ CloudWatch メトリクスおよび実行履歴を使用し、耐久性のある関数の実行をモニタリングする方法について説明します。「[モニタリングとデバッグ](durable-monitoring.md)」を参照してください。
+ 耐久性のある関数を同期的および非同期的に呼び出し、長時間の実行を管理する方法について説明します。「[耐久性のある関数の呼び出し](durable-invoking.md)」を参照してください。
+ 決定的コードの記述、チェックポイントサイズの管理、コストの最適化に関するベストプラクティスに従います。「[ベストプラクティス](durable-best-practices.md)」を参照してください。
+ 耐久性のある関数をローカルやクラウドでテストする方法について説明します。「[耐久性のある関数のテスト](durable-testing.md)」を参照してください。
+ 耐久性のある関数と Step Functions を比較して、各アプローチがどのような場合に最も効果的かを明らかにします。「[耐久性のある関数か Step Functions か](durable-step-functions.md)」を参照してください。