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.2k
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
チームでDDDを実践するためのことはじめ
d_endo
0
480
経験学習型キャリア探索法 ~ふりかえりで始めるキャリアパスの見つけ方~
d_endo
2
1.1k
負荷試験の観点から見るGraphQLにおけるPHPのコードチューニング
d_endo
1
2.3k
AWS認定資格のススメ
d_endo
1
400
Laravel + Lighthouseで始める低コストなGraphQL入門
d_endo
4
3.6k
30分でOpenID Connect完全に理解したと言えるようになる勉強会
d_endo
45
27k
今だからこそ考える「科学技術の倫理学」
d_endo
2
1.2k
アホで乗り越える失敗との付き合い方
d_endo
2
1.3k
ゲームをしていたら半年で大規模サービスのエンジニアとして成長していた - 原動力のマネジメント方法 -
d_endo
2
670
Other Decks in Technology
See All in Technology
ギークの理想が7つ集まるエムスリーで夢を叶えよう - エムスリー株式会社
m3_engineering
1
260
データ分析基盤を作ってみよう~設計編~
nrinetcom
PRO
1
110
「我々はどこに向かっているのか」を問い続けるための仕組みづくり / Establishing a System for Continuous Inquiry about where we are
daitasu
0
170
ペパボのオブザーバビリティ研修2024 説明資料
kesompochy
0
1.1k
データベース研修 DB基礎【MIXI 24新卒技術研修】
mixi_engineers
PRO
0
210
コンテナ・K8s研修 - 前半 コンテナ基礎・ハンズオン【MIXI 24新卒技術研修】
mixi_engineers
PRO
0
170
How to Think Like a Performance Engineer
csswizardry
4
590
Datadog Cloud SIEMを使ってAWS環境の脅威を可視化した話/lifeistech-datadog-cloud-siem
gidajun
0
480
MySQLのロックの種類とその競合
yoku0825
6
1.6k
サービス開発を前に進めるために 新米リードエンジニアが 取り組んだこと / Steps Taken by a Novice Lead Engineer to Advance Service Development
nologyance
0
180
20240717_イケコパ代表Copilot_in_Teams会社でこう使ってます
ponponmikankan
2
430
LINE WORKSへ簡単通知!Incoming Webhookアプリの紹介
mmclsntr
0
110
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
46
7k
It's Worth the Effort
3n
181
27k
Building a Scalable Design System with Sketch
lauravandoore
458
32k
BBQ
matthewcrist
82
9k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
36
9.1k
Building Applications with DynamoDB
mza
89
5.8k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
19k
Into the Great Unknown - MozCon
thekraken
20
1.3k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
121
18k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
90
47k
GitHub's CSS Performance
jonrohan
1026
450k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
245
1.2M
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