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

Canary release in StudySapuri

Canary release in StudySapuri

スタディサプリ/Quipper Product Meetup #3 発表資料

https://techplay.jp/event/737389

Fumiaki MATSUSHIMA

July 18, 2019
Tweet

More Decks by Fumiaki MATSUSHIMA

Other Decks in Programming

Transcript

  1. #sapurimeetup Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略 2 ➔ Web Dev at

    Quipper ◆ 主に学校向け機能の開発 ➔ Ruby と麻雀と DbD が好き ➔ 西日暮里.rb 主催 @mtsmfm.inspect
  2. #sapurimeetup Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略 Deploy Test and Build student-api

    12 docker build docker push test student-frontend docker build docker push student-api test kustomize build kubectl apply student-frontend kustomize build kubectl apply
  3. #sapurimeetup Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略 Canary release とは “Canary release

    is a technique to reduce the risk of introducing a new software version in production by slowly rolling out the change to a small subset of users before rolling it out to the entire infrastructure and making it available to everybody.” 15 https://martinfowler.com/bliki/CanaryRelease.html
  4. #sapurimeetup Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略 k8s namespace 19 Service Router

    student-api Server student-api-new Server User Canary release if canary_release?(user) new_host else old_host end
  5. #sapurimeetup Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略 Canary release と Feature toggles

    20 ➔ Canary release ◆ プロセスごと分離するため、用いるライブラリのバージョンを変えられる ◆ プロセスを2系統上げておかないといけない ➔ Feature toggles ◆ プロセス内で分岐するため導入しやすい ◆ ライブラリのバージョンは変えられない
  6. #sapurimeetup Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略 簡単にフレームワークのバージョンが切り替えられるように する ➔ 2種類のライブラリバージョン管理ファイルを持つ ◆

    Ruby で使われるパッケージ管理ツール (Bundler) の場合環境変数1 つで変えられるので便利 • BUNDLE_GEMFILE ➔ Dockerfile 上では ARG で差し替えられるようにしておく 27
  7. #sapurimeetup Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略 新旧フレームワーク両方デプロイされるようにする ➔ 既に Monorepo にしつつ各ディレクトリ

    == サービス ◆ シンボリックリンク + build arg や overlay のカスタマイズ • これにより各ディレクトリ == サービスの延長で考えられるので build、deploy スクリプトに大きく手を入れる必要がない 29
  8. #sapurimeetup Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略 k8s namespace 36 student-api Server

    User Cookie Ratio = 0.5 id = 0.3 Version = new id < Ratio になったので バージョン切り替え用の Cookie も付与 Service Router (NGINX)
  9. #sapurimeetup Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略 k8s namespace 37 student-api Server

    student-api-new Server User Cookie Version == new バージョン切り替え用の Cookie だけ見て Host 切り替え Service Router (NGINX)
  10. #sapurimeetup Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略 移行 ➔ 0 -> 0.1

    -> 1 -> 10 -> 50 -> 100 ◆ ロジックミスっていないかの確認のため 0 は挟んだほうがいい ◆ 念の為 curl で数百回回すスクリプト書いて確率通りか見る ◆ 一週間に1段階上げていた 38
  11. #sapurimeetup Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略 エラー監視 ➔ Sentry にフレームワークのバージョンをタグとして付与、そのタグがついて いる場合のエラー通知先を分離

    ◆ 普段は Slack の #exception-<service 名> 部屋に通知 ◆ 移行期間だけ #upgrade-rails 部屋に通知 ➔ タグがついていない場合も同じエラーが起きたことがあるか一通りチェック 40
  12. #sapurimeetup Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略 何が起きたか ➔ 本番でフレームワークのバージョン起因の問題は何も起きなかった ◆ ステージングは

    Canary release の割合を高めていた (最初から50%) のでエラーを拾って対処できた ◆ 自動テストがしっかりしていた ◆ 簡単に後戻りできる安心感があった ➔ 一度実験していると今後も使える ◆ フレームワークのバージョンは上げ続ける必要がある 42
  13. #sapurimeetup Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略 改善点 ➔ 段階を進めるのを週次リリースに合わせていたが時間かかりすぎ ◆ 全部で2ヶ月くらい

    ◆ 1日1段階、100%にするのに1週間くらいがいい? ➔ 新エラーの判別を楽したい ◆ 最後の方は全エラーの半分を背負うことになる 43
  14. #sapurimeetup Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略 まとめ ➔ 新しいサービスを簡単に足せるようにさえなっていれば、Canary release は

    単純な実装で実現できる ◆ Monorepo だとサービスを足しやすかった ◆ その分 CI 周りは複雑になる ➔ 足回りの整備が進んでいることで Web Dev としても可能性が広がる ◆ SRE Dev ➔ アップグレードとの戦いはサービスが続く限り続く 45