Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWS Step Functionsのタスク入出力に秩序を与えよう

AWS Step Functionsのタスク入出力に秩序を与えよう

2024/10/22 JAWS-UG東京 ランチタイムLT会 #16 登壇資料
https://jawsug.connpass.com/event/331319/

More Decks by Yasunobu Kotani (はくひめ)

Other Decks in Technology

Transcript

  1. 1 © BIP Systems Corporation 2024 2024年10月22日 ビップシステムズ株式会社 小谷 泰庸

    AWS Step Functionsのタスク入出力に秩序を与えよう JAWS-UG東京 ランチタイムLT会 #16
  2. 2 © BIP Systems Corporation 2024 自己紹介 ▌名前 小谷 泰庸

    (Yasunobu Kotani) ▌所属 ビップシステムズ株式会社 ▌仕事 AWS基盤設計・構築 クラウド技術推進 ▌好きなAWSサービス ⚫ Lambda ⚫ Step Functions ▌X ⚫ @haku__hime ▌ うちの子紹介 羽空(はく) 姫叶(ひめか)
  3. 3 © BIP Systems Corporation 2024 本日のテーマ Step Functionsのタスク入出力に 秩序を与えることで

    保守しやすいステートマシンを作ろう ※保守しやすい=可読性、一貫性、柔軟性が高い
  4. 5 © BIP Systems Corporation 2024 Step Functionsの入出力フィルター https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/concepts-input-output-filtering.html フィルター

    説明 InputPath State inputのどの部分をTask stateの入 力とするかを指定する。 Parameters Taskに渡すJSONを作成する。 ResultSelector タスク結果の一部を使用して、タスク 結果を再構成する。 ResultPath State inputにタスク結果をマージする、 又は置き換える。 OutputPath どの部分をTask stateの出力とするかを 指定する。 ✓ タスクの入力に必要なデータを整理 ✓ タスクからの出力データを利用しやすい形に整理
  5. 7 © BIP Systems Corporation 2024 秩序ある入出力 保守しやすい入出力を作るために・・・ タスク1つ1つではなく、 ステートマシン全体で1つのJSONを扱う

    ステートマシン全体で扱うJSONを、 「ステートテーブル」と勝手に名付けます。 ※この資料上のみでの命名です
  6. 8 © BIP Systems Corporation 2024 秩序ある入出力 ▌ ステートテーブルとタスクの間の入出力 を考える

    タスク1 タスク2 受け渡しデータ ステート テーブル タスク3 受け渡しデータ タスク1 タスク2 タスク3 受け渡しデータ ▌ タスクとタスクの間の入出力を考える
  7. 9 © BIP Systems Corporation 2024 ▌ タスクとタスクの間の入出力を考える 秩序ある入出力 ▌

    ステートテーブルとタスクの間の入出力 を考える タスク1 タスク2 タスク1結果 ステート テーブル タスク3 タスク2結果 タスク1 タスク2 タスク3 例えば、タスク3の入力にタスク1の結果が必要となった場合 タスク3結果 タスク1結果 タスク2結果 タスク3結果
  8. 10 © BIP Systems Corporation 2024 ▌ タスクとタスクの間の入出力を考える 秩序ある入出力 ▌

    ステートテーブルとタスクの間の入出力 を考える タスク1 タスク2 タスク1結果 ステート テーブル タスク3 タスク1+2結果 タスク1 タスク2 タスク3 タスク1結果 タスク2結果 タスク3結果 タスク1の結果はステートテーブルに存在するた め、タスク3の入力を変えるだけで良い タスク3結果 タスク3の入力を変えるために、 タスク2の出力を変える必要がある
  9. 11 © BIP Systems Corporation 2024 ▌ タスクとタスクの間の入出力を考える 秩序ある入出力 ▌

    ステートテーブルとタスクの間の入出力 を考える タスク1 タスク2 受け渡しデータ ステート テーブル タスク3 受け渡しデータ タスク1 タスク2 タスク3 ① タスク同士の依存を小さくできる ② ステートテーブルで全体の入出力が見える ⇒読みやすいステートマシンになる ① タスク同士の依存が大きい ② 行き当たりばったりの入出力設計になりがち ⇒読みづらいステートマシンになる 受け渡しデータ
  10. 13 © BIP Systems Corporation 2024 実装例 ▌要件 ⚫ S3に保存されたログに記録されている処理時間を、日毎にグラフ化する。

    ⚫ グラフは画像ファイルとしてS3に出力し、出力時にメールで通知する。 ⚫ 障害等により処理が滞留することを考慮し、処理起動日前日までの未作成日分を全て 作成すること。 Step Functions EventBridge SNS DynamoDB ログ プロットデータ 処理時間 グラフ画像 日次起動 処理日付管理 グラフ作成 メール送信
  11. 14 © BIP Systems Corporation 2024 ステートマシン # タスク 処理内容

    ① パラメータ初期化 ステートテーブルの枠を作る。 ② 終了日取得 Lambda関数により現在日付の前日を取得し、 処理終了日付とする。 ③ 最終処理日取得 DynamoDBから最終処理日付(既に処理が完了 している最新日付)を取得する。 ④ 処理日付加算 最終処理日付に1日加算する。 ⑤ 終了判定 最終処理日付と処理終了日付を比較し、終了 判定を行う。 ⑥ プロットデータ抽出 S3に保存されたログから処理時間を抽出し、 プロットデータをS3に保存する。 ⑦ グラフ作成 S3に保存されたプロットデータからグラフを 作成し、グラフ画像をS3に保存する。 ⑧ 最終処理日更新 最終処理日付をDynamoDBに保存する。 ⑨ メール通知 グラフ画像保存先を本文に記載した通知を SNSへ送る。 タスク処理説明 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨
  12. 15 © BIP Systems Corporation 2024 ステートテーブル { "Parameter": {

    "Bucket": "jaws-demo-hakuhime", "Prefix": "processlog”, "StopDate": { "String": "2024/06/25", "Epoch": 1719241200 }, "ProcessingStep": 86400 }, "Status": { "CurrentProcessingTime": 1719154800 }, "Result": { "PlotDataObject": { "Bucket": "jaws-demo-hakuhime", "Key": "plotdata/20240624.plot" }, "GraphImageObject": { "Bucket": "jaws-demo-hakuhime", "Key": "graph/20240624.png" } } } ログが保存されているS3情報 処理終了日付 (ステートマシン起動日の前日) 処理単位(1日の秒数) 処理中の日付 プロットデータ抽出結果 グラフ作成結果 管理すべきデータを カテゴライズして秩序を保つ パラメータ情報 状態情報 処理結果情報 ステートマシンの処理特性に応じてカテゴリを考えましょう
  13. 16 © BIP Systems Corporation 2024 パラメータ初期化 { "Parameter": {

    "Bucket": "jaws-demo-hakuhime", "Prefix": "processlog", "StopDate": {}, "ProcessingStep": 86400 }, "Status": { "CurrentProcessingTime": 0 }, "Result": {} } ステートテーブル { "Bucket": "jaws-demo-hakuhime", "Prefix": "processlog" } ステートマシンの入力 タスク入出力設定 ステートテーブルの枠を作る。 ※赤字:更新、緑字:参照
  14. 17 © BIP Systems Corporation 2024 終了日取得 { "Parameter": {

    "Bucket": "jaws-demo-hakuhime", "Prefix": "processlog", "StopDate": { "String": "2024/06/25", "Epoch": 1719241200 }, "ProcessingStep": 86400 }, "Status": { "CurrentProcessingTime": 0 }, "Result": {} } ステートテーブル Lambda関数により現在日付の前日を取得し、処理終了日付とする。 タスク入出力設定 ※赤字:更新、緑字:参照
  15. 18 © BIP Systems Corporation 2024 タスク入出力設定 最終処理日取得 { "Parameter":

    { "Bucket": "jaws-demo-hakuhime", "Prefix": "processlog", "StopDate": { "String": "2024/06/25", "Epoch": 1719241200 }, "ProcessingStep": 86400 }, "Status": { "CurrentProcessingTime": 1719154800 }, "Result": {} } ステートテーブル DynamoDBから最終処理日付(既に処理が完了している最新日付)を取得する。 ※赤字:更新、緑字:参照
  16. 19 © BIP Systems Corporation 2024 タスク入出力設定 処理日付加算 { "Parameter":

    { "Bucket": "jaws-demo-hakuhime", "Prefix": "processlog", "StopDate": { "String": "2024/06/25", "Epoch": 1719241200 }, "ProcessingStep": 86400 }, "Status": { "CurrentProcessingTime": 1719241200 }, "Result": {} } ステートテーブル 最終処理日付に1日加算し、これから処理する日付(現在処理日付)を決定する。 ※赤字:更新、緑字:参照
  17. 20 © BIP Systems Corporation 2024 タスク入出力設定 プロットデータ抽出 { "Parameter":

    { "Bucket": "jaws-demo-hakuhime", "Prefix": "processlog", "StopDate": { "String": "2024/06/25", "Epoch": 1719241200 }, "ProcessingStep": 86400 }, "Status": { "CurrentProcessingTime": 1719241200 }, "Result": { "PlotDataObject": { "Bucket": "jaws-demo-hakuhime", "Key": "plotdata/20240624.plot" } } } ステートテーブル S3に保存されたログから処理時間を抽出し、プロットデータをS3に保存する。 ※赤字:更新、緑字:参照
  18. 21 © BIP Systems Corporation 2024 タスク入出力設定 グラフ作成 { "Parameter":

    { "Bucket": "jaws-demo-hakuhime", "Prefix": "processlog", "StopDate": { "String": "2024/06/25", "Epoch": 1719241200 }, "ProcessingStep": 86400 }, "Status": { "CurrentProcessingTime": 1719241200 }, "Result": { "PlotDataObject": { "Bucket": "jaws-demo-hakuhime", "Key": "plotdata/20240624.plot" }, "GraphImageObject": { "Bucket": "jaws-demo-hakuhime", "Key": "graph/20240624.png" } } } ステートテーブル S3に保存されたプロットデータからグラフを作成し、グラフ画像をS3に保存する。 ※赤字:更新、緑字:参照
  19. 22 © BIP Systems Corporation 2024 タスク入出力設定 最終処理日更新 { "Parameter":

    { "Bucket": "jaws-demo-hakuhime", "Prefix": "processlog", "StopDate": { "String": "2024/06/25", "Epoch": 1719241200 }, "ProcessingStep": 86400 }, "Status": { "CurrentProcessingTime": 1719241200 }, "Result": { "PlotDataObject": { "Bucket": "jaws-demo-hakuhime", "Key": "plotdata/20240624.plot" }, "GraphImageObject": { "Bucket": "jaws-demo-hakuhime", "Key": "graph/20240624.png" } } } ステートテーブル 現在処理日付を最終処理日付としてDynamoDBに保存する。 ※赤字:更新、緑字:参照
  20. 23 © BIP Systems Corporation 2024 タスク入出力設定 メール通知 { "Parameter":

    { "Bucket": "jaws-demo-hakuhime", "Prefix": "processlog", "StopDate": { "String": "2024/06/25", "Epoch": 1719241200 }, "ProcessingStep": 86400 }, "Status": { "CurrentProcessingTime": 1719241200 }, "Result": { "PlotDataObject": { "Bucket": "jaws-demo-hakuhime", "Key": "plotdata/20240624.plot" }, "GraphImageObject": { "Bucket": "jaws-demo-hakuhime", "Key": "graph/20240624.png" } } } ステートテーブル グラフ画像保存先を本文に記載した通知をSNSへ送る。 ※赤字:更新、緑字:参照
  21. 24 © BIP Systems Corporation 2024 タスク入出力設定 処理日付加算(1日分処理終了後) { "Parameter":

    { "Bucket": "jaws-demo-hakuhime", "Prefix": "processlog", "StopDate": { "String": "2024/06/25", "Epoch": 1719241200 }, "ProcessingStep": 86400 }, "Status": { "CurrentProcessingTime": 1719327600 }, "Result": { "PlotDataObject": { "Bucket": "jaws-demo-hakuhime", "Key": "plotdata/20240624.plot" }, "GraphImageObject": { "Bucket": "jaws-demo-hakuhime", "Key": "graph/20240624.png" } } } ステートテーブル 現在処理日付に1日加算する。 ※赤字:更新、緑字:参照
  22. 25 © BIP Systems Corporation 2024 タスク入出力設定 終了判定 { "Parameter":

    { "Bucket": "jaws-demo-hakuhime", "Prefix": "processlog", "StopDate": { "String": "2024/06/25", "Epoch": 1719241200 }, "ProcessingStep": 86400 }, "Status": { "CurrentProcessingTime": 1719241200 }, "Result": {} } ステートテーブル 現在処理日付と処理終了日付を比較し、終了判定を行う。 ※赤字:更新、緑字:参照
  23. 26 © BIP Systems Corporation 2024 タスクとステートテーブル ステートテーブルという概念を使ってタスクの入出力を行う { "Parameter":

    { "Bucket": "jaws-demo-hakuhime", "Prefix": "processlog", "StopDate": { "String": "2024/06/25", "Epoch": 1719241200 }, "ProcessingStep": 86400 }, "Status": { "CurrentProcessingTime": 1719327600 }, "Result": { "PlotDataObject": { "Bucket": "jaws-demo-hakuhime", "Key": "plotdata/20240624.plot" }, "GraphImageObject": { "Bucket": "jaws-demo-hakuhime", "Key": "graph/20240624.png" } } } ステートテーブル 入出力
  24. 28 © BIP Systems Corporation 2024 告知 JAWS-UG CDK支部 #17

    ~大規模利用の神髄:限界突破の秘訣~ 2024年10月23日 19:30~21:00 AWS CDKで大量のパラメータストアを作りたい 登壇: 小谷 泰庸 https://jawsug-cdk.connpass.com/event/331430/ 明日です