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

FargateとLambdaで作るスケーラブルなE2Eテスト実行基盤 / Building a...

FargateとLambdaで作るスケーラブルなE2Eテスト実行基盤 / Building a scalable E2E test execution platform with AWS Fargate and Lambda

doublemarket

March 28, 2020
Tweet

More Decks by doublemarket

Other Decks in Technology

Transcript

  1. Autifyとは • E2Eテストはハードルが高い ◦ 手でやるのは工数がかかる ▪ しかも同じシナリオを何度もやることになる ◦ シナリオ作る・書くの大変 ▪

    レコーダ使って簡単にテストシナリオ作成できます ◦ 実行するの大変 ▪ 複数のブラウザでががっとテスト回せます ◦ 作った後も大変 ▪ AIの力で変更検出してシナリオ修正の支援します
  2. Autifyインフラ 構成要素 • Web (Elastic Beanstalk) ◦ ユーザがアクセスする ◦ シナリオの作成・表示

    • Worker (Elastic Beanstalk) ◦ テスト実行の指示 ◦ 実行結果データ、スクリーンショットなどの一時保存 • テスト実行環境 (デバイスファーム) ◦ テストを実行するデバイス、ブラウザ
  3. S3 Device farms Web servers Workers For customer A For

    customer B For customer C Queues Test Test Test Scenario Scenario Scenario 1. Create scenario 2. Upload scenario 4. Receive test case Result Result Result 6. Upload test result 5. Execute test case User in customer A (per customer) (per customer) (shared) Test devices (shared) 7. View test result 3. Enque test case For customer A For customer B For customer C
  4. Autifyインフラ Ver. 1の問題点 • 顧客ごとにワーカのElastic Beanstalk環境を用意 ◦ 顧客ごとの分離を優先 ◦ 顧客が増えるとサーバも増える

    ▪ テスト実行回数が増えるとは限らない ▪ 顧客増に対してリニアにコストが増えてしまう ▪ 毎回作るの辛い(SQSキュー、Elasticacheインスタンスなども作る必要) ◦ ebscriptが肥大して管理が辛い
  5. Autifyインフラ Ver. 1の問題点 • テスト実行が遅い ◦ 並列実行できない ▪ 高速にスケールできない ◦

    デバイスファームがUSまたはEUに存在している ▪ レイテンシが馬鹿にならない • ログ、メトリクスなどが取れていない
  6. Selenium / Selenium grid • Selenium ◦ ブラウザの操作を自動化するためのフレームワーク ◦ Thoughtbot社が開発を開始したOSS

    • Selenium grid ◦ ハブ : テストの割り当て・ルーティングを行うマスタの役割 ◦ ノード : テストの実行
  7. S3 Device farms Web servers Workers For customer A For

    customer B For customer C Queues Test Test Test Scenario Scenario Scenario 1. Create scenario 2. Upload scenario 3. Enque test case 4. Receive test case Result Result Result 6. Upload test result 5. Execute test case User in customer A (per customer) (per customer) (shared) Test devices (shared) 7. View test result For customer A For customer B For customer C Hub Nodes
  8. Autifyインフラ Ver.2 • Fargateを選択 ◦ 既にSelenium Grid Hub/Nodeのコンテナが広く使われている ◦ Kubernetesを使うほどの規模ではない

    ▪ が、将来移行する時もコンテナにしておけば楽そう ◦ Lambdaだと実行時間不足 ▪ テストによっては1時間ぐらいかかるものもある ◦ LinuxコンテナのみのサポートなのでChrome on Linuxだけ
  9. Autifyインフラ Ver.2 • Hubのサービス ◦ タスク数は1 • Nodeのサービス ◦ タスク数は固定

    ◦ オートスケールはしない ▪ CloudWatchのメトリクスはオートスケールの基準として意味がない
  10. Autifyインフラ Ver.2 • Nodeはテスト実行が終わったら停止 ◦ テストに関する情報がNodeに残っているとまずい可能性 ▪ Cookieや閲覧履歴などのブラウザ上の情報 ▪ キャプチャ画像、ダウンロードファイルなど

    ◦ 実行完了後HubからNodeのSeleniumプロセスを停止するコマンドが送信される ◦ プロセスが停止 → Serviceが自動的にタスクを削除 ◦ 新しいタスクが自動的に起動
  11. Autifyインフラ Ver.3 • Selenium gridをオートスケール化 ◦ ノードのServiceをやめて、Lambda functionで必要タスクを起動する ▪ 「最低タスク数」と「空きスロット待ちテスト数」を組み合わせ

    ▪ 1分おきに起動 ◦ Unhealthyなタスクを消して回るLambda function ◦ タスク数をスケールインする際 ▪ 起動タスク数 > 最低タスク数ならタスク起動Lambdaは何もしない ▪ テストが終わったタスクは消えていく ▪ タスクを強制終了しなくてもタスク数は自然に減る
  12. Autifyインフラ Ver.3 • ワーカの必要台数をどう管理するか ◦ SQSのAPIはそんなに高速でない & 正確でない ▪ SQSに入ったジョブ数を使うのは微妙

    ◦ Key-Value Storeに必要数を入れる ▪ ワーカの必要数 = 待ち状態のテスト数 • Lambdaはこの数を見て適宜タスクを起動 ▪ ワーカの稼働数も記録して並列度を管理
  13. Autifyインフラ Ver.3 • KVSの選定 ◦ DynamoDB ▪ すぐ使える ▪ テスト実行数増えるとコスト上がる

    ◦ Redis ▪ 既に使ってる & すぐ使える(Elasticache) ▪ AWS以外でも使える ◦ Consul ▪ ワーカコンテナのサービスディスカバリもできる ▪ AWS以外でも使える
  14. S3 Device farms Web servers Workers Queue Test Test Scenario

    Scenario Scenario 1. Create scenario 2. Upload scenario 3. Enque test case 4. Receive test case Result Result Result 6. Upload test result 5. Execute test case User in customer A (per customer) (on demand) (shared) Test devices (shared) 7. View test result Test For customer A For customer B Start Start Check Hub Nodes
  15. Autifyインフラ Ver.3 • ログ ◦ できるだけ標準出力に出力 ◦ CloudWatch Logsで確認 &

    Insightで検索 ◦ テストのIDをログの各行の先頭に出力 ▪ InsightでテストIDで検索するとどのコンテナで実行されたかわかる
  16. Autifyインフラ Ver.3 • コスト ◦ 以前 : (t2とはいえ) EC2インスタンスを顧客分だけ起動しっぱなし ◦

    現在 : テストが実行されるたびにタスクが起動 ▪ ただし最低起動数は常に動作
  17. Autifyインフラ Ver.3 • コスト ◦ おおまかに2/3程度に ▪ Savings Plan検討中 ▪

    Fargate Spot • テスト実行中にタスクが停止される可能性 • 自動リトライを実装中
  18. 悩みどころ・今後の改善点 • タスクのスケールのタイミング ◦ 現在 : 1分おきにLambda関数を実行 ◦ すぐにスケールできない場合 ▪

    Step function? ▪ SQSとLambdaの連携 ▪ Enqueueするときにアプリケーション側からタスクを起動
  19. S3 Device farms Web servers Workers Queue Test Test Scenario

    Scenario Scenario 1. Create scenario 2. Upload scenario 3. Enque test case 4. Receive test case Result Result Result 6. Upload test result 5. Execute test case User in customer A (per customer) (on demand) (shared) Test devices (shared) 7. View test result Test For customer A For customer B Start Start Check Hub Nodes