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

Feature Flag 開発を標準化し、加速させる OpenFeature を導入する

Avatar for SatohJohn SatohJohn
June 07, 2025
1.1k

Feature Flag 開発を標準化し、加速させる OpenFeature を導入する

2025/06/07 JJUG CCC 2025 Spring で発表した内容です

Avatar for SatohJohn

SatohJohn

June 07, 2025
Tweet

Transcript

  1. 自己紹介 佐藤 慧太@SatohJohn • 2012/4 フリュー株式会社 入社 ToC 向けのアプリケーション開発を 10年ほど経験

    リードエンジニアとして 0からサービスを 設計開発運用を経験 • 2023/1 株式会社スリーシェイク 入社 SRE として労苦 <Toil>を減らす仕事に従事 Google Cloud Partner Top Engineer ’24、’25 選出 Google Cloud で生成 AI とかやってます
  2. 自己紹介 佐藤 慧太@SatohJohn • 好きなもの ◦ Google Cloud ◦ TypeScript,

    Kotlin 最近は Python メイン • 活動範囲 ◦ Jaguerクラウドネイティブ分科会 自社イベント SRETTなどの運営 • 最近の悩み ◦ 娘が保育園からもってくる病気と運動不足によるお腹 のお肉
  3. このセッションで話すこと 1. Feature Flag について a. メリット、デメリット b. Flag の種類と、ユースケース

    c. 悪いFeature Flag 2. OpenFeature について a. メリット、デメリット b. 仕様の説明、実装方法 3. Google Kubernetes Engine 上でのデモ
  4. このセッションで話さないこと 1. Kubernetes での Controller の細かい挙動 2. CI/CD での細かい連携方法について 3.

    Feature Flag と OpenFeature についてのめっちゃ詳しい話 4. Four Keys の詳しい話
  5. そもそもの Feature Flag (Feature Toggle)とは コードのデプロイによるリリースではなく設定値変更により リリースする仕組み Four Keys における

    デプロイ頻度, サービス復元時間などに寄与する https://openfeature.dev/docs/reference/intro https://cloud.google.com/blog/ja/products/gcp/using-the-four-keys-to-measure-your-devops-performance
  6. Feature Flag の種類 https://martinfowler.com/articles/feature-toggles.html Release Experiment Ops Permission 継続的デリバリーを実践するチームにおいて、 トランクベースの開発を可能にする機能フラグです

    多変量テストやA/Bテストを実行するために使用されます システムの動作における運用面を制御するために使用されます 特定のユーザーが利用できる機能や製品エクスペリエンスを変更するた めに使用されます
  7. Feature Flag の種類 Short-lived Feature Flags 生存期間が短いFlag Long-lived Feature Flags

    生存期間が長いFlag https://martinfowler.com/articles/feature-toggles.html
  8. Feature Flag の種類 Static Feature Flag ON/OFFによる切り替え Dynamic Feature Flag

    ON/OFF以外による条件の切り替え https://martinfowler.com/articles/feature-toggles.html
  9. 悪い Feature Flag パフォーマンスクリティカルなパスでの利用 (Performance Bottleneck) • 非常にパフォーマンスが要求されるコードパスで Feature Flag

    を 多用すると、パフォーマンスボトルネックになる可能性がある 設定ファイルで管理すべき設定 (Configuration Misuse) • アプリケーションの基本的な設定 (例: APIエンドポイント、 データベース接続情報) を管理するためのものではない 削除されない Feature Flag (Uncleaned Feature Flags) • 不要になった Feature Flag は、速やかにコードから削除し、 設定も整理する必要がある
  10. 悪い Feature Flag に対する解消法(案) • 定期的な不要な Flag の処理 ◦ Agent

    (Devin など)が Feature Flag を参照して 利用していない Flag を定期的に削除をする ◦ 「使っていない Flag を洗い出し、 対象の処理に関する Feature Flag の機能を 削除してください」 • Feature Flag 自体を GitOps で管理する https://speakerdeck.com/biwashi/cloudnative-days-summer-2024-declarative-aggregated-management-of-feature-flags-using-openfeature-and-aut o-generation?slide=44
  11. Feature Flag について Feature Flag の導入に伴う課題 • Feature Flag provider

    における実装差異 • ベンダーロックインによる恐怖
  12. Feature Flag について Feature Flag の導入に伴う課題 • Feature Flag provider

    における実装差異 • ベンダーロックインによる恐怖 OpenFeature による標準化
  13. OpenFeature とは Cloud Native Computing Foundation(CNCF) の Feature Flagging 機能の一つ

    定義 Feature Flag のためのオープンスタンダードな APIを提供する 目的 ベンダーロックインの回避、Feature Flag 管理の標準化
  14. OpenFeature が提供している言語、環境 • .NET • Go • Java • Node.js

    ◦ Nest.js • PHP • Python • Ruby • Rust • Android • iOS • Web ◦ React ◦ Angular
  15. OpenFeature に沿って提供している Provider • GO Feature Flag • DevCycle •

    Kameleoon • flagd • ConfigCat • LaunchDarkly • Confidence by Spotify • Flipt • GrowthBook • CloudBees • Flagsmith • Split • VWO • Environment Variable • FeatBit • OFREP • Multi-Provider • Statsig • Tggl • Unleash • Bucket • Hypertune • PostHog • AB Tasty • AWS SSM • Bucketeer • ConfigBee • Harness
  16. OpenFeature の仕様 https://openfeature.dev/specification/ • Evaluation Context • Hooks • Events

    • Tracking hardening experimental stable • Evaluation API • Providers これらの機能は高い信頼 を持って本番環境で使用で きます。 これらの機能は本番環境での 使用に適しています。 これらの機能は実験環境での使用 に適しています。
  17. OpenFeature を使った実装例 設定 @Bean public Client openFeatureClient(String featureProviderName) { OpenFeatureAPI

    api = OpenFeatureAPI.getInstance(); // provider のセット return api.getClient(); }
  18. OpenFeature を使った実装例 設定 if (devcycleApiKey != null && !devcycleApiKey.isBlank()) {

    DevCycleCloudClient client = new DevCycleCloudClient(devcycleApiKey); api.setProvider(client.getOpenFeatureProvider()); } FlagdOptions flagdOptions = FlagdOptions.builder() .host(flagdHost) .port(flagdPort) .deadline(flagdTimeout) .resolverType(Config.Resolver.RPC) .build(); FlagdProvider flagdProvider = new FlagdProvider(flagdOptions); api.setProvider(flagdProvider);
  19. OpenFeature を使った実装例 Evaluation @GetMapping("/") public String index() { boolean showHello

    = this.openFeatureClient.getBooleanValue( "showHello", false, new ImmutableContext(Map.of("user_id", new Value("user_id")))); System.out.println("showHello: " + showHello); return "forward:/index.html"; } Boolean 以外に Object や String, Integer, Double で取得可能
  20. OpenFeature を使った実装例 Evaluation @GetMapping("/") public String index() { FlagEvaluationDetails<Boolean> showHelloDetails

    = this.openFeatureClient.getBooleanDetails( "showHello", false, new ImmutableContext(Map.of("user_id", new Value("user_id")))); System.out.println("showHello: %s, %s".formatted(showHelloDetails.getValue(), showHelloDetails.getReason())); return "forward:/index.html"; }
  21. OpenFeature を使った実装例 設定 フロント import { OpenFeature, OpenFeatureProvider } from

    '@openfeature/react-sdk'; import DevCycleReactProvider from '@devcycle/openfeature-react-provider' await OpenFeature.setContext({ user_id: 'user_id' }) await OpenFeature.setProviderAndWait(new DevCycleReactProvider("DEV_CYCLE_CLIENT_KEY")); import { OpenFeature, OpenFeatureProvider } from '@openfeature/react-sdk'; import { FlagdWebProvider } from '@openfeature/flagd-web-provider' OpenFeature.setProvider(new FlagdWebProvider({ host: 'localhost', port: 8013, tls: false, maxRetries: 10, maxDelay: 3000, }));
  22. OpenFeature を使った実装例 Evaluation フロント import { OpenFeatureProvider, useBooleanFlagValue } from

    '@openfeature/react-sdk'; ReactDOM.createRoot(document.getElementById('root')).render( <OpenFeatureProvider> <App /> </OpenFeatureProvider> ); const App = () => { const flag = useBooleanFlagValue('showHello', false) return flag ? 'true' : 'false' }; useXXXXFlagDetails もあるのでエラー調査も可能
  23. 構成例(Flagd) { "flags": { "showHello": { "state": "ENABLED", "variants": {

    "on": true, "off": false }, "defaultVariant": "on" } } } docker run --rm -p 8013:8013 -v $(pwd)/flags.json:/flags.json ghcr.io/open-feature/flagd:latest start --uri file:/flags.json --port 8013
  24. まとめ • Feature Flag を使った開発のメリットとデメリットの共有 ◦ Feature Flag は高頻度でデプロイを行っていくうえで有用 ◦

    使いすぎると複雑度が上がるため、定期的なリファクタが必要 • OpenFeature を使うことで開発速度を向上させるための 一助にする ◦ 使い方自体は難しくはない ◦ ベンダーロックインの回避、自作による拡張が可能
  25. 参考文献 1. Feature Toggles (aka Feature Flags) a. https://martinfowler.com/articles/feature-toggles.html 2.

    OpenFeature a. https://openfeature.dev/docs/reference/intro 3. OpenFeatureと自動生成を活用したフィーチャーフラグの宣言的集約管理 a. https://speakerdeck.com/biwashi/cloudnative-days-summer-2024 -declarative-aggregated-management-of-feature-flags-using-ope nfeature-and-auto-generation 4. Demo code a. https://github.com/SatohJohn/jjug-2025-spring