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

サーバーレスアーキテクチャにおける AWS と SaaS を活用しての スパイクアクセス対策

Kazuki Miura
September 28, 2023

サーバーレスアーキテクチャにおける AWS と SaaS を活用しての スパイクアクセス対策

#jawsug #jawsug_sapporo

#serverdays2023 の再演です

Kazuki Miura

September 28, 2023
Tweet

More Decks by Kazuki Miura

Other Decks in Technology

Transcript

  1. サーバーレスアーキテクチャにおける
    AWS と SaaS を活用しての
    スパイクアクセス対策
    三浦一樹
    北海道テレビ放送株式会社
    2023/09/28

    View full-size slide

  2. @shimagaji
    無念の欠席

    View full-size slide

  3. 代打登壇!

    View full-size slide

  4. 資料がない!

    View full-size slide

  5. 先週の使い回し

    View full-size slide

  6. serverless days のほぼ再演です

    View full-size slide

  7. 自己紹介
    三浦一樹
    北海道テレビ放送株式会社
    Sonu Kim
    株式会社Serverless Operations

    View full-size slide

  8. 放送に関することは
    いっさい仕事でやってません!

    View full-size slide

  9. サービス紹介

    View full-size slide

  10. 2012年4月 サービス開始
    前身のサービス
    PaaS を採用
    フロントの改修が大変
    スパイクに耐えられない
    他の自社サービスとデータ連携できない
    10
    年も経つと課題が、、

    View full-size slide

  11. 2つサービスの開発運用
    2022
    年 3
    月〜 2022
    年 4
    月〜
    フルスクラッチ
    AWS
    サーバレスで

    View full-size slide

  12. サーバレスのおかげでなんとか
    2022
    年 3
    月〜 2022
    年 4
    月〜
    エンジニア5名
    3年前に未経験の人たちで
    スタート

    View full-size slide

  13. VPC LESS
    VPC LESS
    VPC LESS
    OS
     LESS
    OS
     LESS
    OS
     LESS

    View full-size slide

  14. OIDC
    OIDC
    OIDC
    全体アーキテクチャ(簡易)
    S3 MediaConvert S3
    DynamoDB
    DynamoDB
    DynamoDB
    AppSync
    Lambda
    API-GW
    Step Functions
    API-GW
    Amplify
    Amplify
    担当者向け
    CMS
    倉庫
    システム
    BFF
    Frontend Backend

    View full-size slide

  15. ServerlessDays Tokyo 2022 Virtual
    詳しくは昨年の ServerlessDays
    の資料で!

    View full-size slide

  16. 動画配信サービス hod
    どうでしょうの新作配信

    View full-size slide

  17. 過去のどうでしょう新作は
    すべてサーバーダウン

    View full-size slide

  18. 放送は落ちないのにねぇ

    View full-size slide

  19. やってやろうじゃないの

    View full-size slide

  20. 25,000ユーザ / 5,000 TPS
    を耐えられるように!!
    絶対落ちないように
    ※オンプレ時代の情報を元にざっくり算出

    View full-size slide

  21. 今日のお話に出てくる
    覚えておいて欲しい Limit

    View full-size slide

  22. 今日のお話に出てくる AWS Service Limit
    AppSync
    Rate of request tokens
    DynamoDB
    Hot Partition
    2,000 /s (soft limit)
    3,000 read /s
    1,000 wright /s
    (hard limit)
    1,500KB秒以下のメモリとvCPU時間で1トークン
    普通に使ってると、1 TokenConsumed / 1 query

    View full-size slide

  23. DynamoDB のホットパーテーション
    多段 connection 問題
    AppSync TokenConsumed 問題
    近い構成で高負荷状態ではTokenが減少するの
    を確認済み

    View full-size slide

  24. EpisodeGroup
    1対多
    1対多
    AppSync と DynamoDB の関係
    DynamoDB
    AppSync
    Program
    Connection
    ConnectionEpisode Episode
    1対多
    1対1
    1対1
    Recoil
    に格納
    初期ロード時に
    全てのデータを
    DynamoDB User
    ユーザ系のデータ(ログイン時)
    くらい
    番組情報は
    全部で10MB
    amplify-cli
    で、どんどん増やしちゃった
    番組系のデータ

    View full-size slide

  25. EpisodeGroup
    1対多
    1対多
    AppSync と DynamoDB の関係
    DynamoDB
    AppSync
    Program
    Connection
    ConnectionEpisode Episode
    1対多
    1対1
    1対1
    くらい
    番組情報は
    全部で10MB
    AppSync で 3000 resolver が解決
    AppSync で 200 TokenConsumed
    DynamoDB で EpisodeTableに集中
    1query で

    View full-size slide

  26. (別構成)AppSync と TokenConsumed
    負荷をかけると1クエリあたりのToken消費が減る

    View full-size slide

  27. 負荷かけたけど
    100 Token/query
    までしか下がらない

    View full-size slide

  28. 5000 TPS だと
    5000 TPS ✖︎ 100 tokenだから
    quota は 50万必要...

    View full-size slide

  29. AWS さん!
    50万 Token まで上げて!!!

    View full-size slide

  30. まぁ、一旦落ち着こうか

    View full-size slide

  31. AWSさんのご提案
    ・cacheを使ってみよか
    ・バックエンド作り直そか

    View full-size slide

  32. 残り2ヶ月で
    バックエンド作り直しは無理、、

    View full-size slide

  33. cache しかない!!

    View full-size slide

  34. キャッシュの
    試行錯誤

    View full-size slide

  35. キャッシュはVPC内サービス、、
    ElastiCache はVPC使うので却下
    DAX はVPC使うので却下
    AppSync に cache がついてる
    FULL cache
    Per resolver cache
    これらも結局、ElastiCacheで時間課金
    Cache 導入によるToken低減の期待
    キャッシュにオフロードできたらToken減りそう
    1,500KB秒以下のメモリとvCPU時間で1トークン

    View full-size slide

  36. AppSync の Cache
    Full request caching
    Per-resolver caching
    AppSync

    View full-size slide

  37. AppSync の Cache テストしてみた
    Full request caching
    Tokenが激増 6000/query
    Per-resolver caching
    ホットパーテーションは回避可能
    Tokenは減らない。。
    AppSync

    View full-size slide

  38. これは、もう、、
    デスマーチ宣言をするしか、、
    ☠️

    View full-size slide

  39. サーバーレスで
    キャッシュがあればなぁ

    View full-size slide

  40. 4月の渋谷の夜 photo by @TAKA_0411

    View full-size slide

  41. もめんと!

    View full-size slide

  42. Momentoの
    導入

    View full-size slide

  43. 元DynamoDBを担当してた方が立ち上げた
    サーバーレスキャッシュサービス
    Momento
    Cache Topics

    View full-size slide

  44. キムさんにMomentoの相談(本番50日前くらい)
    AppSync Merged API 採用の検討
    フロントエンドの修正を最小限に
    フロントエンドver と バックエンドver の提案
    キャッシュ取得の構成案をMomentoチームと相談
    構成図の解説

    View full-size slide

  45. AppSync の Merged API
    Build time
    アプローチ
    Run time
    アプローチ

    View full-size slide

  46. AppSync の 後ろに Momento Cache

    View full-size slide

  47. AppSync の subscription 使いたい

    View full-size slide

  48. 実際の構築
    (2週間くらい)

    View full-size slide

  49. 実際の構成

    View full-size slide

  50. 更新を含めると

    View full-size slide

  51. 超えてきた
    ハードル

    View full-size slide

  52. Lambdaペイロードサイズ制限
    バースト耐性
    momento上限緩和等
    実装で気をつけたこと

    View full-size slide

  53. Lambdaペイロードサイズ制限
    同期呼出で6MBを超えることができず
    AppSyncリゾルバーではストリーミング
    応答もできない
    番組データのサンプルは最大10MBを想定
    更新を含めると

    View full-size slide

  54. JSON
    文字列 圧縮バイナリ
    Chunk 1 (1MB)
    Chunk 1 (1MB)
    Chunk 1 (1MB)
    圧縮バイナリのチャンク単位で
    Momentoにキャッシュさせる
    → 3MB
    10MB
    ・・・
    Momento Cache

    View full-size slide

  55. 負荷試験中、AWS Lambda でおきたスロットル

    View full-size slide

  56. AWS Lambda のバースト耐性
    Token Bucket Algorithm
    同時実行数(Concurrency)とバースト制限
    ※「AWS Lambda におけるバースト耐性」:https://aws.amazon.com/jp/builders-flash/202212/lambda-burst-resistance

    View full-size slide

  57. リクエスト不可に応じたバースト制限の同時実行数とスロットリング
    → リトライと Provisioned Concurrency で対応
    ※「AWS Lambda におけるバースト耐性」:https://aws.amazon.com/jp/builders-flash/202212/lambda-burst-resistance

    View full-size slide

  58. Momentoキャッシュのサービス上限と緩和申請
    ~ 5000 TPS
    ~ 5000 TPS × 1MB
    チャンクは 1MB までなので
    そのまま

    View full-size slide

  59. Momentoチームに課題と構成案を説明・相談
    ※日本語のサポートもあります!
    MoCon参加で前フリをしていたので、今回は英語で。

    View full-size slide

  60. 相談したバックエンドverの構成

    View full-size slide

  61. 相談したフロントエンドverの構成

    View full-size slide

  62. モニタリング
    負荷試験

    View full-size slide

  63. 負荷試験はDistributed Load Testing on AWSを使用
    5,000 rps まで負荷の負荷試験を実施
    20,000 Token/s まで上限緩和するために負荷試験を求めら
    れた
    AppSyncのdevとprodが同アカウントの同リージョン
    段階的に上限緩和をしてもらう
    Momento 込みで負荷試験

    View full-size slide

  64. Distributed Load Testing on AWS
    CloudFormation テンプレートを配布してる

    View full-size slide

  65. CloudWatchメトリクスで確認
    毎秒の値はCloudWatch Logs Insight で(高い)
    JMeterでレスポンスの情報をS3に保存
    Colaboratory で集計してお金の節約
    Momento のメトリクスもCloudWatchに連携
    モニタリング

    View full-size slide

  66. CloudWatch Dashboard
    dev と prod を
    手動で作るの大変。。
    CDKは途中で心折れた…

    View full-size slide

  67. 段階的に
    負荷をかけていく

    View full-size slide

  68. 5,000 TPS
    クリア!!

    View full-size slide

  69. CloudWatch Dashboard
    負荷をかけると
    反応が良くなる
    Momento Cache
    1700ms
    700ms
    AVG 5min
    Momento Cache Get Latency

    View full-size slide

  70. もともとは
    AppSync
    Rate of request tokens
    DynamoDB
    Hot Partition
    2,000 /s (soft limit)
    AppSync DynamoDB
    200
    3,000 read /s
    1,000 wright /s
    (hard limit)
    TokenConsumed

    View full-size slide

  71. 上限緩和とMomento の導入
    AppSync
    Rate of request tokens
    DynamoDB
    Hot Partition
    2,000 /s (soft limit)
    Momento が
    受けてくれる!
    20,000 /s

    AppSync Lambda
    Resolver
    Momento
    Cache
    Concurrent executions
    20,000
    + Provisioned Concurrency
    1
    TokenConsumed

    View full-size slide

  72. REALLY
    APPRECIATE!!

    View full-size slide

  73. 配信当日

    View full-size slide

  74. 8/30 23:45:00

    View full-size slide

  75. リクエスト数
    AppSync

    View full-size slide

  76. リクエスト数
    3000 request/min
    AppSync

    View full-size slide

  77. リクエスト数
    3000 request/min
    あ、オンプレのデータって毎分だったのね、、
    AppSync

    View full-size slide

  78. リクエスト数
    毎秒100くらい…
    AppSync

    View full-size slide

  79. はじめて陥落しなかったから
    ヨシ!

    View full-size slide

  80. ついにサーバレスキャッシュがやってきた!
    フロントにキャッシュするしかなかった
    全体でのキャッシュ戦略を考えたい
    NoSQL の設計をもう一度
    @connection ディレクティブどうする?
    Amplify GraphQL Transformer v2 ?
    AppSync Resolver 自分で書く?
    大規模な上限緩和の相談はお早めに
    AWSさんには本当に感謝です
    負荷試験は時間かかります
    まとめ

    View full-size slide

  81. ありがとうございました!
    三浦一樹
    北海道テレビ放送株式会社
    Sonu Kim
    株式会社Serverless Operations
    2023/09/23

    View full-size slide