Slide 1

Slide 1 text

本当はこうすべきだった Step Functions JAWS-UG Okayama 2026/8/22

Slide 2

Slide 2 text

かんたんな自己紹介 もりやまたつろー Twitter/GitHub: @t4traw 株式会社ミライ工事でウェブエンジニアをやっています。 愛知県の豊橋市という所に住んでいます。 好きな言語はGoです。
 サウナとボードゲームと釣りが趣味です。

Slide 3

Slide 3 text

社外でのこういうトーク初挑戦です。
 頑張ります🥺

Slide 4

Slide 4 text

今日話すこと はじめに 実際に出会った課題と解決 コストとスピード Step Functions から Step Functions を呼びたい ローカル開発とデバッグが難しい まとめ

Slide 5

Slide 5 text

今日話すこと 対象: Step Functionsをこれから使おうと思っている方。 Step Functionsを使い始めた方。

Slide 6

Slide 6 text

はじめに

Slide 7

Slide 7 text

こんなモノ作っています なんやかんや

Slide 8

Slide 8 text

こんなモノ作っています

Slide 9

Slide 9 text

こんなモノ作っています 非同期処理にして欲しい xlsxとpdfを同時に出力したい 2000枚以上出力したい ざわ… もっと情報を書き込みたい 写真は高画質で欲しい ざわ… ざわ… 同時に複数出力をしたい ざわ… 写真と一緒にZipで出力したい 背景画像もつけたい

Slide 10

Slide 10 text

こんなモノ作っています

Slide 11

Slide 11 text

実際に出会った課題と解決

Slide 12

Slide 12 text

コストとスピード

Slide 13

Slide 13 text

コストとスピード ボトルネックの1つだった大量の画像処理を解決したい。 1枚の画像を(1関数==1ステップ)で処理し、 Mapステートで並列処理するファンアウト構成に。 1,000ステップあたり $0.025なので、
 例えば2000枚の写真台帳を月に10000回出力で
 StepFunctionsだけで$500に。 通常のMapステートだと並列数が最大40。 枚数の壁はクリアできましたが、この辺りが
 ユーザー数や枚数が増えてくると気になりだしました。

Slide 14

Slide 14 text

コストとスピード これで解決しようとした Expressワークフロー × Distributed Map

Slide 15

Slide 15 text

コストとスピード Expressワークフローとは 高パフォーマンス低コストで、標準タイプとは異なり、ワークフロー自体の実行回数、 実行時間、メモリ消費量に基づく料金体系のマシンタイプ。
 ステップ数が料金に直接関係ありません。

Slide 16

Slide 16 text

コストとスピード Expressワークフローとは 高パフォーマンス低コストで、標準タイプとは異なり、ワークフロー自体の実行回数、 実行時間、メモリ消費量に基づく料金体系のマシンタイプ。
 ステップ数が料金に直接関係ありません。

Slide 17

Slide 17 text

コストとスピード Distributed Mapとは マップのイテレーションを、独自の実行履歴を持つ個別の子ワークフロー実行として ファンアウトできるMapステート。

Slide 18

Slide 18 text

コストとスピード

Slide 19

Slide 19 text

コストとスピード 通常ワークフローの中でExpressワークフローが サクっと作れるのベンリー! Expressワークフローって事はこのステップ数で かかる料金、全部なくなって実行時間で課金にな るんじゃね? 画像の処理って全部で数十秒くらいだから、これ はコスト削減できるっしょ!

Slide 20

Slide 20 text

コストとスピード さっそく実際に構成を変えてみた結果 全然安くならない🥺
 むしろ高くなってる……?

Slide 21

Slide 21 text

コストとスピード Mapステート 画像処理 画像処理 画像処理

Slide 22

Slide 22 text

コストとスピード Mapステート 画像処理 画像処理 画像処理 これ全部Expressワークフローでステップ数関係なくなる?

Slide 23

Slide 23 text

コストとスピード Mapステート 画像処理 画像処理 実際はここだけExpressワークフローになる 画像処理

Slide 24

Slide 24 text

コストとスピード Mapステート 画像処理 画像処理 画像処理 親のステップ数変わってない……

Slide 25

Slide 25 text

コストとスピード 本当はこうすべきだった もっと単純にDistributed Map + ItemBatcher

Slide 26

Slide 26 text

コストとスピード ItemBatcherとは Mapステートの入力を、指定した件数ずつまとめて 1 イテレーションに渡す設定。 1 [ 2 { 3 "verdict": "true", 4 "statement_date": "6/11/2008", 5 "statement_source": "speech" 6 }, 7 { 8 "verdict": "false", 9 "statement_date": "6/7/2022", 10 "statement_source": "television" 11 }, 12 { 13 "verdict": "true", 14 "statement_date": "5/18/2016", 15 "statement_source": "news" 16 }, 17 ... 18 ] 1 { 2 "Items": [ 3 { 4 "verdict": "true", 5 "statement_date": "6/11/2008", 6 "statement_source": "speech" 7 }, 8 { 9 "verdict": "false", 10 "statement_date": "6/7/2022", 11 "statement_source": "television" 12 } 13 ] 14 }

Slide 27

Slide 27 text

コストとスピード 1ステップ1画像ではなく、1ステップ10画像くらいにしてステップ数を 削減。 Goなのでこの辺りは得意。スピードもそこそこ改善。 料金はステップ数以外の事も色々計測すると、なんやかんやで
 1ワークフロー約1/6から1/8くらいになりました。 画像部分のMapステートは約60秒から約10秒くらいに。

Slide 28

Slide 28 text

Step Functions から Step Functions を呼びたい

Slide 29

Slide 29 text

StepFunctions から StepFunctions を呼びたい 無事動くようになったワークフローを、 複数動かしてまとめてZipで欲しいという要望。

Slide 30

Slide 30 text

StepFunctions から StepFunctions を呼びたい これで解決しようとした .waitForTaskTokenというトークンを発行し、そのトークンを渡して返ってくるまで待つ という機能があります。 ちなみにこの待ってる間は無料です。 それを使って、子ワークフローを並列で起動することにしました。

Slide 31

Slide 31 text

StepFunctions から StepFunctions を呼びたい 本当はこうすべきだった もっとシンプルにStep Functionsの中で
 Step Functionsを呼び出せる方法(.sync)が あった……。 トークン受け渡しのコードが丸ごと不要 コストは変わらない。 子ワークフローで失敗した時に親ワークフ ローから辿っていけるので分かりやすい。

Slide 32

Slide 32 text

StepFunctions から StepFunctions を呼びたい Step Functionsは多くのAWSサービスの呼び出しが標準でできる。 呼び出すだけのLambdaは大体省略できる。 ワークフロースタジオは今できる事が分かりやすく書いてあるので、 もっと積極的に触ってみるべきでした。

Slide 33

Slide 33 text

ローカル開発とデバッグが難しい

Slide 34

Slide 34 text

ローカル開発とデバッグが難しい Lambda 1つだけだった頃 ※RIE: Lambdaをローカル環境でテスト実行するためのツール。AWS Runtime Interface Emulator。 ※air: Go言語用のコードを保存したら自動でホットリロードしてくれるツール。

Slide 35

Slide 35 text

ローカル開発とデバッグが難しい Step Functionsに移行後 Step Function Localは2024年にサポート終了したので試さず……。 色々探して触っているが、コレダ!というモノに出会えていない。 LocalStackなどのツールなどで頑張って環境作るより、
 開発専用環境作ってデプロイして確認した方が早いし確実という状態。 Goだと実質Lambdaランタイムがなく、コンテナイメージを使っていま す。それを含めて簡単にエミュレートする方法が無さそう。

Slide 36

Slide 36 text

ローカル開発とデバッグが難しい これに関しては「本当はこうすべきだった」が見つかっていません。 
 いい方法あったら懇親会で教えてください🙏

Slide 37

Slide 37 text

まとめ

Slide 38

Slide 38 text

Distributed MapとItemBatcherで比較的簡単にコスト削減とスピードアッ プができました。並列処理で同じ問題を抱えている方にはオススメです。 今回僕のパターンではExpressワークフローが勘違いでうまくハマりませ んでしたが、内部でサクっと作れるのは知見でした。 どっかでうまい使いどころに出会いたい。 並列数やパフォーマンスなどを計測しながら改善していくので、早めに ダッシュボードやコスト計測できる環境を作っておくのがオススメで す。 ワークフローを作ろうという時にワークフロースタジオを見て、
 今現在できる事はそこで確認しておいた方が良い。 そして、やりたい事はだいたい標準で機能が提供されている事が多い。

Slide 39

Slide 39 text

様々なサービスの組み合わせが動いているワークフローを 見られるのがめちゃ面白い。Step Functions最高です。

Slide 40

Slide 40 text

本当はこうすべきだった Step Functions おしまい。

Slide 41

Slide 41 text

ご清聴ありがとうございました🙇‍♂️