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.4k
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.1k
チームでDDDを実践するためのことはじめ
d_endo
0
660
経験学習型キャリア探索法 ~ふりかえりで始めるキャリアパスの見つけ方~
d_endo
2
1.2k
負荷試験の観点から見るGraphQLにおけるPHPのコードチューニング
d_endo
1
2.5k
AWS認定資格のススメ
d_endo
1
440
Laravel + Lighthouseで始める低コストなGraphQL入門
d_endo
4
3.9k
30分でOpenID Connect完全に理解したと言えるようになる勉強会
d_endo
47
28k
今だからこそ考える「科学技術の倫理学」
d_endo
2
1.3k
アホで乗り越える失敗との付き合い方
d_endo
2
1.4k
Other Decks in Technology
See All in Technology
Amazon Personalizeのレコメンドシステム構築、実際何するの?〜大体10分で具体的なイメージをつかむ〜
kniino
1
100
The Rise of LLMOps
asei
7
1.6k
サイバーセキュリティと認知バイアス:対策の隙を埋める心理学的アプローチ
shumei_ito
0
390
Evangelismo técnico: ¿qué, cómo y por qué?
trishagee
0
360
OCI 運用監視サービス 概要
oracle4engineer
PRO
0
4.8k
TypeScript、上達の瞬間
sadnessojisan
46
13k
組織成長を加速させるオンボーディングの取り組み
sudoakiy
2
180
第1回 国土交通省 データコンペ参加者向け勉強会③- Snowflake x estie編 -
estie
0
130
ノーコードデータ分析ツールで体験する時系列データ分析超入門
negi111111
0
410
Platform Engineering for Software Developers and Architects
syntasso
1
520
マルチプロダクトな開発組織で 「開発生産性」に向き合うために試みたこと / Improving Multi-Product Dev Productivity
sugamasao
1
310
Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間
oracle4engineer
PRO
28
13k
Featured
See All Featured
Faster Mobile Websites
deanohume
305
30k
Building an army of robots
kneath
302
43k
Embracing the Ebb and Flow
colly
84
4.5k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
720
4 Signs Your Business is Dying
shpigford
180
21k
Practical Orchestrator
shlominoach
186
10k
Being A Developer After 40
akosma
87
590k
The Cost Of JavaScript in 2023
addyosmani
45
6.8k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
890
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
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