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
Step Functions Expressで作るフルマネージドなサーバーレスバッチ
Search
akkino/D-En
March 20, 2021
Technology
1
2.6k
Step Functions Expressで作るフルマネージドなサーバーレスバッチ
JAWS Days 2021
https://jawsdays2021.jaws-ug.jp/timetable/track-c-1500/
akkino/D-En
March 20, 2021
Tweet
Share
More Decks by akkino/D-En
See All by akkino/D-En
プロジェクト新規参入者のリードタイム短縮の観点から見る、品質の高いコードとアーキテクチャを保つメリット
d_endo
1
1.7k
チームでDDDを実践するためのことはじめ
d_endo
0
820
経験学習型キャリア探索法 ~ふりかえりで始めるキャリアパスの見つけ方~
d_endo
2
1.3k
負荷試験の観点から見るGraphQLにおけるPHPのコードチューニング
d_endo
1
2.8k
AWS認定資格のススメ
d_endo
1
490
Laravel + Lighthouseで始める低コストなGraphQL入門
d_endo
4
4.1k
30分でOpenID Connect完全に理解したと言えるようになる勉強会
d_endo
48
30k
今だからこそ考える「科学技術の倫理学」
d_endo
2
1.4k
アホで乗り越える失敗との付き合い方
d_endo
2
1.4k
Other Decks in Technology
See All in Technology
ユーザー理解の爆速化とPdMの価値
kakehashi
PRO
1
110
AI時代の知識創造 ─GeminiとSECIモデルで読み解く “暗黙知”と創造の境界線
nyagasan
0
170
【CEDEC2025】ブランド力アップのためのコンテンツマーケティング~ゲーム会社における情報資産の活かし方~
cygames
PRO
0
150
クマ×共生 HACKATHON - 熊対策を『特別な行動」から「生活の一部」に -
pharaohkj
0
250
2025新卒研修・HTML/CSS #弁護士ドットコム
bengo4com
2
3k
「手を動かした者だけが世界を変える」ソフトウェア開発だけではない開発者人生
onishi
15
7.9k
AIに全任せしないコーディングとマネジメント思考
kikuchikakeru
0
290
Vision Language Modelと自動運転AIの最前線_20250730
yuyamaguchi
2
860
KCD Lima: eBee in Peru!
lizrice
0
110
20250728 MCP, A2A and Multi-Agents in the future
yoshidashingo
1
160
私とAWSとの関わりの歩み~意志あるところに道は開けるかも?~
nagisa53
1
140
【CEDEC2025】LLMを活用したゲーム開発支援と、生成AIの利活用を進める組織的な取り組み
cygames
PRO
1
2k
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Become a Pro
speakerdeck
PRO
29
5.4k
Balancing Empowerment & Direction
lara
1
510
Rails Girls Zürich Keynote
gr2m
95
14k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Designing Experiences People Love
moore
142
24k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
How to Think Like a Performance Engineer
csswizardry
25
1.8k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
182
54k
Building an army of robots
kneath
306
45k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Transcript
Step Functions Expressで作る フルマネージドなサーバーレスバッチ 遠藤 大輔
はじめに • コメント待ちしております! • jawsdays2021 • jawsug • jawsdays2021_C
遠藤 大輔 Daisuke Endo 株式会社ゆめみ • 2019年, 株式会社ゆめみに入社 • 趣味はドラム,
コンガ演奏 • Twitter: @DddEndow 好きなAWSのサービス:Step Functions
よくあるバッチ処理の めんどくささ
外部API バッチ サーバー ユーザーデータ 取得
外部API バッチ サーバー ユーザーデータ 取得 5〜10分毎 処理時間:数分 実装も簡単
外部API バッチ サーバー ユーザーデータ 取得 5〜10分毎 処理時間:数分 実装も簡単 l サーバー
l ミドルウェア l フレームワーク わざわざ用意するのめんどう →サクッと作りたい!
AWS Lambdaなら 全部解決する?
AWS Lambda 処理が複雑になると… • コードがスパゲッティ化 • 責務が大きくなりすぎる • 並列処理が辛い
そこで AWS Step Functions
AWS Step Functions • サーバーレスな関数オーケストレーター • イベント駆動型のワークフローを構築 • 並列処理, 例外処理,
再試行ロジックなどを管理可能 • Lambdaなど他のサービスと組み合わせ可能
並列処理 例外処理 条件分岐
でも、あまり現実的なアーキテクチャではなかった • 料金 • DBコネクション問題 • Lambdaのコールドスタート
それが
料金(2019/12) →Step Functions Express Workflows DBコネクション問題(2020/7) →RDS Proxy Lambdaのコールドスタート(2019/9) →1分から1秒に改善
AWSがサーバーレスバッチを 作れと言っている!!
というわけで
作りました
• 数万ユーザーの処理が30秒で完了 ユーザー毎に外部API実行 + DBに書き込み • コストも1万円/月以下 (Step Functions, Lambda)
(もう全部サーバーレスバッチでいいんじゃない?)
でも大変なことや辛いこともたくさんあった
でも大変なことや辛いこともたくさんあった 今回のメインコンテンツ
アジェンダ • 並列処理 • データベース接続 • CI/CD • ログ・X-Ray
並列処理
None
Step Functions
①対象ユーザーを一覧取得 ②外部APIへリクエスト ③データ処理&保存
①対象ユーザーを一覧取得 ②外部APIへリクエスト ③データ処理&保存 ユーザー単位で 並列処理
Mapステート • Step Functionsの状態の一つ • タスク単位で並列処理が可能 • パラメータ一個で同時実行数を制御可能 • キューやイベントの管理不要
並列処理 Mapステート
ユーザー単位で 並列処理
なんか二重になってない?
https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/amazon-states-language-map-state.html Mapステートの同時実行数 • 並列数の上限は無限 • 同時実行数は約40が上限 • →多重にすることで(たぶん)対策
これで一安心! X-Rayで性能を確認してみよう!
これで一安心! X-Rayで性能を確認してみよう! →LambdaのPendingが大量に…
Lambdaのクォータ • リクエスト数/秒の制限 • 同時実行数の10倍 • 一万ぐらいまではすぐにあげてくれる • それ以上は実績やデータが必要 •
GetFunction APIのリクエスト制限 • 100リクエスト/秒 • コールドスタートの際に実行 • デプロイパッケージの取得などに利用
Lambdaのクォータ • Mapの並列数を200ぐらいにしたらスムーズに • 急ぎでないなら40ぐらいでいいかも • Mapを多重にする意味あまりないんじゃ
まるっとうまく動くようになった!
まるっとうまく動くようになった! →ユーザー数増やしたらStep Functionsから エラー出るようになった…
Step Functionsのデータサイズ制限 • タスク, ステート, 入出力のデータサイズ • 約260KBの制限 • Mapステートの前後で制限オーバー
• Map全体で受け渡すデータ量で計算 • 300B/ユーザー x 1000人 = 300KB
Step Functionsのデータサイズ制限 • S3に一時保存することで回避 • 各ユーザーのKey(ID)だけ渡す • S3が強い読み込み整合性をサポート • 上書きPUT,
DELETEしても即座に反映 • 不要なパラメータはMapの最後に削除 ユーザーIDの配列 必要なデータのみ渡す ユーザーデータ
S3 APIの実行コスト削減と差分対策 • Lambda実行のたびにS3から取得すると高コスト • ハンドラー外で取得 しかし…
古いデータを参照してしまう問題 • 10分間隔であればLambdaの実行基盤がリセットされ ると予想 →実際には稀に実行基盤が残っていて古いデータを参照 • ハンドラー外にしたのが裏目に • 実行基盤がリセットされるタイミングは制御できない •
S3のオブジェクトのMetadataにバージョン情報を追加 してチェックすることで対策
データベース接続
None
RDS Proxy • DBコネクションのプーリング&共有が可能 • Lambdaがコネクションを使い潰す問題を解決 • IAM接続とID/Pass接続の二種類
コネクション数の節約 • Lambdaハンドラー外でDBコネクションを生成 • コネクションが切断した場合にLambdaの実行基盤を終了 するエラーハンドリングが必要 • RDS Proxy •
数百->数十程度に圧縮可能 両方を組み合わせることで 数千→数十コネクションまで節約
書き込み処理をまとめる • 1ユーザー毎に書き込み処理を行うのはNG • Kinesisで100人ずつにまとめてバルクアップデート • Step FunctionsやX-Rayで追跡できなくなるのが欠点
CI/CD
CodePipeline GitHub pull sam build sam package Template file Stack
Stack Stack CloudFormation
Stackを分割するメリット • 複数のグループ毎にリソースを展開できる • パラメータを書き換えるだけ • エンタープライズコネクションなどで効果を発揮 • 物理的・論理的にセキュア •
ログやメトリクスの管理がしやすい • どのリソースで障害が発生したかがすぐにわかる
テンプレートを使い回す ことでこんなことも
Stackを分割するデメリット • リソースが大量に生成される • Step Functions用のLambdaダッシュボードがなかった ら心が折れてた
ログ・X-Ray
ログ • Step Functionsの実行ログを収集可能 • Step Functions独自のステータスで出力 • ちょっとクセがある •
エラーの内容にLambdaやStateの情報が含まれない • デバッグが大変 • (アップデート待ってます)
X-Ray • Step Functionsに対応(2020/9) • ワークフロー全体を監視可能 • 並列処理も時系列で見れる
まとめ
まとめ • 並列処理 • データベース接続 • CI/CD • ログ・X-Ray
サーバーレスバッチという選択肢 • 開発に集中できる • リソースやミドルウェアを気にする必要が(あまり)ない • 高性能 • サーバーレスだからこそできる設計 •
低コスト • 必要な時に必要なだけ
リソースに縛られないバッチシステム →より効率良く価値を提供
宣伝 AWS Summitに登壇します セッションタイトル 「サーバー立てっぱなしはもったいない! サーバーレスのみで構築する 中頻度&短時間バッチ」
Thank you for watching! YUMEMI.inc, Daisuke Endo Twitter: @DddEndow