Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SendGridのEvent Webhookをサーバーレスアーキテクチャで構築した話

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

SendGridのEvent Webhookをサーバーレスアーキテクチャで構築した話

Avatar for Minoru Noda

Minoru Noda

August 31, 2023

Other Decks in Programming

Transcript

  1. © JMDC Inc. 5
 アジェンダ
 1. 背景
 2. 初期実装
 Lambda

    Functionの実装
 3. 問題
 503 SlowDown
 4. 解決
 Kinesis Data Firehoseでバッファリング
 5. まとめ

  2. © JMDC Inc. 7
 背景
 システム特徴
 • Ruby on Rails製のローンチ後、7年経過したプロダクト


    • 発行ID数は約540万ID(2023年3月末時点)
 • インフラはAWS
 
 • サービスがスケールした段階で改めて他のメールサービスを見てみると、コストや安定性の面で SendGridが有利になったの で移行することに決定 • メールの送信数・開封数・クリック数を取得していて、施策の効果検証の指標として活用 
 
 SendGridへのメールサービス移行プロジェクト発足 

  3. © JMDC Inc. 8
 背景
 アーキテクチャ検討
 • 元々使っていたメールサービスではメールの送信数、 開封数、クリック数をAPIで取得していた •

    日次更新 • SendGridでは送信、開封、クリックなどといった イベントごとにEvent Webhookを飛ばすことができる • 大量のリクエストが発生する • Railsで受けるのは現実的でない • SendGridにもAPIはあるがEvent Webhookでデータ蓄積が推奨 • S3に蓄積してAthenaで送信数、開封数、クリック数を 取得するアーキテクチャにする方向で進めていくことに決定 • データストアとしてDynamoDBも検討したが、 Readの頻度が少ない、コストの優位性もないので不採用 
 
 
 SendGridへのメールサービス移行プロジェクト発足 

  4. © JMDC Inc. 9
 背景
 アーキテクチャ検討
 • 元々使っていたメールサービスではメールの送信数、 開封数、クリック数をAPIで取得していた •

    日次更新
 • SendGridでは送信、開封、クリックなどといった イベントごとにEvent Webhookを飛ばすことができる • 大量のリクエストが発生する • Railsで受けるのは現実的でない • SendGridにもAPIはあるがEvent Webhookでデータ蓄積が推奨 • S3に蓄積してAthenaで送信数、開封数、クリック数を 取得するアーキテクチャにする方向で進めていくことに決定 • データストアとしてDynamoDBも検討したが、 Readの頻度が少ない、コストの優位性もないので不採用 
 
 
 SendGridへメールサービスを移行
 今日はこの部分の話をします

  5. © JMDC Inc. 11
 Lambda Functionの実装
 • API GatewayはHTTPで作成
 •

    S3にWebhook用のバケットを作成し、蓄積
 • 一意なファイル名を生成
 
 • API Gatewayのendpointを知ってるユーザーな ら任意の文字列をPOSTしS3へ保存できてしま う • (実際はyear/month/dayでprefixを切る、gzへ 圧縮しているが省略) 
 
 
 
 素朴な実装でまずはやってみる 

  6. © 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で認証を行う
 
 • この実装でしばらく運用
 
 
 認証を考えた実装

  7. © 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の発生

  8. © 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年近く運用しているが、安定
 中間層を設け解決

  9. © JMDC Inc. 18
 まとめ
 • サーバーレスアーキテクチャで大量のリクエストを安定して捌くことができた 
 • 問題が発生してもサーバーレスのサービスを組み合わせることで解消できた

    
 • S3でSlow Downが発生することなどチームに知見が溜まった 
 
 • サービスを組み合わせて課題解決、楽しい! 
 
 サーバーレスを用いることで高スループットなアーキテクチャが実現できた