A/B Test with Docker

A/B Test with Docker

Docker Meetup Kansai #3

52f95e52a6d71b67361ac179fb8405f4?s=128

chimame

May 24, 2019
Tweet

Transcript

  1. AB test with Docker 2019/05/24 Docker Meetup Kansai #3 rito

  2. Agenda ❏ 自己紹介 ❏ サービス改善時の課題 ❏ テスト基盤概要 ❏ テスト基盤の課題および解決方法 ❏

    同一ページの表示 ❏ 複数ページでの同時 テスト実施 ❏ 静的ファイルの配信 ❏ まとめ 2
  3. 自己紹介 名前: rito 職業: Webエンジニア (アプリケーションエンジニア) 分野: Ruby on Rails,

    Nodejs, React, Docker, AWS, GCP 所属: Ateam Finergy Inc. CTO コミュニティ: Rails follow-up Osaka Osaka Web Developers Meetup twitter: @chimame_rt GitHub: chimame 3
  4. サービス改善時の課題

  5. サービス改善手法 ❏ ❏ ❏ 5

  6. 6 A/Bテストするためのツール

  7. 軽く テストするなら これらのツールでも可能 7

  8. 凝った テストするにはちょっと 8

  9. 自社で一番よくやられている テストの手法 9

  10. 10 トップページをA/Bテストする 一定のルールでディレクトリを分けると テストできる を社内で開発・使用

  11. 確かに実施できるが課題もある 11

  12. 以前のA/Bテスト手法の課題 ◂ 「一定のルールでディレクトリを作成する」という仕 様が理解しづらい ◂ コピペされたコードが大量に発生する ◂ テストを行っているページでパーシャルファイ ルを参照すると不具合が誘発しやすい 12

  13. A/Bテスト基盤

  14. 14 アプリケーションで テストを サポートするの辛いな

  15. 15

  16. “ インフラで テストをサポートするに は と があれば成立するんだから、 つサーバ並べれれば テストでき るよね? なら

    コンテナ つ並べればでき るんじゃない? 16
  17. Dockerの特徴 ◂ コードベースでインフラを定義 ◂ 環境構築の差異を最小限することが可能 ◂ サーバ計算資源を効率よく使用 ◂ デプロイが容易に可能 17

  18. 平たく言うと 18

  19. 環境構築もしくは再現が容易 19

  20. “ インフラで テストをサポートするに は と があれば成立するんだから、 つサーバ並べれれば テストでき るよね? なら

    コンテナ つ並べればでき るんじゃない? 20
  21. “ インフラで テストをサポートするに は と があれば成立するんだから、 つサーバ並べれれば テストでき るよね? なら

    コンテナ つ並べればでき るんじゃない? 21 できなくはないけど、クラウド使ってて コピーして作るとしても結構面倒くさ い。更には計算資源(サーバ)無駄過 ぎる。
  22. “ インフラで テストをサポートするに は と があれば成立するんだから、 つサーバ並べれれば テストでき るよね? なら

    コンテナ つ並べればでき るんじゃない? 22 環境構築が簡単。計算資源が多少は いるけど、サーバを2つ構えるよりは断 然まし。
  23. 基盤構成 23 Target group Target group

  24. これを見てこんなこと思いませんでした? 24

  25. 「めっちゃ普通やん」 25

  26. その感覚は正しいです (でも少しだけ普通と違う箇所もある) 26

  27. 「裏側でめっちゃ頑張っ てそう」 27

  28. それも正しいです (現に裏側はめっちゃ色々やってる) 28

  29. A/Bテスト基盤の課題と 解決方法

  30. 最初に作った初期型の構成 30

  31. 初期型構成 Target group 31 Original Challenger 対応内容 ・普段は ブランチをデプロイ ・特定ブランチ名で

    すると と言 われる テスト用のコンテナをデプロイ
  32. 第 の課題発生 32

  33. Target group 33 初期型構成 Original Challenger UserはABどちらかのページを表示さ れる。A/Bテスト実施時にAとBの表示 がアクセスの度に変わるのはよくな い。

  34. 第 の課題解決 34

  35. 35 初期型構成 Target group Original Challenger ALBのtarget groupには「sticky session」と いう設定が存在する。

    それをオンにすれば一定期間は同一コンテ ナにアクセスさせることが可能。
  36. なんかイケそうだったけど 第2の課題発生 36

  37. Target group 37 初期型構成 Original Challenger 2画面分の別々A/Bテストを同時に実施 するので、Challengerコンテナを2つ配 置する。 (A/B/Cテストではない)

    どのコンテナに当たるかは1/3
  38. もう少しわかりやすく説明 38

  39. top画面とthanks画面の2しかないアプケーションとする 39 画面 画面 Original Original A/Bテストを実施していないのでコンテナ1つで どちらもOriginalが表示される状態

  40. top画面とthanks画面の2しかないアプケーションとする 40 画面 画面 Original Original Challenger Original top画面でA/Bテストを実施した状態。 top画面だけ1/2でユーザが振り分けられる。

    thanks画面は同じなので、振り分けは実質なし。
  41. top画面とthanks画面の2しかないアプケーションとする 41 thanks画面も同時にA/Bテストを実施したい場合の状態。 thanks画面のChallengerコンテナはthanks画面だけの変更 なので、top画面は変更されない。 画面 画面 Original Original Challenger

    Original Original Challenger
  42. top画面とthanks画面の2しかないアプケーションとする 画面 画面 Original Original Challenger Original Original Challenger 42

    Challengerへのアクセス確率が1/3になってしまう。
  43. ❗❓ 43

  44. 第2の課題の整理 ◂ 別々の画面を同時に テストをすると へのアクセス率が悪くなる ◂ へのアクセス率が悪くなると テス ト結果のログが貯まるのに時間が必要となる ◂

    もっというと コンテナは つで動くというこ とはなく、冗長性を持たせて つ以上で動くので つ 目の テストでも起こりうる 44
  45. 第 の課題解決 45

  46. 46 型構成 Target group Target group Target group A/Bテストしたい画面のURLは決まっているのでALB のルール設定でURLごとにtarget

    groupを分ける。 Challenger Original Challenger Original /thanksへの アクセス /topへの アクセス
  47. 47 型構成 Target group Target group Target group target group単位でA/Bテス

    トを実施する形にする。 OriginalとChallengerのコン テナをセットとし、1/2の確率 でA/Bテストできるようにする Challenger Original Challenger Original /thanksへの アクセス /topへの アクセス
  48. 48 型構成 Target group Target group Target group Challenger Original

    Challenger Original Original Original /*への アクセス /thanksへの アクセス /topへの アクセス A/Bテスト対象外はoriginal用の target groupに割り振る。
  49. 次こそいけそう! 49

  50. そんな甘くなかった 50

  51. 第 の課題発生 51

  52. 52 型構成 Target group Target group /*への アクセス /thanksへの アクセス

    Challenger Original Original Original ② を返却 ① リクエスト 仮に画像をA/Bテストすると想定して Challengerにアクセスされたとする。
  53. 53 型構成 Target group Target group /*への アクセス /thanksへの アクセス

    Challenger Original Original Original ③画像等を再度取得 静的ファイルの取得パスが /images/* となっている場合に、必ず Originalに取得しにいってしまう。 OriginalにはChallengerの画像はないので、404となってしまう。 ④404 Not Found
  54. 第 の課題解決 54

  55. 55 型構成 Target group Target group /*への アクセス /thanksへの アクセス

    Challenger Original Original Original ② を返却 ① リクエスト ③画像等を再度取得 CDNを使う設定で Challenger用の静的 ファイルをS3に配置し、 そこから取得させる
  56. まとめ

  57. A/Bテストをインフラでサポートする時に目指した もの ◂ 簡単に テストが 実施 できる ◂ 簡単に テストが

    停止 できる ◂ オリジナルコンテンツに 影響 なく テストが実 施できる 57
  58. 58 Target group Target group 基盤構成 git pushすればこれらのインフラが自動で構築されるものを 構築している。 ブランチを消せば停止するようになっている。

  59. 59 Target group Target group 基盤構成 ここにそれらを構築する泥臭い処理を任せて頑張っている。 ということは、ここにこれらのノウハウが溜まっている。

  60. ◂ コンテナを使っての テストって意外と できる ◂ アプリケーションエンジニアでも、 使えば インフラのことがある程度できる ◂ 本当はまだまだ細かいこと(ハマりポイント)ある

    ので、後で聞いてください 60 言いたいこと
  61. 61

  62. 62

  63. 63 Thanks! ご清聴ありがとうございました。 ◂ ◂