Slide 1

Slide 1 text

サーバレス時代 の 負荷テスト戦略 〜CircleCIで実現する継続的負荷テストとチューニングTips〜 2020.01.22 Serverless Meetup Tokyo #15

Slide 2

Slide 2 text

淡路⼤輔 / INTEC @gee0awa 好きな技術 Serverless / React Native

Slide 3

Slide 3 text

負荷テスト と サーバレス

Slide 4

Slide 4 text

Elasticity Performance, Scalability, Resilience

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

App

Slide 7

Slide 7 text

App EC2 r4.large × 1

Slide 8

Slide 8 text

App EC2 r4.large × 1 ApachBench

Slide 9

Slide 9 text

App EC2 r4.large × 1 ApachBench $ ab -n 100 -c 10 http://example.com

Slide 10

Slide 10 text

EC2 EC2 EC2 EC2 EC2 App r4.large × 5

Slide 11

Slide 11 text

EC2 EC2 EC2 EC2 EC2 App r4.large × 5

Slide 12

Slide 12 text

EC2 EC2 EC2 EC2 EC2 App r4.large × 5

Slide 13

Slide 13 text

Master EC2 EC2 EC2 EC2 App r4.large × 5

Slide 14

Slide 14 text

EC2 EC2 EC2 EC2 EC2 EC2 EC2 EC2 EC2 App r4.large × 10 Master

Slide 15

Slide 15 text

EC2 EC2 EC2 EC2 EC2 EC2 EC2 EC2 EC2 EC2 EC2 EC2 EC2 EC2 App r4.large × 15 Master

Slide 16

Slide 16 text

・負荷に応じて Slave 台数をスケールさせたい ・サーバの⽤意に時間がかかる ・GUIでシナリオ作るとメンテしづらい ・EC2 ⾼い・・・ 課題

Slide 17

Slide 17 text

お⾦はかけたくない ⼤量リクエストを⽣成したい もっと簡単に導⼊したい Simple Performance Cost

Slide 18

Slide 18 text

⚡Artillery⚡

Slide 19

Slide 19 text

Node.js製のシンプルな負荷テストツール

Slide 20

Slide 20 text

Artillery scenario YAMLファイルに宣⾔的にシナリオを記述する 60秒間、20⼈の仮想ユーザがリクエスト

Slide 21

Slide 21 text

EC2 App ⚡Artillery⚡ $ artillery run senario.yml

Slide 22

Slide 22 text

CloudWatch, DataDog, aws-sigv4 etc..

Slide 23

Slide 23 text

EC2 App ⚡Artillery⚡ $ artillery run senario.yml

Slide 24

Slide 24 text

ECS Cluster App ⚡Artillery Pro⚡ $ artillery run senario.yml

Slide 25

Slide 25 text

Artillery + Lambda

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

serverless-artillery https://github.com/Nordstrom/serverless-artillery

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

InfluxDBに結果を保存、Grafanaで可視化

Slide 30

Slide 30 text

install deploy invoke remove serverless-artillery $ npm install -g serverless-artillery $ slsart deploy —stage dev $ slsart invoke —stage dev $ slsart remove

Slide 31

Slide 31 text

Lambdaだから維持費ゼロ 負荷に応じたオートスケール YAMLによる宣⾔的シナリオ Simple Performance Cost

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

継続的負荷テスト 開発プロセスの早い段階から性能検証を⾏う

Slide 34

Slide 34 text

Github Developer commits yaml file 継続的負荷テスト CircleCIから負荷テストを実⾏する Invoke loadtest unittest ⚡ Serverless Artillery⚡

Slide 35

Slide 35 text

Github Developer commits yaml file 継続的負荷テスト unittest CircleCIから負荷テストを実⾏する loadtest Invoke ⚡ Serverless Artillery⚡ 処理が被ったらスキップされる

Slide 36

Slide 36 text

.circleci/config.yml シンプルなインタフェースで 実⾏できるようにしておく

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

プロダクションでは 様々なアクセスが想定される

Slide 40

Slide 40 text

負荷にランダム性を持たせる

Slide 41

Slide 41 text

Artillery scenario YAMLファイルに宣⾔的にシナリオを記述する 60秒間、20⼈の仮想ユーザがリクエスト この部分を ランダムに変化させる

Slide 42

Slide 42 text

シナリオファイルの負荷量を書き換える generateSenario.js duration, arrivalRate, phase数の最⼤・最⼩値だけ指定して ランダムな負荷を⽣成できるようにシナリオファイルを書き換える ChaosEngineering!!

Slide 43

Slide 43 text

負荷をランダムにする .circleci/config.yml

Slide 44

Slide 44 text

負荷テスト の 環境下 で アプリケーション を 開発する

Slide 45

Slide 45 text

App ⚡Serverless Artillery⚡

Slide 46

Slide 46 text

App ⚡Serverless Artillery⚡ get /todos get /todos/{{ id }} put /todos/{{ id }} post /todos/{{ id }} delete /todos/{{ id }} TODOリスト アプリケーション https://github.com/serverless/examples/tree/master/aws-node-rest-api-with-dynamodb-and-offline

Slide 47

Slide 47 text

TODOリスト アプリケーション https://github.com/serverless/examples/tree/master/aws-node-rest-api-with-dynamodb-and-offline serverless examples の Node.js REST API

Slide 48

Slide 48 text

TODOリスト アプリケーション TODOリストに登録 Responseのjsonに含まれるidの値を保持 idを指定して1件取得 idを指定して1件更新 idを指定して1件削除 Artilleryのシナリオ

Slide 49

Slide 49 text

結果

Slide 50

Slide 50 text

キャパシティユニットが全然⾜りない DynamoDB

Slide 51

Slide 51 text

TODO⼀覧 ソース

Slide 52

Slide 52 text

全件スキャンになってる!! TODO⼀覧 ソース

Slide 53

Slide 53 text

AWS X-Ray 監視

Slide 54

Slide 54 text

PUT DELETE GET POST Lambdaの実⾏単位や DynamoDBへのリクエスト単位で 処理時間を計測

Slide 55

Slide 55 text

Lambda (cron) GetServiceGraph API Slack AWS X-Ray ALERT 監視 Response time 4xx (error) 429 (throttling) 5xx (failure)

Slide 56

Slide 56 text

サーバレス時代 の 負荷テスト戦略 まとめ 宣⾔的シナリオ・低コスト・⾼負荷 継続的負荷テスト・ランダム性 分散トレーシング・監視 ⚡Serverless Artillery⚡ AWS X-Ray CircleCI

Slide 57

Slide 57 text

ご静聴ありがとうございました