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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
akkino/D-En
March 20, 2021
Technology
2.9k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
960
経験学習型キャリア探索法 ~ふりかえりで始めるキャリアパスの見つけ方~
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
ABEMA の Datadog × OTel 基盤、 中から見るか? 外から見るか?
tetsuya28
0
110
AI-DLCを活用した高品質・安全なAI駆動開発実践 / AI Driven Development with AI-DLC
yoshidashingo
0
160
LLMと共に進化するプロセスを目指して
ymatsuwitter
12
3.8k
製造業のクラウド活用最適解〜AI,DXを加速するデータ基盤の作り方〜
hamadakoji
0
420
Rubyで音を視る
ydah
1
280
Claude Code の Sandbox 機能を Anthropic Sandbox Runtime(srt) で試そう!/lets-play-anthropic-sandbox-runtime
tomoki10
1
400
Dario Amodi『Policy on the AI Exponential』を理解する
nagatsu
0
210
DevOps Agentで始めるAWS運用 〜フロンティアエージェントが変える運用の現場〜
nyankotaro
1
350
非エンジニアがClaudeと挑んだ「1ヶ月間プロダクト30本ノック」
askokc
0
160
AI Engineering Summit Tokyo 2026 AIの前に、やることがある 〜医療データ企業の4フェーズ〜
dtaniwaki
0
2.4k
新規事業を牽引する技術選定 〜フルスタックTypeScript開発の実践事例〜
nullnull
3
380
「速く作る」から「正しく作る」へ ─ 生成AI時代の開発フロー改革の ロードマップと実行 ─
starfish719
0
9.3k
Featured
See All Featured
Marketing to machines
jonoalderson
1
5.4k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
530
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
Building an army of robots
kneath
306
46k
KATA
mclloyd
PRO
35
15k
RailsConf 2023
tenderlove
30
1.5k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
840
Skip the Path - Find Your Career Trail
mkilby
1
140
For a Future-Friendly Web
brad_frost
183
10k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1.1k
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