AWS Step Functions:Activity State MachineでLambda以外のアプリケーションを実行してみた

2017.01.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、菊池です。本年1つ目のブログです。

AWS re:Invent 2016で発表されたAWS Step Functionsは、複数のLambdaアプリケーションを連携して実行させるのに非常に便利ですが、Lambda以外にもEC2やオンプレミス環境で実行されるアプリケーションもState Machineに組み込んで実行させることが可能です

Activity State Machine

State MachineのTask Stateで実行するアプリケーションには、Lambda関数だけでなく、Activityを指定可能です。このActivityを利用することでEC2やオンプレミスのアプリケーションを実行することが可能になります。

以下の手順でActivity State Machineを作成し実行してみます。

  1. Activityの作成
  2. State Machineの作成
  3. State Machineの実行

1. Activityの作成

まずはActivityを作成します。

sf-act-001

指定するパラメータはActivity Nameのみで作成できます。

sf-act-002

作成すると、ActivityのARNが生成されます。

sf-act-003

2. State Machineの作成

続いてState Machineの作成です。チュートリアルに従って以下のようなState Machineを作成します。

{
  "Comment": "An example using a Task state.",
  "StartAt": "getGreeting",
  "Version": "1.0",
  "TimeoutSeconds": 300,
  "States": 
  {
    "getGreeting": {
      "Type": "Task",
      "Resource": "arn:aws:states:ap-northeast-1:xxxxxxxxxxxx:activity:test",
      "End": true
    }
  }
}

Activityを実行するTaskが1つあるだけのシンプルなState Machineです。

sf-act-004

3. State Machineの実行

この状態で実行しても、実行されるアプリケーションがありません。Taskで指定したActivityと連携するアプリケーションが必要です。

Lambdaの場合には、State MachineがTaskで指定したLambda関数にトリガーしてアプリケーションを起動するPush型の実行になります。一方で、Activityの場合にはアプリケーション側でActivityをポーリングするPull型の実行となります。

動作イメージ

EC2で動作するアプリケーションの場合、実行イメージは以下のようになります。

sf-act-006

  1. EC2からActivityをポーリング(Get-Activity-Task)
  2. State Machineを実行
  3. Activityを指定したTask Stateに到達すると、TaskTokenを応答する
  4. アプリケーションの処理を実行
  5. 実行結果をTaskTokenとともにState Machineに通知(Send-Task-Success)

Activityで実行したいアプリケーションでは、Taskへの到達をポーリングし、処理の結果を通知するように実装する必要があります。

今回はシンプルに以下のようなPythonコードを実行してテストしました。

import boto3

client   = boto3.client('stepfunctions')
response = client.get_activity_task(
    activityArn = "arn:aws:states:ap-northeast-1:xxxxxxxxxxxx:activity:test",
    workerName  = "testWorker"
)

Token  = str(response['taskToken'])
Result = str(response['input'])

result = client.send_task_success(
    taskToken = Token,
    output    = Result
)

get-activity-taskを実行し、応答があればTaskTokenとInputをそのままsend_task_successで通知します。

実行してみる

アプリケーションとState Machineを実行してみます。アプリケーションを先に実行すると、State Machineが実行され応答が来るのを待ちます(60秒でタイムアウト)。State Machineを先に実行すれば、Task Stateで指定した300秒間はアプリケーションが実行されるのを待ちます。

両者を実行することで以下のように実行結果が得られました。

sf-act-008 sf-act-009

まとめ

Step FunctionsはLambdaを連携させるサービスというイメージがありますが、Activityを使うことでEC2やオンプレ環境のアプリケーションも連携させることが可能ということがわかりました。

データソースや実行環境・言語などの都合でLambdaで実行できないアプリケーションでも、フローを作成して複雑な連携や実行状態の管理が可能になる、幅広く応用できるサービスです。