Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

@shimagaji 無念の欠席

Slide 3

Slide 3 text

代打登壇!

Slide 4

Slide 4 text

資料がない!

Slide 5

Slide 5 text

先週の使い回し

Slide 6

Slide 6 text

serverless days のほぼ再演です

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

サービス紹介

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

VPC LESS VPC LESS VPC LESS OS  LESS OS  LESS OS  LESS

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

放送は落ちないのにねぇ

Slide 20

Slide 20 text

やってやろうじゃないの

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

今日のお話に出てくる 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

Slide 24

Slide 24 text

課題

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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 で +

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

まぁ、一旦落ち着こうか

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

cache しかない!!

Slide 36

Slide 36 text

キャッシュの 試行錯誤

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

AppSync の Cache Full request caching Per-resolver caching AppSync

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

💡

Slide 43

Slide 43 text

4月の渋谷の夜 photo by @TAKA_0411

Slide 44

Slide 44 text

もめんと!

Slide 45

Slide 45 text

Momentoの 導入

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

AppSync の 後ろに Momento Cache

Slide 50

Slide 50 text

AppSync の subscription 使いたい

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

実際の構成

Slide 53

Slide 53 text

更新を含めると

Slide 54

Slide 54 text

超えてきた ハードル

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

モニタリング 負荷試験

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

5,000 TPS クリア!!

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

もともとは 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

Slide 74

Slide 74 text

上限緩和と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

Slide 75

Slide 75 text

REALLY APPRECIATE!!

Slide 76

Slide 76 text

配信当日

Slide 77

Slide 77 text

8/30 23:45:00

Slide 78

Slide 78 text

リクエスト数 AppSync

Slide 79

Slide 79 text

リクエスト数 3000 request/min AppSync

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

無風 😆

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

まとめ

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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