

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Step Functions を使用してアクティビティステートマシンを作成する
<a name="tutorial-creating-activity-state-machine"></a>

このチュートリアルでは、Java と AWS Step Functionsを使用してアクティビティベースのステートマシンを作成する方法について説明します。アクティビティにより、ステートマシンの別の場所で実行されるワーカーコードを制御できます。[Step Functions のアクティビティについて](concepts-activities.md) の概要については、[Step Functions のステートマシンについて](concepts-statemachines.md) を参照してください。

このチュートリアルを完了するには、以下が必要です。
+ [SDK for Java](https://aws.amazon.com/sdk-for-java/)。このチュートリアルのアクティビティ例は、 を使用して と AWS SDK for Java 通信する Java アプリケーションです AWS。
+ AWS 環境または標準 AWS 設定ファイルの 認証情報。詳細については、「 *AWS SDK for Java デベロッパーガイド*」の[AWS 「認証情報のセットアップ](https://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/set-up-creds.html)」を参照してください。

## ステップ 1: アクティビティを作成する
<a name="create-activity-state-machine-step-1"></a>

Step Functions に、作成したい*[worker]* (ワーカー) (プログラム) の *[activity]* (アクティビティ) を認識させる必要があります。Step Functions は、アクティビティのアイデンティティを確立する Amazon リソースネーム (ARN) で応答します。このアイデンティティを使用して、ステートマシンとワーカー間で渡される情報を調整します。

**重要**  
アクティビティタスクがステートマシンと同じ AWS アカウントにあることを確認します。

1. [Step Functions コンソール](https://console.aws.amazon.com/states/home)内、左のナビゲーションペインで、**[Activities]** (アクティビティ) を選択します。

1. **[Create activity]** (アクティビティの作成) を選択します。

1. アクティビティの **[名前]** (`get-greeting` など) を入力し、**[アクティビティの作成]** を選択します。

1. 次の例に示すように、アクティビティタスクが作成されたら、その ARN を記録します。

   ```
   arn:aws:states:region:123456789012:activity:get-greeting
   ```

## ステップ 2: ステートマシンを作成する
<a name="create-activity-state-machine-step-2"></a>

アクティビティがいつ呼び出されるかと、ワーカーがいつプライマリ作業を実行して、その結果を収集し、結果を戻すべきかを判断するステートマシンを作成します。ステートマシンを作成するには、Workflow Studio の [コードエディタ](workflow-studio.md#wfs-interface-code-editor) を使用します。

1. [Step Functions コンソール](https://console.aws.amazon.com/states/home)内、左のナビゲーションペインで、**[State machines]** (ステートマシン) を選択します。

1. **[ステートマシン]** ページで、**[ステートマシンの作成]** を選択します。

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

1. ステートマシンに名前を付け、**[続行]** を選択して Workflow Studio でステートマシンを編集します。

1. このチュートリアルでは、コードエディタでステートマシンの [Amazon States Language](concepts-amazon-states-language.md) (ASL) 定義を記述します。これを行うには、**[コード]** を選択します。

1. 既存のボイラープレートコードを削除して、次のコードを貼り付けます。`Resource` フィールド内の ARN の例を、[ステップ 1: アクティビティを作成する](#create-activity-state-machine-step-1) で先ほど作成したアクティビティタスクの ARN に置き換えることを忘れないでください。

   ```
   {
     "Comment": "An example using a Task state.",
     "StartAt": "getGreeting",
     "Version": "1.0",
     "TimeoutSeconds": 300,
     "States":
     {
       "getGreeting": {
         "Type": "Task",
         "Resource": "arn:aws:states:region:123456789012:activity:get-greeting",
         "End": true
       }
     }
   }
   ```

   これは、[Amazon States Language](concepts-amazon-states-language.md) (ASL) を使用したステートマシンの説明です。`getGreeting` という名前の単一の `Task` 状態を定義します。詳細については、「[State Machine Structure](statemachine-structure.md)」を参照してください。

1. [グラフの視覚化](workflow-studio.md#wfs-interface-code-graph-viz) で、追加した ASL 定義のワークフローグラフが次のグラフのようになっていることを確認します。  
![\[RunActivity タスク状態を使用したステートマシンのグラフの視覚化。\]](http://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/images/tutorial-create-state-machine-custom-preview.png)

1. ステートマシンの名前を指定します。これを行うには、**MyStateMachine** のデフォルトステートマシン名の横にある編集アイコンを選択します。次に、**[ステートマシンの設定]** の **[ステートマシン名]** ボックスに名前を指定します。

   このチュートリアルでは、名前として「**ActivityStateMachine**」と入力します。

1. (オプション) **[ステートマシンの設定]** で、ステートマシンのタイプや実行ロールなど、他のワークフロー設定を指定します。

   このチュートリアルでは、**[ステートマシンの設定]** のデフォルト設定をすべてそのまま使用します。

   ステートマシンに適切なアクセス許可を持つ [IAM ロールを以前に作成](procedure-create-iam-role.md)していて、そのロールを使用する場合は、**[アクセス許可]** で **[既存のロールを選択]** を選択し、一覧からロールを選択します。または、**[ロールの ARN を入力]** を選択し、その IAM ロールの ARN を指定します。

1. **[ロールの作成を確認]** ダイアログボックスで、**[確認]** を選択して続行します。

   **[ロールの設定を表示]** を選択して **[ステートマシンの設定]** に戻ることもできます。
**注記**  
Step Functions が作成した IAM ロールを削除すると、Step Functions を後で再作成することはできません。同様に、ロールを変更すると (例えば、IAM ポリシーのプリンシパルから Step Functions を削除するなど)、後で Step Functions でそれを元の設定に復元することはできません。

## ステップ 3: ワーカーを実装する
<a name="create-activity-state-machine-step-3"></a>

*ワーカー*を作成します。ワーカーは、次の処理を行うプログラムです。
+ `GetActivityTask` API アクションを使用したアクティビティの Step Functions のポーリング。
+ コードを使用したアクティビティの作業の実行 (次のコードの `getGreeting()` メソッドなど)。
+ `SendTaskSuccess`、`SendTaskFailure`、`SendTaskHeartbeat` API アクションを使用して結果を返す。

**注記**  
アクティビティワーカーの詳細な例については、[例: Ruby のアクティビティワーカー](concepts-activities.md#example-ruby-activity-worker) を参照してください この例により、アクティビティワーカーのリファレンスとして使用できるベストプラクティスに基づく実装が提供されます。このコードには、ポーラーおよびアクティビティワーカー用に構成可能な数のスレッドを含む、コンシューマー/プロデューサーパターンが実装されています。

### ワーカーを実装するには
<a name="create-activity-state-machine-implement-worker"></a>

1. `GreeterActivities.java` という名前のファイルを作成します。

1. 次のコードを追加します。

   ```
   import com.amazonaws.ClientConfiguration;
   import com.amazonaws.auth.EnvironmentVariableCredentialsProvider;
   import com.amazonaws.regions.Regions;
   import com.amazonaws.services.stepfunctions.AWSStepFunctions;
   import com.amazonaws.services.stepfunctions.AWSStepFunctionsClientBuilder;
   import com.amazonaws.services.stepfunctions.model.GetActivityTaskRequest;
   import com.amazonaws.services.stepfunctions.model.GetActivityTaskResult;
   import com.amazonaws.services.stepfunctions.model.SendTaskFailureRequest;
   import com.amazonaws.services.stepfunctions.model.SendTaskSuccessRequest;
   import com.amazonaws.util.json.Jackson;
   import com.fasterxml.jackson.databind.JsonNode;
   import java.util.concurrent.TimeUnit;
   
   
   public class GreeterActivities {
   
       public String getGreeting(String who) throws Exception {
           return "{\"Hello\": \"" + who + "\"}";
       }
   
       public static void main(final String[] args) throws Exception {
           GreeterActivities greeterActivities = new GreeterActivities();
           ClientConfiguration clientConfiguration = new ClientConfiguration();
           clientConfiguration.setSocketTimeout((int)TimeUnit.SECONDS.toMillis(70));
   
           AWSStepFunctions client = AWSStepFunctionsClientBuilder.standard()
                   .withRegion(Regions.US_EAST_1)
                   .withCredentials(new EnvironmentVariableCredentialsProvider())
                   .withClientConfiguration(clientConfiguration)
                   .build();
   
           while (true) {
               GetActivityTaskResult getActivityTaskResult =
                       client.getActivityTask(
                               new GetActivityTaskRequest().withActivityArn(ACTIVITY_ARN));
   
               if (getActivityTaskResult.getTaskToken() != null) {
                   try {
                       JsonNode json = Jackson.jsonNodeOf(getActivityTaskResult.getInput());
                       String greetingResult =
                               greeterActivities.getGreeting(json.get("who").textValue());
                       client.sendTaskSuccess(
                               new SendTaskSuccessRequest().withOutput(
                                       greetingResult).withTaskToken(getActivityTaskResult.getTaskToken()));
                   } catch (Exception e) {
                       client.sendTaskFailure(new SendTaskFailureRequest().withTaskToken(
                               getActivityTaskResult.getTaskToken()));
                   }
               } else {
                   Thread.sleep(1000);
               }
           }
       }
   }
   ```
**注記**  
この例の `EnvironmentVariableCredentialsProvider` クラスでは、`AWS_ACCESS_KEY_ID` (または `AWS_ACCESS_KEY`) および `AWS_SECRET_KEY` (または `AWS_SECRET_ACCESS_KEY`) 環境変数が設定されていることを前提としています。ファクトリに必要な認証情報の提供の詳細については、[AWSCredentialsProvider](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/AWSCredentialsProvider.html)」および「 *AWS SDK for Java デベロッパーガイド*」の[「開発用の AWS 認証情報とリージョンのセットアップ](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html)」を参照してください。 *AWS SDK for Java *  
デフォルトでは、 AWS SDK は任意のオペレーションのためにサーバーからデータを受信するまで最大 50 秒待機します。`GetActivityTask` オペレーションは、次に使用可能なタスクまで最大 60 秒待機するロングポーリングオペレーションです。`SocketTimeoutException` エラーを受け取らないようにするには、SocketTimeout を 70 秒に設定します。

1. `GetActivityTaskRequest().withActivityArn()` コンストラクタのパラメータリストで、`ACTIVITY_ARN` 値を、[ステップ 1: アクティビティを作成する](#create-activity-state-machine-step-1) で先ほど作成したアクティビティタスクの ARN に置き換えます。

## ステップ 4: ステートマシンを実行する
<a name="create-activity-state-machine-step-4"></a>

ステートマシンの実行をスタートすると、ワーカーがアクティビティの Step Functions をポーリングして、その作業を実行し (指定した入力を使用)、その結果を返します。

1. ***[ActivityStateMachine]*** ページで、**[Start execution]** (実行のスタート) を選択します。

   **[実行を開始]** ダイアログが表示されます。

1. **[実行を開始]** ダイアログボックスで、以下の操作を行います。

   1. (オプション) 生成されたデフォルトを上書きするカスタム実行名を入力します。
**非 ASCII 名とログ記録**  
Step Functions では、ステートマシン、実行、アクティビティ、ラベルに、ASCII 以外の文字を含む名前を使用できます。このような文字を使用すると Amazon CloudWatch がデータを記録できなくなるため、Step Functions のメトリクスを追跡できるように ASCII 文字のみを使用することをお勧めします。

   1. **[入力]** ボックスに、次の JSON 入力を入力してワークフローを実行します。

      ```
      {
        "who": "AWS Step Functions"
      }
      ```

   1. **[実行のスタート]** を選択します。

   1. Step Functions コンソールから実行 ID のタイトルが付いたページが表示されます。このページは、*[実行の詳細]* ページと呼ばれます。このページでは、実行の進行中または完了後に実行結果を確認できます。

      実行結果を確認するには、**[グラフビュー]** で個々の状態を選択し、[ステップの詳細](concepts-view-execution-details.md#exec-details-intf-step-details) ペインの個々のタブを選択すると、入力、出力、定義などの各状態の詳細がそれぞれ表示されます。*[実行の詳細]* ページに表示できる実行情報の詳細については、「[実行の詳細の概要](concepts-view-execution-details.md#exec-details-interface-overview)」を参照してください。

## ステップ 5: ワーカーを実行して停止する
<a name="create-activity-state-machine-step-5"></a>

ワーカーにアクティビティのステートマシンをポーリングさせるには、ワーカーを実行する必要があります。

1. コマンドラインで、`GreeterActivities.java` を作成したディレクトリに移動します。

1.  AWS SDK を使用するには、 `lib`および `third-party` ディレクトリのフルパスをビルドファイルの依存関係と Java に追加します`CLASSPATH`。詳細については、*[AWS SDK for Java Developer Guide]* ( デベロッパーガイド) の [SDK をダウンロードして抽出する](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-install.html#download-and-extract-sdk)を参照してください。

1. ファイルをコンパイルします。

   ```
   $ javac GreeterActivities.java
   ```

1. ファイルを実行します。

   ```
   $ java GreeterActivities
   ```

1. [Step Functions コンソール](https://console.aws.amazon.com/states/home?region=us-east-1#/)で、*[実行の詳細]* ページに移動します。

1. 実行が完了したら、実行結果を確認します。

1. ワーカーを停止します。