Slide 1

Slide 1 text

Feature Flag 開発を標準化し、加速させる OpenFeature を導入する JJUG CCC 2025 Spring 株式会社スリーシェイク Sreake事業部 佐藤慧太 Copyright © 3-shake, Inc. All Rights Reserved.

Slide 2

Slide 2 text

自己紹介 佐藤 慧太@SatohJohn ● 2012/4 フリュー株式会社 入社 ToC 向けのアプリケーション開発を 10年ほど経験 リードエンジニアとして 0からサービスを 設計開発運用を経験 ● 2023/1 株式会社スリーシェイク 入社 SRE として労苦 を減らす仕事に従事 Google Cloud Partner Top Engineer ’24、’25 選出 Google Cloud で生成 AI とかやってます

Slide 3

Slide 3 text

自己紹介 佐藤 慧太@SatohJohn ● 好きなもの ○ Google Cloud ○ TypeScript, Kotlin 最近は Python メイン ● 活動範囲 ○ Jaguerクラウドネイティブ分科会 自社イベント SRETTなどの運営 ● 最近の悩み ○ 娘が保育園からもってくる病気と運動不足によるお腹 のお肉

Slide 4

Slide 4 text

このセッションで話すこと 1. Feature Flag について a. メリット、デメリット b. Flag の種類と、ユースケース c. 悪いFeature Flag 2. OpenFeature について a. メリット、デメリット b. 仕様の説明、実装方法 3. Google Kubernetes Engine 上でのデモ

Slide 5

Slide 5 text

このセッションで話さないこと 1. Kubernetes での Controller の細かい挙動 2. CI/CD での細かい連携方法について 3. Feature Flag と OpenFeature についてのめっちゃ詳しい話 4. Four Keys の詳しい話

Slide 6

Slide 6 text

今回の話はどんな人に効くのか こんな経験ありませんか? ● 事業のインパクトとしてマージができない ○ 調整してたらリリースブランチとの 差分多くなってしまったので再テスト ● 機能の切り替えを行い効果測定したい(A/Bテスト) ● 機能追加に失敗したので早くロールバックをしたい など

Slide 7

Slide 7 text

このセッションで伝えたいこと 1. Feature Flag を使った開発のメリットとデメリットの共有 2. OpenFeature を使うことで開発速度を向上させるための 一助にする

Slide 8

Slide 8 text

Feature Flag 01 Copyright © 3-shake, Inc. All Rights Reserved.

Slide 9

Slide 9 text

そもそもの 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

Slide 10

Slide 10 text

Feature Flag の種類 https://martinfowler.com/articles/feature-toggles.html Release Experiment Ops Permission

Slide 11

Slide 11 text

Feature Flag の種類 https://martinfowler.com/articles/feature-toggles.html Release Experiment Ops Permission 継続的デリバリーを実践するチームにおいて、 トランクベースの開発を可能にする機能フラグです 多変量テストやA/Bテストを実行するために使用されます システムの動作における運用面を制御するために使用されます 特定のユーザーが利用できる機能や製品エクスペリエンスを変更するた めに使用されます

Slide 12

Slide 12 text

Feature Flag の種類 Short-lived Feature Flags 生存期間が短いFlag Long-lived Feature Flags 生存期間が長いFlag https://martinfowler.com/articles/feature-toggles.html

Slide 13

Slide 13 text

Feature Flag の種類 Static Feature Flag ON/OFFによる切り替え Dynamic Feature Flag ON/OFF以外による条件の切り替え https://martinfowler.com/articles/feature-toggles.html

Slide 14

Slide 14 text

Feature Flag のメリット デプロイとリリースを分離できる デプロイリスクの低減/ 開発ブランチの簡素化 /開発速度の向上 運用チームの負担を軽減できる 段階的なロールアウト/ 即時のロールバック/運用効率の向上 機能の公開範囲の指定ができる カナリアリリース、A/Bテストの容易化/ 機能のパーソナライズ

Slide 15

Slide 15 text

デプロイとリリースを分離できる ● デプロイは随時おこなう、リリースを運用チームのタイミングでおこう ○ ユーザに見えない状態として、CI が通る状態でデプロイ ○ メインブランチへの積極的マージによる開発速度の向上 ○ ロールバックもデプロイとは別に実施 ● サーキットブレーカとして利用する ○ サーバの負荷などを状態を受けて自動的に処理を遮断する Release Ops

Slide 16

Slide 16 text

機能の公開範囲の指定ができる ● 複数のバージョンの機能を比較し、効果の高い方を採用 ○ ランダムな A/B テストの表示 ○ ユーザの状態に応じた表示の切り替え ● RBAC のようにロールにおける権限値を設定し機能を切り替え Experiment Permission

Slide 17

Slide 17 text

Feature Flag のデメリット 条件が入ることによるコード の可読性の低下 フラグの組み合わせによる テストケースの増加 不要なフラグの定期的な削除 設定管理というコストの増加

Slide 18

Slide 18 text

Feature Flag のデメリット 条件が入ることによるコード の可読性の低下 フラグの組み合わせによる テストケースの増加 不要なフラグの定期的な削除 設定管理というコストの増加 設計などでのカバーはできるが ある一定は負荷としてかかる やはり銀の弾丸ではない

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

悪い 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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

OpenFeature 02 Copyright © 3-shake, Inc. All Rights Reserved.

Slide 24

Slide 24 text

OpenFeature とは Cloud Native Computing Foundation(CNCF) の Feature Flagging 機能の一つ 定義 Feature Flag のためのオープンスタンダードな APIを提供する 目的 ベンダーロックインの回避、Feature Flag 管理の標準化

Slide 25

Slide 25 text

OpenFeature とは 定義: Feature Flag のためのオープンスタンダードな API 目的: ベンダーロックインの回避、Feature Flag 管理の標準化 CN

Slide 26

Slide 26 text

OpenFeature が提供している言語、環境 ● .NET ● Go ● Java ● Node.js ○ Nest.js ● PHP ● Python ● Ruby ● Rust ● Android ● iOS ● Web ○ React ○ Angular

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

OpenFeature のエコシステム

Slide 29

Slide 29 text

OpenFeature のメリット 柔軟性 プロバイダーの自由な選択、 将来的な変更の容易化 保守性 標準化された API によるコード の可読性・保守性の向上 相互運用性 異なるシステム間での Feature Flag の共有

Slide 30

Slide 30 text

OpenFeature のデメリット まだ Experimental な機能が 多く今後 API が変わる可能性が ある プロバイダーを通した 実装のため、プロバイダーの 最新機能は利用できない

Slide 31

Slide 31 text

OpenFeature の仕様 https://openfeature.dev/specification/ ● Evaluation Context ● Hooks ● Events ● Tracking hardening experimental stable ● Evaluation API ● Providers これらの機能は高い信頼 を持って本番環境で使用で きます。 これらの機能は本番環境での 使用に適しています。 これらの機能は実験環境での使用 に適しています。

Slide 32

Slide 32 text

実装 03 Copyright © 3-shake, Inc. All Rights Reserved.

Slide 33

Slide 33 text

OpenFeature を使った実装例 設定 dependencies { implementation 'dev.openfeature:sdk:1.15.1' implementation 'dev.openfeature.contrib.providers:flagd:0.11.8' implementation 'com.devcycle:java-server-sdk:2.6.2' }

Slide 34

Slide 34 text

OpenFeature を使った実装例 設定 @Bean public Client openFeatureClient(String featureProviderName) { OpenFeatureAPI api = OpenFeatureAPI.getInstance(); // provider のセット return api.getClient(); }

Slide 35

Slide 35 text

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);

Slide 36

Slide 36 text

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 で取得可能

Slide 37

Slide 37 text

OpenFeature を使った実装例 Evaluation @GetMapping("/") public String index() { FlagEvaluationDetails 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"; }

Slide 38

Slide 38 text

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, }));

Slide 39

Slide 39 text

OpenFeature を使った実装例 Evaluation フロント import { OpenFeatureProvider, useBooleanFlagValue } from '@openfeature/react-sdk'; ReactDOM.createRoot(document.getElementById('root')).render( ); const App = () => { const flag = useBooleanFlagValue('showHello', false) return flag ? 'true' : 'false' }; useXXXXFlagDetails もあるのでエラー調査も可能

Slide 40

Slide 40 text

OpenFeature を使った実装例 Tracking this.openFeatureClient.track( "agent-response", new ImmutableContext("agent-response-ab"), new MutableTrackingEventDetails() .add("user_id", userId) .add("rate", request.rating()) .add("query", request.query()) );

Slide 41

Slide 41 text

構成例(Local)

Slide 42

Slide 42 text

構成例(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

Slide 43

Slide 43 text

構成例(DevCycle)

Slide 44

Slide 44 text

デモ 04 Copyright © 3-shake, Inc. All Rights Reserved.

Slide 45

Slide 45 text

デモ環境 ちなみに、ほとんど Cursor、jules に作ってもらいました https://www.cursor.com/ja https://jules.google/

Slide 46

Slide 46 text

デモストーリー Release Experiment AI チャットの機能のリリース AI Agent の様相の変更

Slide 47

Slide 47 text

ストーリー1 「新機能:ファイルのアタッチリリースだ!!」 「あ、バグがあった!!」 「高速ロールバック!!」 Release

Slide 48

Slide 48 text

ストーリー2 「Agent のユーザへの返答の文言を柔らかくして みたらどうなるか?元のものと比較してみよう」 「ユーザの行動の結果を見てみよう」 Experiment

Slide 49

Slide 49 text

まとめ 05 Copyright © 3-shake, Inc. All Rights Reserved.

Slide 50

Slide 50 text

まとめ ● Feature Flag を使った開発のメリットとデメリットの共有 ○ Feature Flag は高頻度でデプロイを行っていくうえで有用 ○ 使いすぎると複雑度が上がるため、定期的なリファクタが必要 ● OpenFeature を使うことで開発速度を向上させるための 一助にする ○ 使い方自体は難しくはない ○ ベンダーロックインの回避、自作による拡張が可能

Slide 51

Slide 51 text

まとめ ● 最近考えたこと ○ 今後の LLM や Agent を使った爆発的な開発速度を保ちつつ 適切にリリース/ロールバックを行うために Feature Flag を 使ったリリースがデフォルトになってくる?

Slide 52

Slide 52 text

ご清聴ありがとうございました Copyright © 3-shake, Inc. All Rights Reserved.

Slide 53

Slide 53 text

参考文献 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