Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AWS Step Functionsのタスク入出力に秩序を与えよう
Search
Yasunobu Kotani (はくひめ)
October 22, 2024
Technology
450
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
AWS Step Functionsのタスク入出力に秩序を与えよう
2024/10/22 JAWS-UG東京 ランチタイムLT会 #16 登壇資料
https://jawsug.connpass.com/event/331319/
Yasunobu Kotani (はくひめ)
October 22, 2024
More Decks by Yasunobu Kotani (はくひめ)
See All by Yasunobu Kotani (はくひめ)
社内勉強会で使える低コストVDI環境検討
y_kotani
1
210
AWS CDKで大量のパラメータストアを作りたい
y_kotani
1
900
Other Decks in Technology
See All in Technology
20260608_Codexの可能性_ノンプログラマー向け_大城追記
doradora09
PRO
0
720
Master Dataグループ紹介資料
sansan33
PRO
1
4.8k
20260724 情シスAI #1 「全従業員をAIネイティブにする」ために情シスがやっていること(公開版)
frtckty
0
160
QAタスクをスキル化したいときに考えること
aomoriringo
0
140
Data Hubグループ 紹介資料
sansan33
PRO
0
3.1k
数値で見る Microsoft MVP 〜Spec Kit と GitHub Copilot Agent で作るデータ可視化ダッシュボード〜
yutakaosada
0
180
AI Agent を本番環境へ―― Microsoft Foundry × Azure Serverless で作る Enterprise-Ready な基盤
shibayan
PRO
1
1k
AI駆動開発は個人技からチーム戦へ:組織でAIを使いこなすための実践設計
moongift
PRO
0
390
オートマトンと字句解析でRoslynを読む
tomokusaba
0
130
AI時代の強いチームの作り方
yuukiyo
23
13k
DevOps Agentで運用判断をチーム資産にする~Agent InstructionsとAgent Skillを継続的に育てる~
fujioka6789
0
180
AIがコードを書く時代、人間は何を保証するのか———馬場さんと考える、開発者に求められる新しい責任と価値 - TECH PLAY
netmarkjp
0
1k
Featured
See All Featured
Paper Plane (Part 1)
katiecoart
PRO
1
10k
Why Our Code Smells
bkeepers
PRO
340
58k
How to Talk to Developers About Accessibility
jct
2
460
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.1k
Odyssey Design
rkendrick25
PRO
2
740
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
410
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Facilitating Awesome Meetings
lara
57
7k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
A designer walks into a library…
pauljervisheath
211
24k
Transcript
1 © BIP Systems Corporation 2024 2024年10月22日 ビップシステムズ株式会社 小谷 泰庸
AWS Step Functionsのタスク入出力に秩序を与えよう JAWS-UG東京 ランチタイムLT会 #16
2 © BIP Systems Corporation 2024 自己紹介 ▌名前 小谷 泰庸
(Yasunobu Kotani) ▌所属 ビップシステムズ株式会社 ▌仕事 AWS基盤設計・構築 クラウド技術推進 ▌好きなAWSサービス ⚫ Lambda ⚫ Step Functions ▌X ⚫ @haku__hime ▌ うちの子紹介 羽空(はく) 姫叶(ひめか)
3 © BIP Systems Corporation 2024 本日のテーマ Step Functionsのタスク入出力に 秩序を与えることで
保守しやすいステートマシンを作ろう ※保守しやすい=可読性、一貫性、柔軟性が高い
4 © BIP Systems Corporation 2024 Step Functionsとは Blackbeltより抜粋 https://pages.awscloud.com/rs/112-TZM-766/images/20190522_AWS-Blackbelt_StepFunctions.pdf
様々な処理を組み合わせて、ワークフローを作るためのサービス
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の出力とするかを 指定する。 ✓ タスクの入力に必要なデータを整理 ✓ タスクからの出力データを利用しやすい形に整理
6 © BIP Systems Corporation 2024 保守しやすい入出力 本日のテーマに戻ります。 どのように秩序を与えれば、保守しやすいステートマシンになるのか。
7 © BIP Systems Corporation 2024 秩序ある入出力 保守しやすい入出力を作るために・・・ タスク1つ1つではなく、 ステートマシン全体で1つのJSONを扱う
ステートマシン全体で扱うJSONを、 「ステートテーブル」と勝手に名付けます。 ※この資料上のみでの命名です
8 © BIP Systems Corporation 2024 秩序ある入出力 ▌ ステートテーブルとタスクの間の入出力 を考える
タスク1 タスク2 受け渡しデータ ステート テーブル タスク3 受け渡しデータ タスク1 タスク2 タスク3 受け渡しデータ ▌ タスクとタスクの間の入出力を考える
9 © BIP Systems Corporation 2024 ▌ タスクとタスクの間の入出力を考える 秩序ある入出力 ▌
ステートテーブルとタスクの間の入出力 を考える タスク1 タスク2 タスク1結果 ステート テーブル タスク3 タスク2結果 タスク1 タスク2 タスク3 例えば、タスク3の入力にタスク1の結果が必要となった場合 タスク3結果 タスク1結果 タスク2結果 タスク3結果
10 © BIP Systems Corporation 2024 ▌ タスクとタスクの間の入出力を考える 秩序ある入出力 ▌
ステートテーブルとタスクの間の入出力 を考える タスク1 タスク2 タスク1結果 ステート テーブル タスク3 タスク1+2結果 タスク1 タスク2 タスク3 タスク1結果 タスク2結果 タスク3結果 タスク1の結果はステートテーブルに存在するた め、タスク3の入力を変えるだけで良い タスク3結果 タスク3の入力を変えるために、 タスク2の出力を変える必要がある
11 © BIP Systems Corporation 2024 ▌ タスクとタスクの間の入出力を考える 秩序ある入出力 ▌
ステートテーブルとタスクの間の入出力 を考える タスク1 タスク2 受け渡しデータ ステート テーブル タスク3 受け渡しデータ タスク1 タスク2 タスク3 ① タスク同士の依存を小さくできる ② ステートテーブルで全体の入出力が見える ⇒読みやすいステートマシンになる ① タスク同士の依存が大きい ② 行き当たりばったりの入出力設計になりがち ⇒読みづらいステートマシンになる 受け渡しデータ
12 © BIP Systems Corporation 2024 実装例 ここからは 実装例をベースに説明します
13 © BIP Systems Corporation 2024 実装例 ▌要件 ⚫ S3に保存されたログに記録されている処理時間を、日毎にグラフ化する。
⚫ グラフは画像ファイルとしてS3に出力し、出力時にメールで通知する。 ⚫ 障害等により処理が滞留することを考慮し、処理起動日前日までの未作成日分を全て 作成すること。 Step Functions EventBridge SNS DynamoDB ログ プロットデータ 処理時間 グラフ画像 日次起動 処理日付管理 グラフ作成 メール送信
14 © BIP Systems Corporation 2024 ステートマシン # タスク 処理内容
① パラメータ初期化 ステートテーブルの枠を作る。 ② 終了日取得 Lambda関数により現在日付の前日を取得し、 処理終了日付とする。 ③ 最終処理日取得 DynamoDBから最終処理日付(既に処理が完了 している最新日付)を取得する。 ④ 処理日付加算 最終処理日付に1日加算する。 ⑤ 終了判定 最終処理日付と処理終了日付を比較し、終了 判定を行う。 ⑥ プロットデータ抽出 S3に保存されたログから処理時間を抽出し、 プロットデータをS3に保存する。 ⑦ グラフ作成 S3に保存されたプロットデータからグラフを 作成し、グラフ画像をS3に保存する。 ⑧ 最終処理日更新 最終処理日付をDynamoDBに保存する。 ⑨ メール通知 グラフ画像保存先を本文に記載した通知を SNSへ送る。 タスク処理説明 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨
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日の秒数) 処理中の日付 プロットデータ抽出結果 グラフ作成結果 管理すべきデータを カテゴライズして秩序を保つ パラメータ情報 状態情報 処理結果情報 ステートマシンの処理特性に応じてカテゴリを考えましょう
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" } ステートマシンの入力 タスク入出力設定 ステートテーブルの枠を作る。 ※赤字:更新、緑字:参照
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関数により現在日付の前日を取得し、処理終了日付とする。 タスク入出力設定 ※赤字:更新、緑字:参照
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から最終処理日付(既に処理が完了している最新日付)を取得する。 ※赤字:更新、緑字:参照
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日加算し、これから処理する日付(現在処理日付)を決定する。 ※赤字:更新、緑字:参照
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に保存する。 ※赤字:更新、緑字:参照
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に保存する。 ※赤字:更新、緑字:参照
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に保存する。 ※赤字:更新、緑字:参照
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へ送る。 ※赤字:更新、緑字:参照
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日加算する。 ※赤字:更新、緑字:参照
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": {} } ステートテーブル 現在処理日付と処理終了日付を比較し、終了判定を行う。 ※赤字:更新、緑字:参照
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" } } } ステートテーブル 入出力
27 © BIP Systems Corporation 2024 まとめ タスク入出力を考える際は、ステートテーブルを作ろう。 そうすることで、タスク入出力の秩序が保たれ、ステートマシンの保守 性が高められるはず。
一方で、 タスクの入出力サイズは256KBまで。 ステートテーブルがこのサイズを超えないように設計する必要あり。
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/ 明日です
技術で情報社会を追求する企業です。 デジタル革命の真っ只中にある日本 ビップシステムズは豊富な実績、ノウハウと先進的な技術で お客様を強力にサポートします Thanks for listening.