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 )
    これでリリースも怖くない!
    フィーチャートグルを導入入門

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  4. © 2012-2019 BASE, Inc.
    © 2012-2021 BASE, Inc.
    #phpcon2021
    @glassmonekey
    今北産業



    フィーチャートグルとは?
    なぜ使うのか?
    導入例と感想
    4

    View full-size slide

  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▼

    View full-size slide

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

    View full-size slide

  7. © 2012-2019 BASE, Inc.
    © 2012-2021 BASE, Inc.
    #phpcon2021
    @glassmonekey
    7
    BASEから4人目の刺客です

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. © 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テストの実現など
    ○ 開発者以外も制御できるように

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  16. © 2012-2019 BASE, Inc.
    © 2012-2021 BASE, Inc.
    #phpcon2021
    @glassmonekey
    #phpcon2021
    @glassmonekey
    導入例
    16

    View full-size slide

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

    View full-size slide

  18. © 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  21. © 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 に以下を追加

    View full-size slide

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

    View full-size slide

  23. © 2012-2019 BASE, Inc.
    © 2012-2021 BASE, Inc.
    #phpcon2021
    @glassmonekey
    それでは良き
    リリースライフを!!
    一緒にいい感じに開発する
    仲間も募集中です
    https://herp.careers/v1/base
    23

    View full-size slide