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
SendGridのEvent Webhookをサーバーレスアーキテクチャで構築した話
Search
Minoru Noda
August 31, 2023
Programming
1
800
SendGridのEvent Webhookをサーバーレスアーキテクチャで構築した話
Minoru Noda
August 31, 2023
Tweet
Share
Other Decks in Programming
See All in Programming
CSC307 Lecture 02
javiergs
PRO
1
780
Gemini for developers
meteatamel
0
100
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.8k
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
1
990
組織で育むオブザーバビリティ
ryota_hnk
0
180
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
660
登壇資料を作る時に意識していること #登壇資料_findy
konifar
4
1.7k
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
120
Raku Raku Notion 20260128
hareyakayuruyaka
0
370
Package Management Learnings from Homebrew
mikemcquaid
0
230
React Native × React Router v7 API通信の共通化で考えるべきこと
suguruooki
0
100
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
2k
Featured
See All Featured
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
920
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
330
Designing Powerful Visuals for Engaging Learning
tmiket
0
240
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
3.9k
Site-Speed That Sticks
csswizardry
13
1.1k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.9k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
750
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
190
Statistics for Hackers
jakevdp
799
230k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
30 Presentation Tips
portentint
PRO
1
220
Transcript
SendGridのEvent Webhookを サーバーレスアーキテクチャで 構築した話 私たちのサーバーレスアーキテクチャはこれだ!Lunch LT 株式会社JMDC
© JMDC Inc. 2 自己紹介
© JMDC Inc. 3 自己紹介 株式会社JMDC • プロダクト開発部 • バックエンドエンジニア
野田 実 / Minoru NODA
© JMDC Inc. 4 アジェンダ
© JMDC Inc. 5 アジェンダ 1. 背景 2. 初期実装 Lambda
Functionの実装 3. 問題 503 SlowDown 4. 解決 Kinesis Data Firehoseでバッファリング 5. まとめ
© JMDC Inc. 6 背景
© JMDC Inc. 7 背景 システム特徴 • Ruby on Rails製のローンチ後、7年経過したプロダクト
• 発行ID数は約540万ID(2023年3月末時点) • インフラはAWS • サービスがスケールした段階で改めて他のメールサービスを見てみると、コストや安定性の面で SendGridが有利になったの で移行することに決定 • メールの送信数・開封数・クリック数を取得していて、施策の効果検証の指標として活用 SendGridへのメールサービス移行プロジェクト発足
© JMDC Inc. 8 背景 アーキテクチャ検討 • 元々使っていたメールサービスではメールの送信数、 開封数、クリック数をAPIで取得していた •
日次更新 • SendGridでは送信、開封、クリックなどといった イベントごとにEvent Webhookを飛ばすことができる • 大量のリクエストが発生する • Railsで受けるのは現実的でない • SendGridにもAPIはあるがEvent Webhookでデータ蓄積が推奨 • S3に蓄積してAthenaで送信数、開封数、クリック数を 取得するアーキテクチャにする方向で進めていくことに決定 • データストアとしてDynamoDBも検討したが、 Readの頻度が少ない、コストの優位性もないので不採用 SendGridへのメールサービス移行プロジェクト発足
© JMDC Inc. 9 背景 アーキテクチャ検討 • 元々使っていたメールサービスではメールの送信数、 開封数、クリック数をAPIで取得していた •
日次更新 • SendGridでは送信、開封、クリックなどといった イベントごとにEvent Webhookを飛ばすことができる • 大量のリクエストが発生する • Railsで受けるのは現実的でない • SendGridにもAPIはあるがEvent Webhookでデータ蓄積が推奨 • S3に蓄積してAthenaで送信数、開封数、クリック数を 取得するアーキテクチャにする方向で進めていくことに決定 • データストアとしてDynamoDBも検討したが、 Readの頻度が少ない、コストの優位性もないので不採用 SendGridへメールサービスを移行 今日はこの部分の話をします
© JMDC Inc. 10 初期実装 Lambda Functionの実装
© JMDC Inc. 11 Lambda Functionの実装 • API GatewayはHTTPで作成 •
S3にWebhook用のバケットを作成し、蓄積 • 一意なファイル名を生成 • API Gatewayのendpointを知ってるユーザーな ら任意の文字列をPOSTしS3へ保存できてしま う • (実際はyear/month/dayでprefixを切る、gzへ 圧縮しているが省略) 素朴な実装でまずはやってみる
© JMDC Inc. 12 Lambda Functionの実装 • Signed Event WebhookというSendGridの認証の機構を利用
• Signed Event Webhook Requestsを有効にすると公開鍵が 発行される • Event Webhookに X-Twilio-Email-Event-Webhook-Signature, X-Twilio-Email-Event-Webhook-Timestampヘッダーがつく ようになる • それらと Event Webhookのbodyで認証を行う • この実装でしばらく運用 認証を考えた実装
© JMDC Inc. 13 問題 503 Slow Down
© JMDC Inc. 14 • S3へ保存するときに503 Slow Downが発生 • 原因:
prefix ごとのリクエストが多すぎる • > you can send 3,500 PUT/COPY/POST/DELETE or 5,500 GET/HEAD requests per second per prefix in an S3 bucket. https://repost.aws/knowledge-center/http-5xx-errors-s3 • 送信、開封、クリックごとに POST -> POST 数が莫大 問題発生 503 Slow Downの発生
© JMDC Inc. 15 解決 Kinesis Data Firehoseでバッファリング
© JMDC Inc. 16 Kinesis Data Firehoseでのバッファリング • 1リクエスト-> 1
S3 postが原因 • バッファリングで解消を図る • Lambdaから直接 S3へpost するのではなく Kinesis Data Firehose でバッファリング • S3へのpost回数を減らす • prefixをyear/month/day/hourへ • アーキテクチャ変更により503 Slow Downは 発生しなくなった • 1年近く運用しているが、安定 中間層を設け解決
© JMDC Inc. 17 まとめ
© JMDC Inc. 18 まとめ • サーバーレスアーキテクチャで大量のリクエストを安定して捌くことができた • 問題が発生してもサーバーレスのサービスを組み合わせることで解消できた
• S3でSlow Downが発生することなどチームに知見が溜まった • サービスを組み合わせて課題解決、楽しい! サーバーレスを用いることで高スループットなアーキテクチャが実現できた
© JMDC Inc. 19 We are hiring! JMDCでは一緒にプロダクト開発を推進いただける方を積極採用中です! 今日のお話しを聞いていただき、少しでもご興味をお持ちいただけましたら ぜひまずはカジュアルにお話しできればと思います。
▲カジュアル面談 エントリーページ
None