AWS Step Functions(分散アプリケーションの調整)

AWS Step Functions の特徴

Step Functions は「複数の処理を、順番・分岐・並列・リトライ付きで実行するワークフロー管理サービス」 です。Lambda、ECS、Batch、Glue、SNS、SQS、DynamoDB、EventBridge などを組み合わせて、「この処理が成功したら次へ」「失敗したらリトライ」「条件によって分岐」「複数処理を並列実行」といった流れを、コードではなくステートマシンとして定義できます。

Step Functions は分散アプリケーション、プロセス自動化、マイクロサービスのオーケストレーション、データ/機械学習パイプライン作成に使うサービスです。AWS の複数のサービスを簡単に配列することができるサーバーレスの関数オーケストレーターです。

全体の流れ

たとえば、以下のような処理があるとします。

  1. S3 にファイルが置かれる
  2. ファイルを検証する
  3. 問題なければ ECS タスクを起動する
  4. ECS の処理が終わったら DB に結果を書き込む
  5. 成功通知を SNS に送る
  6. 失敗したらエラー通知を送る

これを全部アプリケーションコードで書くと、リトライ、エラー処理、状態管理、ログ出力、途中失敗時の扱いが複雑になります。

Step Functions を使うと、この流れを 状態遷移図 のように管理できます。

開始
  ↓
ファイル検証
  ↓
成功? ── No ──→ 失敗通知
  ↓ Yes
ECSタスク実行
  ↓
DB更新
  ↓
成功通知
  ↓
終了

Step Functions は、処理そのものを実行するサービスというより、処理の流れを管理する司令塔 です。

ステートマシン

Step Functions の「ステートマシン」は、ECS や EC2 のような実体のあるマシンではありません。Docker コンテナでもありません。ここでいう マシン は、コンピュータのマシンではなく、状態を管理して次の処理へ進める仕組み という意味です。

ちなみに machine → 機械 装置 機構 組織 働く人 などの意味です。

ステートマシンは、日本語にすると 状態機械 です。

  • 今どの状態か
  • 次にどの状態へ進むか
  • どの条件なら別ルートへ進むか
  • 失敗したらどうするか

例えば以下のような一連の流れ全体を ステートマシン と呼びます。

注文受付 → 決済 → 在庫確認 → 発送依頼 → メール通知

この1つ1つの状態が ステート です。そして、この全体の流れを管理するものが ステートマシン です。

ステートマシンは Docker や ECS や EC2 のようなマシンではない

ECS や Docker コンテナは、実際に処理を実行する場所です。Step Functions のステートマシンは、処理を実行する順番を管理する設計図・進行管理表 のようなものです。

Step Functions のステートマシン
  ↓
「次はこのECSタスクを実行して」
  ↓
ECS/Fargate
  ↓
Dockerコンテナが実際の処理を実行

ステートマシンと ECS などの関係性は以下のようなイメージです。

  • ステートマシン = 指示を出す側
  • ECS / Docker = 実際に動く処理本体

ステートマシンは作業手順書とも言える

たとえば、以下のようなバッチ処理を運用しているとします。

1. CSVファイルを確認する
2. 問題なければ取込処理を実行する
3. DBに登録する
4. 成功通知を送る
5. 失敗したらエラー通知を送る

この手順書そのものがステートマシンと言えます。ただし Step Functions の場合は、単なる手順書ではなく、AWS がその手順書通りに自動で進行してくれるサーバーレスの関数オーケストレーターです。

ステートマシンの実体

Step Functions のステートマシンの実体はJSON形式のワークフロー定義です。

たとえば、かなり簡略化するとこんなイメージです。

{
  "StartAt": "RunEcsTask",
  "States": {
    "RunEcsTask": {
      "Type": "Task",
      "Resource": "arn:aws:states:::ecs:runTask.sync",
      "Next": "NotifySuccess"
    },
    "NotifySuccess": {
      "Type": "Task",
      "Resource": "arn:aws:states:::sns:publish",
      "End": true
    }
  }
}

これはサーバーやコンテナではなく、以下のような処理の流れの定義です。

  1. 最初は RunEcsTask から始める
  2. RunEcsTask が終わったら NotifySuccess へ進む
  3. NotifySuccess が終わったら終了する

なぜ「マシン」という名前なのか

マシンと聞くと「機械」のことだと思い混乱します。AWS の「ステートマシン」のマシンは、EC2インスタンスやサーバーの意味ではありません。コンピュータサイエンスでいう finite state machine / 有限状態機械 の意味です。

たとえば、自動販売機もステートマシンで考えられます。

待機中
  ↓ お金投入
金額確認中
  ↓ 商品選択
商品排出中
  ↓
待機中に戻る

このように、状態があり、イベントや条件によって次の状態へ移る仕組み をステートマシンと呼びます。

Wikiより

有限オートマトン(ゆうげんオートマトン、英: finite automaton)または有限状態機械ゆうげんじょうたいきかい、英: finite state machine, FSM)とは、有限個の状態と遷移規則からなる状態機械。

チューリングマシンとは異なり計算状態を記憶するテープを持たず、チューリング完全ではないが、様々な応用がある。

ステートとは

ステートとは、ワークフローの中の1つの状態・処理です。

例として、以下はすべてステートです。

Lambdaを実行する
ECSタスクを起動する
条件分岐する
10分待つ
並列処理する
成功として終了する
失敗として終了する

たとえば、ECSタスクを起動するステートがある場合、そのステートはこういう役割です。

Step Functions:
「このタイミングで ECS のタスクを起動してください」

そして実際の処理は ECS 側で動きます。

ステートマシンを実行する

ステートマシンの実行とは 定義されたワークフローを1回開始する という意味です。

たとえば、以下のようなステートマシンがあるとします。

CSVチェック → ECS取込処理 → 通知

これを1回開始すると、Step Functions 上に Execution が作られます。

Execution 001
Execution 002
Execution 003

Execution は、それぞれがワークフローの1回分の実行履歴です。