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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
akkino/D-En
March 20, 2021
Technology
2.9k
1
Share
Step Functions Expressで作るフルマネージドなサーバーレスバッチ
JAWS Days 2021
https://jawsdays2021.jaws-ug.jp/timetable/track-c-1500/
akkino/D-En
March 20, 2021
More Decks by akkino/D-En
See All by akkino/D-En
プロジェクト新規参入者のリードタイム短縮の観点から見る、品質の高いコードとアーキテクチャを保つメリット
d_endo
1
2.3k
チームでDDDを実践するためのことはじめ
d_endo
0
950
経験学習型キャリア探索法 ~ふりかえりで始めるキャリアパスの見つけ方~
d_endo
2
1.5k
負荷試験の観点から見るGraphQLにおけるPHPのコードチューニング
d_endo
1
3k
AWS認定資格のススメ
d_endo
1
530
Laravel + Lighthouseで始める低コストなGraphQL入門
d_endo
4
4.4k
30分でOpenID Connect完全に理解したと言えるようになる勉強会
d_endo
48
31k
今だからこそ考える「科学技術の倫理学」
d_endo
2
1.5k
アホで乗り越える失敗との付き合い方
d_endo
2
1.5k
Other Decks in Technology
See All in Technology
権限管理設計を完全に理解した
rsugi
1
190
Orchestration Development Workshopを半期実施して
lycorptech_jp
PRO
0
330
ソフトウェアサプライチェーン攻撃対策として今からサクッとできること
flatt_security
2
120
TypeScriptエンジニアのためのWASMランタイム入門:AssemblyScriptから理解するメモリの実態(ayano)
ayanoyuki
0
110
自作エディターをOSSにして分かった、一人に刺さる開発が世界を動かす理由
shinyasaita
1
280
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
2.6k
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
1.7k
最新技術を"今は選ばない"という技術選定
leveragestech
PRO
0
390
TSKaigi 2026 - 型プラグインシステムの実装に使われるテクニック
teamlab
PRO
1
270
GCASアップデート(202603-202605)
techniczna
0
280
TypeScriptとAngular Signal で実現する保守性の高いアプリケーション設計 - 3層アーキテクチャによる責務分離の実践(たつかわ) https://2026.tskaigi.org/talks/10
nealle
1
290
ルール・ロール・ツールを創る / Creating Rules, Roles and Tools
ks91
PRO
0
150
Featured
See All Featured
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
180
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
200
A designer walks into a library…
pauljervisheath
211
24k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
360
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.8k
Odyssey Design
rkendrick25
PRO
2
620
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
930
Discover your Explorer Soul
emna__ayadi
2
1.1k
Technical Leadership for Architectural Decision Making
baasie
3
370
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
920
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