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
220
AWS CDKで大量のパラメータストアを作りたい
y_kotani
1
920
Other Decks in Technology
See All in Technology
AI開発に用いられるHPC技術について
gpuunite_official
0
270
内製AIチャットボット開発で学んだ Datadog Agent Observability活用術
mkdev10
0
130
dbt in Microsoft Fabric
ryomaru0825
0
230
アクセスキーが漏れた日にやるべきこと- 無効化の先にある本当の対応
kazzpapa3
0
300
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
20k
AI-DLC実践録_フルサイクル開発への挑戦
miyuc
0
410
Master Dataグループ紹介資料
sansan33
PRO
1
4.8k
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
5k
Introduction to Sansan Meishi Maker Development Engineer
sansan33
PRO
0
450
Head First モブプログラミング / Head First Mobprogramming
takaking22
10
12k
1.5時間を無駄にして学んだwsl2におけるaptとsnapの選択と仕組み
yosaka0123
0
420
サイボウズ 開発本部採用ピッチ / Cybozu Engineer Recruit
cybozuinsideout
PRO
12
85k
Featured
See All Featured
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Unsuck your backbone
ammeep
672
58k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
360
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Into the Great Unknown - MozCon
thekraken
41
2.7k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
450
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
790
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
310
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
260
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.