Open3

Feature Flag, Feature Toggleメモ

iwamasaiwamasa

Feature Flag, Feature Toggleとは?

Feature Flag(機能フラグ)は、ソフトウェア開発において利用されるテクニックであり、特定の機能やコードの挙動を制御するための条件を表すフラグのことです。これは、アプリケーションの異なる部分や機能を有効または無効にするために使用されます。

Feature Flagの目的

  1. リリースの制御: 新しい機能をユーザーに見せる前に、その機能を安全にテストすることができます。これにより、リリースが制御され、問題が発生した場合には機能を簡単に無効化することができます。

  2. A/Bテスト: 異なるバージョンの機能をランダムにユーザーに提示することで、どちらがより良い結果をもたらすかを比較することができます。

  3. ダークローンの導入: 新しい機能をコードベースに統合しておき、まだリリースしない状態で、その機能を一部のユーザーにのみ公開することができます。

  4. 環境別のカスタマイズ: 開発、ステージング、プロダクションなどの異なる環境で、異なる機能の有効化や無効化を制御することができます。

ざっくり、どんなイメージ?

Rubyを使ったサンプルコード

# フラグはON/OFFにしたい機能ごとに定義する
feature_flag = ENV['FEATURE_FLAG']

if feature_flag
  puts 'フラグが有効な時にだけ使える新機能'
else
  puts '従来の機能'
end
iwamasaiwamasa

各社の事例

サイバーエージェントさん

https://developers.cyberagent.co.jp/blog/archives/35021/

社内にフィーチャーフラグ基盤を持っていて、そこで制御するようにしている。
管理画面があるっぽいので、多分権限がある人(開発者、管理者、QAとか)が自由に制御できるイメージ?

ROXXさん

https://speakerdeck.com/akki_megane/huitiyatoguruwo-shi-tutesu-zao-kujia-zhi-wojian-zheng-suru

「本番で試す」ことを目的とした事例
特定のユーザーに絞って機能を提供する(フラグONにする)
ABテストとかでの活用イメージ。
主にフロントエンドでの活用がメインで、コンポーネントの出しわけをしているらしい。
(API側でも使っているみたい)

フロントは features ディレクトリを作成し、そこに配置していく。
不要になったら削除できるようにするため、他から依存しないようにする必要がある(featuresを参照しない)

kakakakakku blogさん

https://kakakakakku.hatenablog.com/entry/2022/02/01/102104

Featureフラグの分類について

カミナシさん

https://kaminashi-developer.hatenablog.jp/entry/2023/07/31/122831
https://logmi.jp/tech/articles/329504

主にABテストでの使用がメインとのこと。
フラグの管理にはAWS AppConfigを使っている。

フロントエンドからAppConfigに問い合わせし、フラグのON/OFFを判定する。
この方法でデプロイ、コードの変更を入れずに機能の公開・非公開を実現している。
(素晴らしい)

フラグ自体は別のリポジトリで管理し、Terraformを使用しているらしい。
applyするとAppConfigに反映される。

AWS AppConfig agent をサイドカーで実行している。

iwamasaiwamasa

Next Action

Featureフラグを管理する場所を変更する
→環境変数やコード上での管理はやめて外部にで管理するようにする

Featureフラグを利用する箇所をより限定的にする
→リリーストグルとしての使用は極力使用しない方向に持っていく