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
550
SendGridのEvent Webhookをサーバーレスアーキテクチャで構築した話
Minoru Noda
August 31, 2023
Tweet
Share
Other Decks in Programming
See All in Programming
私の考える初学者がBlazorできるまでの学習方法
tomokusaba
1
250
(非公開スライド追加)座談会 「Strict ConcurrencyとSwift 6が開く新時代: 私たちはどう生きるか?」
shiz
1
150
rails_girls_is_my_gate_to_join_the_ruby_commuinty
maimux2x
0
130
New Order in Cascade Sorting Order
mugi_uno
3
2.5k
複雑さに立ち向かうための ソフトウェア開発入門
shiz
3
620
Web技術を駆使してユーザーの画面を「録画」する
yukukotani
13
6.3k
デザインシステムとコンポーネント指向によるフロントエンド開発プロセスの革新 / Innovation in Frontend Development Processes through Design Systems and Component-Oriented Architecture
nrslib
7
5.1k
What we keep in mind when migrating from Serverless Framework to AWS CDK and AWS SAM
kasacchiful
1
130
Playwrightから始めるVisual Regression Testingのススメ by とっと
totto2727
2
1.8k
XStateでReactに秩序を与えたい
gizm000
0
440
Swift Concurrencyとレースコンディション
objectiveaudio
1
390
RAGの回答精度評価用のQAデータセットを生成AIに作らせた話
kurahara
0
220
Featured
See All Featured
Designing with Data
zakiwarfel
98
5k
Facilitating Awesome Meetings
lara
49
5.9k
Designing for Performance
lara
604
68k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
45
4.8k
The Language of Interfaces
destraynor
153
23k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
226
52k
Building an army of robots
kneath
302
42k
Creatively Recalculating Your Daily Design Routine
revolveconf
215
12k
Building Applications with DynamoDB
mza
89
5.9k
Gamification - CAS2011
davidbonilla
79
4.9k
Why Our Code Smells
bkeepers
PRO
334
56k
The Invisible Side of Design
smashingmag
295
50k
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