Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
AWS Step Functionsのタスク入出力に秩序を与えよう
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Yasunobu Kotani (はくひめ)
October 22, 2024
Technology
460
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 (はくひめ)
VPCでもFloatingIPを使いたいんだ
y_kotani
1
180
社内勉強会で使える低コストVDI環境検討
y_kotani
1
240
AWS CDKで大量のパラメータストアを作りたい
y_kotani
1
950
Other Decks in Technology
See All in Technology
AI時代、データエンジニアが一番おもろい
genshun9
0
240
range over func 2年間の軌跡 Issue #56413 はGoのエコシステムをどう変えたか
ryujicre8ive
0
110
Redmine 7.0で私が開発した新機能の狙いと背景
vividtone
1
160
Sigmaユーザーのための有用リソース一挙公開 & Sigmaで使えるMCP #sigma_ucj /useful-resources-for-sigma-computing-users-and-mcps-with-sigma
shinyaa31
0
200
「重なり」は迎える側がつくる ― 人もAIエージェントも歓迎するプロダクトエンジニアリング ―
go0517go
PRO
0
280
2026_devsumi_ozono.pdf
o3
3
420
ASTを使って影響範囲を特定する
nealle
0
180
AI時代に顧客へ最速で価値を 届けるための試行錯誤 〜「AI × マネジメント」領域におけるmentoのケース〜
posterkeisuke
0
110
OpenTelemetry eBPF Instrumentationの舞台裏 / Behind the Scenes of OpenTelemetry eBPF Instrumentation
ymotongpoo
4
1.1k
消えない 動かない 効かない
yama3133
1
120
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
3
480
山手線を徒歩で一周してわかった、 位置情報アプリは「足」が最強のデバッガー
hinakko
0
110
Featured
See All Featured
The Language of Interfaces
destraynor
162
27k
Raft: Consensus for Rubyists
vanstee
141
7.7k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
930
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
630
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
BBQ
matthewcrist
89
10k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
420
Code Reviewing Like a Champion
maltzj
528
40k
Everyday Curiosity
cassininazir
0
310
A Tale of Four Properties
chriscoyier
163
24k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
560
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.