AWS Step Functions
開発者ガイド

アクティビティステートマシンを作成する

タスクコードはステートマシンで調整できます。このチュートリアルでは、Java と AWS Step Functions を使用してアクティビティベースのステートマシンを作成する方法について説明します。

このチュートリアルを完了するには、以下を行ってください。

  • SDK for Java。このチュートリアルのサンプルアクティビティは、AWS SDK for Java を使用して AWS と通信する Java アプリケーションです。

  • 環境または標準 AWS 設定ファイルの AWS 認証情報。詳細については、『AWS SDK for Java Developer Guide』の「Set up Your AWS credentials」を参照してください。

ステップ 1: 新しいアクティビティを作成する

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

重要

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

新しいアクティビティタスクを作成するには

  1. Step Functions コンソールの、左のナビゲーションペインで、[Activities] (アクティビティ) を選択します。

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

  3. [Activity Name] (アクティビティ名) を入力します。たとえば、get-greeting として、[Create Activity] (アクティビティの作成) を選択します。

  4. アクティビティタスクが作成されたら、その Amazon リソースネーム (ARN) に注意してください。以下に例を示します。

    arn:aws:states:us-east-1:123456789012:activity:get-greeting

ステップ 2: ステートマシンを作成する

アクティビティがいつ呼び出されるかと、ワーカーがいつプライマリ作業を実行して、その結果を収集し、結果を戻すべきかを判断するステートマシンを作成します。

ステートマシンを作成するには

  1. Step Functions コンソールの、左のナビゲーションペインで、[State machines] (ステートマシン) を選択します。

  2. [State machines] (ステートマシン) ページで、[Create state machine] (ステートマシンの作成) を選択して、[Author from scratch] (一から作成) を選択し、[Details] (詳細) で名前を入力します (例: ActivityStateMachine)

    注記

    ステートマシン名の長さは 1~80 文字で、アカウントとリージョンに対して一意である必要があります。また、次の文字を含めることはできません。

    • 空白

    • ワイルドカード文字 (? *)

    • 括弧 (< > { } [ ])

    • 特殊文字 (: ; , \ | ^ ~ $ # % & ` ")

    • 制御文字 (\\u0000 - \\u001f or \\u007f - \\u009f)

    Step Functions では、ASCII 以外の文字を含むステートマシン、実行、およびアクティビティの名前を作成することができます。これらの ASCII 以外の文字は Amazon CloudWatch では使用できません。CloudWatch メトリクスを追跡できるようにするには、ASCII 文字のみを使用する名前を選択します。

  3. IAM ロールを作成または入力します。

    • Step Functions 用の新しい IAM ロールを作成するには、[自分のロールの作成] を選択し、[I acknowledge that Step Functions will create an IAM role which allows access to my Lambda functions (Step Functions が Lambda 関数へのアクセスを許可する IAM ロールを作成することに同意します)] を選択します。

    • Step Functions 用の IAM ロールを以前に作成している場合は、[IAM ロール ARN を指定します] を選択し、既存の [IAM ロール ARN] を入力します。

    注記

    Step Functions によって作成された IAM ロールを削除すると、Step Functions で後で再作成することはできません。同様に、ロールを変更すると (たとえば、IAM ポリシーのプリンシパルから Step Functions を削除するなど)、後で Step Functions でそれを元の設定に復元することはできません。

  4. [State machine definition] (ステートマシンの定義) で、次のコードを入力し、Resource フィールドに前に作成したアクティビティタスクの ARN を追加します。以下に例を示します。

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

    これは、Amazon ステートメント言語 を使用したステートマシンの説明です。getGreeting という名前の単一の Task 状態を定義します。詳細については、「State Machine Structure」を参照してください。

  5. [Visual Workflow] のグラフを使用して、Amazon ステートメント言語 コードでステートマシンが正しく記述されていることを確認します。

    グラフが表示されない場合は、[Visual Workflow] ペインの 
       refresh
    を選択します。

  6. [Create State Machine] を選択します。

    ステートマシンが作成され、確認ページが表示されます。

ステップ 3: ワーカーを実装する

ワーカー (次の処理を担当するプログラム) を作成します。

  • GetActivityTask API アクションを使用したアクティビティの Step Functions のポーリング。

  • コードを使用したアクティビティの作業の実行 (次のコードの getGreeting() メソッドなど)。

  • SendTaskSuccessSendTaskFailureSendTaskHeartbeat API アクションを使用して結果を返す。

注記

アクティビティワーカーの詳細な例については、「Ruby のサンプルアクティビティワーカー」を参照してください。この例により、アクティビティワーカーのリファレンスとして使用できるベストプラクティスに基づく実装が提供されます。このコードには、ポーラーおよびアクティビティワーカー用に構成可能な数のスレッドを含む、コンシューマー/プロデューサーパターンが実装されています。

ワーカーを実装するには

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

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

    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)環境変数が設定されていることを前提としています。ファクトリに必要な認証情報の提供方法の詳細については、『AWS SDK for Java API Reference』の「AWSCredentialsProvider」と『AWS SDK for Java Developer Guide』の「開発用の AWS 認証情報とリージョンのセットアップ」を参照してください。

    Step Functions にリクエストを処理する時間を十分に与えるため、setSocketTimeout は 70 秒に設定されます。

  3. GetActivityTaskRequest().withActivityArn() コンストラクタのパラメーターリストで、ACTIVITY_ARN 値を、以前に作成したアクティビティタスクの ARN に置き換えます。

ステップ 4: 実行を開始する

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

実行を開始するには

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

    [New execution] ページが表示されます。

  2. (オプション) 実行を特定できるように、[Enter an execution name] (実行名を入力) ボックスでその ID を指定できます。ID を入力しない場合、Step Functions は自動的に一意の ID を生成します。

    注記

    Step Functions では、ASCII 以外の文字を含むステートマシン、実行、およびアクティビティの名前を作成することができます。これらの ASCII 以外の文字は Amazon CloudWatch では使用できません。CloudWatch メトリクスを追跡できるようにするには、ASCII 文字のみを使用する名前を選択します。

  3. 実行入力領域で、サンプルデータを以下で置き換えます。

    { "who" : "AWS Step Functions" }
  4. [Start Execution] を選択します。

    ステートマシンの新しい実行が開始され、実行中の実行が表示されている新しいページが表示されます。

  5. [Execution Details] セクションで、[Info] タブを選択して [Execution Status] および [Started] と [Closed] のタイムスタンプを確認します。

  6. [Execution Details] (実行の詳細) セクションで、[Output] (出力) セクションを展開して、ワークフローの出力を表示します。

ステップ 5: ワーカーを実行して停止する

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

注記

実行が完了したら、ワーカーを停止する必要があります。ワーカーを停止しない場合、実行を継続し、アクティビティをポーリングし続けます。実行が停止されると、ワーカーにタスクのソースがなくなるため、ポーリングするたびに SocketTimeoutException を生成します。

ワーカーの実行して停止するには

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

  2. AWS SDK を使用するには、libthird-party ディレクトリの完全パスをビルドファイルの依存関係と、Java CLASSPATH に追加します。詳細については、『AWS SDK for Java Developer Guide』の「SDK をダウンロードして展開する」を参照してください。

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

    $ javac GreeterActivities.java
  4. ファイルを実行します。

    $ java GreeterActivities
  5. Step Functions コンソールで、[Execution Details] ページに移動します。

  6. 実行が完了したら、[Output] を選択して実行の結果を確認します。

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