目次
AWS Step Functions の特徴
Step Functions は「複数の処理を、順番・分岐・並列・リトライ付きで実行するワークフロー管理サービス」 です。Lambda、ECS、Batch、Glue、SNS、SQS、DynamoDB、EventBridge などを組み合わせて、「この処理が成功したら次へ」「失敗したらリトライ」「条件によって分岐」「複数処理を並列実行」といった流れを、コードではなくステートマシンとして定義できます。
Step Functions は分散アプリケーション、プロセス自動化、マイクロサービスのオーケストレーション、データ/機械学習パイプライン作成に使うサービスです。AWS の複数のサービスを簡単に配列することができるサーバーレスの関数オーケストレーターです。
全体の流れ
たとえば、以下のような処理があるとします。
- S3 にファイルが置かれる
- ファイルを検証する
- 問題なければ ECS タスクを起動する
- ECS の処理が終わったら DB に結果を書き込む
- 成功通知を SNS に送る
- 失敗したらエラー通知を送る
これを全部アプリケーションコードで書くと、リトライ、エラー処理、状態管理、ログ出力、途中失敗時の扱いが複雑になります。
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
}
}
}
これはサーバーやコンテナではなく、以下のような処理の流れの定義です。
- 最初は RunEcsTask から始める
- RunEcsTask が終わったら NotifySuccess へ進む
- 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回分の実行履歴です。