16
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

StepFunctionsの基本

Posted at
1 / 25

StepFunctions

  • AWS re:Invent2016 にてStepFunctionsがリリースされた
  • 状態マシンを書いてLambdaの処理をさせることができるサービス

StepFunctionsの基本構文


StepFunctionオブジェクト

{
  "StartAt": "State名",
  "States": {
    "State名": {
      //Stateオブジェクト
    }
  }
}

Stateオブジェクト

{
  "Type": "Stateタイプ",
  "Next": "State名", // Stateが実行された後に続けて実行されるState名
  "End": true // Stateが実行された後、終了する場合はtrueを指定する
}

2016-12-13_12h17_08.png


State.Type


Task

LambdaのARNを指定して、実行することができる。

{
  "Type": "Task",
  "Resource": "LambdaのARN",
  "End": true
}

2016-12-13_12h17_27.png


Wait

指定した秒数か、指定した時刻がくるまで待たせることができる。

{
  "Type": "Wait",
  "Seconds": 10,
  /* または
  "Timestamp": "2015-09-04T01:59:00Z",
  "SecondsPath": "$.hogeTimestamp",
  "TimestampPath": "$.hogeSeconds",
  */
  "End": true
}

Choice

前段の処理結果によって後続の処理を分岐する

Type=Choice
{
  "Type": "Choice",
  "Choices": [ { 
    // Choiceオブジェクト
  } ],
  "Default": "Choiceオブジェクトに該当しなかった場合に実行するState名"
}

2016-12-13_12h40_13.png


Choice

比較処理を行うメソッドはいくつもあるので、要確認

Choiceオブジェクト
{
  "Variable": "前段の処理結果もらった変数のパス($.hogeとか)"
  "StringEquals": "↑で指定したパスから得られる文字列比較",
  "Next": "↑でチェックした内容がtrueであれば次に実行するState名"
}

Choice

前段処理のjavascript
exports.handler = function(event, context, callback) {
  // 
  callback( null, {
    "hoge": "1"
  } );
};

Parallel

並列処理を行う
Branchesで配列を指定でき、Branchesの配列一つ一つには、さらに新規にStepFunctionオブジェクトを設定できる。


Parallel

JSON
{
  "Type": "Parallel",
  "Next": "NextWorld",
  "Branches": [ {
    // StepFunctionオブジェクト
  } ]
}

2016-12-13_12h29_56.png


その他のType

Succeed

  • そのタスクに来たら、強制的にStepFunctionが完了したことになる
  • たとえばParallelでこれが実行されると、強制的にParallelを抜ける
{
  "Type": "Succeed"
}

その他のType

Fail

  • このタスクに来たら、強制的にStepFunctionが失敗したことになる
{
  "Type": "Fail",
  "Cause": "失敗した理由",
  "Error": "エラーオブジェクト"
}

その他のType

Pass

  • モックのような役割を果たし、次のタスクに渡したい値を設定できる。
  • 前のタスクの変数に上書きしたりできる
{
  "Task": "Pass",
  "Result": { 
    // 次のタスクに渡したい値
  },
  "ResultPath": "前のタスクの変数のどこに格納するか($.hogeとか)"
}

変数について

前段から返却されたパラメータについては、$を使ってアクセスすることができる。
たとえば、次のようなコードで値を返した場合、


変数について

前段のコード
exports.handler = function(event, context, callback) {
  callback( null, {
    "response": 20
  } );
};

変数について

変数として、$でアクセスすることができる。
例えばWaitのSecondPathの場合、


変数について

JSON
{
  "Type": "Wait",
  "SecondPath": "$.response"
  "Next": "NextWorld"
}

変数について

$.responseで秒数を取得できる。
オブジェクトではなく、文字列などを返却した場合は$でその文字列にアクセスできる。
また、次のタスクでは前段から返却されたパラメータがそのまま変数として渡される。


TypeがTaskの時に指定できる特別な値


Catch

Taskが何らかのエラーで失敗した場合に、Catchハンドラで捕まえてエラー時の処理を実行させることができます。

JSON
{
  "Type": "Task",
  "Resource": "ARN",
  "Catch": [ {
    "ErrorEquals": [ "HandledError" ],
    "Next": "NextWorld"
  } ],
  "End": true
},
"NextWorld": {
  // ...
}

Retry

Catchとだいたい一緒です。
違いは、エラーになった場合に、指定した処理を実行するのではなく、再実行するところ。

JSON
{
  "Type": "Task",
  "Resource": "ARN",
  "Retry": {
    "ErrorEquals": ["HandledError"],
    "IntervalSeconds": 1, // 再実行するときにインターバルをあける
    "MaxAttempts": 2, // 再実行回数
    "BackoffRate": 2.0 // 再再実行するときにインターバルを何秒増やすか
  },
  "End": true
}

参考

AWS StepFunctions Overview

16
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?