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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
200
AWS CDKで大量のパラメータストアを作りたい
y_kotani
1
890
Other Decks in Technology
See All in Technology
40代で“やっとエンジニアになれた”――閉じた学びを開き、空の青さを知る / 20260628 Naoki Takahashi
shift_evolve
PRO
4
1.4k
データレイクの「見えない問題」を可視化する
sansantech
PRO
1
250
サイバーエージェントにおけるAI推進戦略と変革への取り組み
shotatsuge
0
640
攻撃者がいなくてもAIエージェントはインシデントを起こす
nomizone
0
170
AWS Summit Japan 2026の振り返りと2027へ向けて / AWS Summit Japan 2026 Recap and Prospects for 2027
kaminashi
1
140
BPaaSで進むAIオペレーションの現在地 AI実装が効く領域とスケーラビリティの選定と実装
kentarofujii
0
230
5分でわかるDuckDB Quack
chanyou0311
4
280
ご挨拶「10周年を迎える共創ラボのこれまでとこれから」
iotcomjpadmin
0
170
飲食店もAIで。レジ締めやハンディシステムをつくってる話 / Using AI for restaurant management
vtryo
0
210
toB プロダクトから見たWAF
tokai235
0
270
初めてのDatabricks勉強会
taka_aki
2
210
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
620
Featured
See All Featured
We Are The Robots
honzajavorek
0
260
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Side Projects
sachag
455
43k
RailsConf 2023
tenderlove
30
1.5k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
380
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
630
Designing for Performance
lara
611
70k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
210
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
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.