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

PHP Conference Japan 2021

glassmonenkey
October 03, 2021

PHP Conference Japan 2021

フィートグルについて

* フィーチャートグルとは
https://www.atlassian.com/continuous-delivery/principles/feature-flags

* フィーチャートグルの分類
https://martinfowler.com/articles/feature-toggles.html#OpsToggles

* laravelのでの実装例
https://github.com/ylsideas/feature-flags

glassmonenkey

October 03, 2021
Tweet

More Decks by glassmonenkey

Other Decks in Technology

Transcript

  1. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    #phpcon2021 @glassmonekey PHP Conference Japan 2021 永野 峻輔 ( @glassmonkey ) これでリリースも怖くない! フィーチャートグルを導入入門
  2. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    #phpcon2021 @glassmonekey 皆さんリリース頻度は どのくらいですか? 2
  3. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    毎週?毎日?毎秒? 頻度向上に寄与できたら幸いです 3
  4. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    今北産業 1 2 3 フィーチャートグルとは? なぜ使うのか? 導入例と感想 4
  5. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    自己紹介 所属 BASE BANK株式会社 Software Developer Go, PHP, Pythonあたりをよく書いています 趣味 Flutterアプリ開発 hasura.ioやsupabaseがマイブーム SNS Twitter: @glassmonekey  Github: https://github.com/glassmonkey 永野 峻輔 (ながの しゅんすけ) 去年のLT▼
  6. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    (CM)BASEカードをリリースしました 6 順次開放予定!! https://cp.thebase.in/basecard
  7. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    #phpcon2021 @glassmonekey フィーチャートグルとは? 8
  8. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    フィーチャートグルとは? コードを書き換えずに機能を 変更する機構 9 https://www.atlassian.com/continuous-delivery/principles/feature-flags
  9. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    実装イメージ • 主に条件分岐の制御を動的に行うことで実現 ex) 環境変数、RemoteConfig、 etc… • 環境ごと、ユーザーごと、権限ごと、etc… あるフィーチャトグル設定があるとき 10 function func() { if(フィーチャートグルがON) { return hoge(); } return piyo(); }
  10. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    使用例 カナリア リリース A/Bテスト 管理者機能 11
  11. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    フィーチャートグルの分類 12 https://martinfowler.com/articles/feature-toggles.html#OpsToggles 生存期間と動的さで分類 • リリーストグル (Release Toggle) ◦ カナリアリリースなどで使うとき ◦ 弊社ではこれを活用している • オプストグル (Ops Toggle) ◦ 高負荷時などのシステム要件で短時間切り替わ る。 ◦ いわゆるサーキットブレーカー • パーミッショントグル (Permission Toggle) ◦ 管理者機能や有料会員限定機能など ◦ 恒久的にある機能。 • 実験トグル(Expereiment Toggle) ◦ A/Bテストの実現など ◦ 開発者以外も制御できるように
  12. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    #phpcon2021 @glassmonekey なぜ使うのか? 13
  13. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    使う理由 (特にリリーストグル) • 開発のリズムが作られる ◦ デザインチェックがリリースブロックになることを避けることができる ◦ コンフリクト防止につながる ◦ リリース頻度が向上する • 本番環境で開発途中のものの動作確認が可能 ◦ ex) 社内限定リリース ◦ 心理的ハードルが下がる。リリースが身近になる。 ◦ 影響範囲を最小限に失敗ができる安心感。 ◦ 本番DBの接続など本番環境でしか試せないものを気軽に確認できる。 ◦ リリース頻度が向上する 14
  14. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    注意点(特にリリーストグル) • コードが煩雑になる ◦ コード上がif文などが増えるので ▪ トグル制御のレイヤーに気をつけることで対処は可能 ▪ トグルon/offのテストコードも書いておくとより良い • トグルを外すときのリスク ◦ 特に部分公開 -> 全体公開の制御 ◦ トグルの消し漏れで一部apiが403など ▪ トグル制御を最小限にしておく ▪ トグル上で全体公開設定にしてから、削除するなど段階を踏むのもおすすめ 15
  15. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    例: ylsideas/feature-flags  17 https://github.com/ylsideas/feature-flags Laravelでの実装例。 以下で永続化可能 • config(ストレージ) • redis (未確認) • DB (未確認) • 上記の複合(未確認)
  16. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    configで設定(DBなどでも設定可能) 18 |-------------------------------------------------------------------------- | Config Feature Switches |-------------------------------------------------------------------------- | | This is a set of features to load into the config features repository. | */ 'feature' => [ 'my-feature' => true, //実際は環境変数経由などに ] config/features.php
  17. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    アプリケーションコード例 19 if(Features::accessible('my-feature')) { return newAlgorithm(); } return oldAlgorithm();
  18. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    bladeテンプレート例 20 @feature('my-feature') <p>Your feature flag is turned on.</p> @endfeature @feature('my-feature', false) <p>Your feature flag is turned off.</p> @endfeature
  19. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    ミドルウェアの例 Route::get('/', 'SomeController@get')->middleware('feature:my-feature'); Route::get('/', 'SomeController@get')->middleware('feature:my-feature,on'); // OFFの状態だと403 Route::get('/', 'SomeController@get')->middleware('feature:my-feature,off,404'); // ONの状態だと404 21 protected $routeMiddleware = [ 'feature' => \YlsIdeas\FeatureFlags\Middleware\FeatureFlagState::class, ]; フラグによる制御は以下 app/Http/Kernel.php に以下を追加
  20. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    まとめと感想 • if文が設定ファイルなどで制御できれば何でも良いと思われる • 弊社の場合だと主にリリーストグルとパーミッショントグルを活用している ◦ カナリアリリースや社内限定公開など ◦ 拡張機能(Apps)による機能のふるまい変更 • 本番で実際に試せるのはリリースのハードルが下がって良い ◦ 他チームとのコンフリクトも最小限に抑えられているはず • フラグの制御ミスでインシデントにつながるので乱用は厳禁 • 実はフィーチャーフラグ=リリーストグルの認識だったので、分類があるのは学びだった 22
  21. © 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey

    それでは良き リリースライフを!! 一緒にいい感じに開発する 仲間も募集中です https://herp.careers/v1/base 23