Open15

Step Functions 学習メモ

pirosikickpirosikick

AWS Step Functions とは - AWS Step Functions

2つのワークフロー

  • 標準
    • 一般的なやつ
    • 状態移行ごとの価格設定
    • 最大1年間実行可能
  • Express
    • ストリーミングデータ処理やIoT向け
    • 最大5分間実行
    • 実行回数、実行期間での課金

ユースケース

  • 分岐
  • エラー処理(Retry, Catch)
  • ヒューマンインザループ
    • コールバックとタスクトークンを使用して、ワークフローに人を挟んだりできる
  • 並列処理(Parallel)
  • 動的並列処理(Map)

サービス統合

  • 色々あるよ!
pirosikickpirosikick

標準ワークフローと Express ワークフロー - AWS Step Functions

  • 2つのワークフローの違いについて
  • 標準ワークフロー(Standard)
    • 長時間実行可能、耐久性高い、監査可能
    • 実行履歴は最大90日保存
    • at-most-onceモデル:タスクは複数回実行されない(Retryは除く)
      • 冪等ではないアクション向け
  • Expressワークフロー
    • 最大5分間の実行
    • at-least-onceモデル:タスクは冪等に調整するのが理想
    • ジョブ実行パターン、コールバックパターンはサポートしない

同期および非同期の Express ワークフロー - AWS Step Functions

  • 非同期:完了するまで待機しない
    • StartExecution
  • 同期:完了を待ってから結果を返す
    • API Gatewayから呼び出し可能
    • StartSyncExecution
    • VPCエンドポイントはサポートされていない

実行の保証 - AWS Step Functions

  • 標準
    • 一度だけワークフローを実行
    • 同じ名前のワークフローが実行中の場合、冪等応答(?)を返し、新しいワークフローは実行されない
    • 90日後にワークフローのデータが削除されると、名前を再利用できる
  • 非同期Express
    • 最高1回の実行
    • 複数回開始しようと複数のワークフローが同時に開始
    • ワークフローは最初から自動的に再開
  • 同期Express
    • 例外発生時、最初から再起動しない
pirosikickpirosikick

States - AWS Step Functions

  • 状態(States)はステートマシンの要素
  • 名前で参照される。ステートマシン全体の範囲で一意である必要がある
  • Nextフィールドで次の状態を指定する or Endフィールドで終了状態にする
  • 状態の種類によって、必要なフィールドが違う
  • 標準ワークフロー:各状態に関する情報はコンソールの「実行の詳細」でアクセス可能

Amazon ステートメント言語 - AWS Step Functions

pirosikickpirosikick

Parallel - AWS Step Functions

  • 並列実行
  • 入力は全ての並列タスクに対して同じものを、出力は全ての出力をまとめた配列になる

Map - AWS Step Functions

  • 入力は配列(またはItemsPathで入力の配列部分を指定)で、配列の要素ごとにIteratorフィールドに定義したタスクを実行
  • 出力は配列
pirosikickpirosikick

Step Functions の入出力処理 - AWS Step Functions

  • InputPath = 入力の一部をタスクに渡すときに使う
  • Parameters = タスクに渡すパラメーターの定義
    • パスを使って値を動的に設定する場合はキー名を.$で終わる必要がある
  • ResultSelector = 出力の一部を選択
    • Map, Task, Parallelで利用できる
  • ResultPath = 出力を入力とどのように組み合わせるか
    • 状態の出力 = 入力のコピー + 生成される結果
    • 入力に出力をマージするときにどこに差し込むか
    • "ResultPath": nullで出力の破棄
    • "ResultPath": "$"で入力を破棄(代わりに出力を次の入力とする)
    • 入力のフィールドをResultPathで上書きできる
  • OutputPath = 出力の一部を選択する
pirosikickpirosikick

Step Functions での実行 - AWS Step Functions

  • 実行の開始方法
    • StartExecution API, コンソール, CloudWatch Events, API Gateway経由, ネストされたワークフローから

タスク状態からワークフロー実行を開始する - AWS Step Functions

  • TaskのResourceを"arn:aws:states:::states:startExecution"にするとワークフローからワークフローを実行できる
  • 入力にAWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_IDという特別なパラメタを使うことで、ワークフローの紐付けが可能
    • "AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$": "$$.Execution.Id"
pirosikickpirosikick

Step Functions エラー処理 - AWS Step Functions

  • デフォルトでは、状態でエラーが報告されると、AWS Step Functions の実行全体が失敗
  • エラー名:States.がprefixで色々定義されている
    • States.Runtime = InputPath等のエラーで実行できなかった、States.TaskFailed = タスクの実行中のエラー
  • リトライについて(Retry)
  • フォールバック状態(Catch)

ErrorEquals、throwしたエラーの名前でも行けるっぽい?
例えば、throw new HogeErrorした場合、"ErrorEquals": ["HogeError"]で行けるのかな?

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/tutorial-handling-error-conditions.html
できそう。↑の例ではCustomErrorというのをthrowしてて、それをErrorEqualsで参照している

pirosikickpirosikick

チュートリアル

多いので面白そうなのをピックアップ

Lambda を使用してループを反復する - AWS Step Functions

  • ループを作る話

新しい実行としての続行 - AWS Step Functions

  • 一度の実行のクォータを超えないように、再実行して継続する話

人間による承諾プロジェクト例をデプロイする - AWS Step Functions

  • contextにtaskTokenが入ってくるので、それをAPI Gatewayに投げるURLを作ってメールで送る
  • API Gatewayに紐付いてるLambdaからsendTaskSuccessを実行
    • Statusに成功か失敗かの情報、メールアドレスが含まれている

Step Functions の X-Ray - AWS Step Functions

  • X-Rayを有効にして実行すると各状態でどのくらい時間がかかったかなど分かる