【SAP-C01試験対策】AWS Step FunctionsのBlack Belt を文章でまとめてみた

# はじめに
AWSのStep Functionsを勉強するためにBlack Belt Online Seminerを視聴したので内容をまとめます。

https://www.youtube.com/watch?v=PGyasNJ1QTQ

# 背景
本記事はAWSソリューションアーキテクトプロフェッショナルに合格するために、[Udemyの模擬試験](https://www.udemy.com/course/aws-53225)を解いて分からなかった部分を勉強してまとめるものです。

試験対策用のため、分からない知識を補足したり試験で問われなさそうなところを省略したりしながらまとめています。
なるべくわかりやすい記載を心がけますが、最終目的は自己学習用であるということをご容赦ください。

# 目次
- [1. セミナーの内容](#セミナーの内容)
  - [1.1. AWS Step Functionsとは](#aws-step-functionsとは)
  - [1.2. ステートマシン](#ステートマシン)
  - [1.3. データの入出力](#データの入出力)
  - [1.4. Stateの記述](#stateの記述)
  - [1.5. 実行状況の確認](#実行状況の確認)
  - [1.6. 補足や料金詳細など](#補足や料金詳細など)
  - [1.7. その他類似のサービスとの使い分け](#その他類似のサービスとの使い分け)
- [2. おわりに](#おわりに)
- [3. 用語集](#用語集)


# セミナーの内容
## AWS Step Functionsとは

- 分散アプリケーション・マイクロサービスの全体を**[ステートマシン](#ステートマシン)**と呼ばれる仕組みで[オーケストレート](#用語集)できる。
- 定義したステートマシーンはAWSコンソールから**ワークフロー**という形式で可視化できる。
- ステートマシンの各ステップの実行履歴をログから追跡できる。(プロセスごとにログを管理できる)

## ステートマシン
複数のプロセスが連携し実現されている、入出力を用いて状態を遷移させるもの。

### 身近なステートマシンの例

自動販売機をステートマシンと考えると以下のプロセスに分割できる。
ステートマシンを構成する要素のことを**State**と呼ぶ

1. 入金待ち：入金まで待機、入金されたら金額を次のプロセスに伝える
1. ジュースの選択：ジュースの選択まで待機、選択されたらジュース・釣銭を次のプロセスに伝える
1. ジュース・釣銭の払い出し：受け取り口に払い出す。並列実行可能。

### 特徴

* Step Functionsで作成したステートマシンは、複数種類を同時実行可能。Step Functionsを使わない場合にはインフラで管理したり、アプリを作りこんだりする必要がある。
* ASL (Amazon States Language) と呼ばれるJSON形式の言語でワークフローを定義する。

### ステートマシンの実行方法

* Amazon CloudWatch Events: S3へのファイル保存やEC2の起動と言ったイベントを契機に実行
* Amazon API Gateway : あるAPIが呼ばれた際のバックエンドとして実行
* マネジメントコンソール : コンソールから手動で実行
* AWS CLI : コマンドラインから実行
* 各種[SDK](#用語集) :  LambdaやEC2に実装したアプリケーションから実行


###ステートマシンから呼び出し可能なAWSのサービス

* Lambda : 関数の実行
* DynamoDB : 既存アイテムの取得、新規アイテムの登録
* AWS Batch : ジョブの実行
* Amazon ECS : ECS/Fargate タスクの事項
* Amazon SNS : SNSトピックへのメッセージ送信
* Amazon SQS : SQSキューへのメッセージ送信
* AWS Glue : Glueジョブの実行
* SageMaker: トレーニングジョブｍトランスフォームジョブの起動
* [Activity](Activity) : 自身で定義したサービス

### Activity
サーバやコンテナ等に実装したアプリケーションからポーリングすることで、独自の処理を実行する仕組み。（Step Functionsから任意のアプリケーションを実行する）
アプリケーションはオンプレミスでもよい。
以下のようなフローで実行される。

1. 独自に実装したアプリケーションからStep Functions を定期ポーリングする（ここではまだ応答がない）
1. ステートマシンを実行する
1. Activity の State に達するとポーリングに対して応答が返却される
1. アプリケーションで処理を実行し、結果をステートマシンに通知する。

## データの入出力
データは32768文字以内のJSON形式で以下の通りやり取りされる。

1. InputPathやParametersというフィールドでデータを入力
1. Stateで処理
1. ResultPathというフィールドにデータを出力
1. OutputPathで出力するフィールドを最終的なOutputとして出力

## Stateの記述

[ASL](#特徴)で下記のようなフィールドを指定する。

* Comment : テキストでコメントを記載
* StartAt : 一番最初に実行するステート
* TimeoutSeconds : ステートマシン全体のタイムアウト時間
* Version : ASLのバージョン
* States : ステートマシンを構成するstateを指定。

本記事は試験対策用のものであるため、細かい記法については省略。

## 実行状況の確認

マネジメントコンソール画面からの確認方法だが、本記事は試験対策用のものであるため省略。

## 補足や料金詳細など
### 料金
* 状態遷移1,000回あたり$0.025(Tokyo Resion)
* 毎月4000回までは無料
* リトライは追加の状態遷移として計算

### 主な制限

* SLA : 99.9%
* ステートマシンの最大数 : 10,000/1アカウント
* 最大リクエストサイズ : 1MB

### その他類似のサービスとの使い分け
* Amazon Simple Que Service(SQS)
 * マネージドなキューイングサービス
 * ワークフロー自体の設定はできない
 * サービス間のメッセージの管理に、スケーラブルで信頼性の高いキューが必要な場合はSQS
 * 処理の追跡やサービス間のメッセージの受け渡しが必要であればStep Functions
* Amazon Simple WorkFlow Service(SWF)
 * プログラミングベースでワークフロー制御を行うサービス。
 * 複雑化するため、新規開発ではStep Functionsを使うことを検討し、満たせない要件があればSWFを検討
 * 結果を親に返す子プロセスを起動する場合はAmazon SWFを利用

### Step Functionsのユースケース

* 相互に依存するような複数の処理を組み合わせたい場合に最適
 * データプロセシング : 複数のデータストアを利用する分析や機械学習
 * eコマーズ : 在庫の追跡や注文処理
 * 動画処理 : サムネイルの生成、ビデオのエンコーディング
* ワークフロー作成にはSWFではなくAWS Step Functions の利用が推奨されている




# おわりに
初投稿でした。
内容の誤りや著作権的にまずい箇所などあればご指摘いただけますと幸甚です。
アウトプットすると頭が整理されるし、ノートのように見返すことができるのでいいですね。

# 用語集
[オーケストレート](https://cn.teldevice.co.jp/glossary/12168/)：システムやソフトウェア、サービスなどの構築、運用管理を自動化すること
[SDK](https://e-words.jp/w/SDK.html):あるシステムに対応したソフトウェアを開発するために必要なプログラムや文書などをひとまとめにしたパッケージ