Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新

Dec 11, 2025 - 日記

Bucketeer:オープンソースで実現する高度なフィーチャーフラグ・A/Bテストプラットフォーム

bucketeer-feature-flag-platform cover image

フィーチャーフラグ(Feature Flag)は、デプロイとリリースを分離し、リスクを最小化しながら機能を段階的にリリースするための強力なツールです。しかし、既存のSaaSソリューション(LaunchDarklySplit.ioOptimizely など)は高額な月額料金(月数十万円〜)や評価回数の制限があり、大規模なプロジェクトでは導入が難しいケースも少なくありません。

そんな課題を解決するのが、今回紹介する**Bucketeer **です。これは株式会社サイバーエージェント が開発したオープンソースのフィーチャーフラグ・A/Bテストプラットフォームで、セルフホスティングによる完全なデータコントロールと、エンタープライズグレードの機能を組み合わせています。

Bucketeerとは

Bucketeerは、高度なフィーチャーフラグ管理とA/Bテストを実現するオープンソースプラットフォームです。株式会社サイバーエージェントの本番環境で実際に運用されており、1億人以上のユーザー、月間数十億回の評価を処理する実績があります。

主な特徴

  • セルフホスティング:データは完全に自社インフラ内で管理され、ベンダーロックインの心配がありません
  • コスト効率:ユーザー数や評価回数による課金がなく、インフラコストのみで運用できます
  • 高度な機能:段階的ロールアウト、ベイズ統計によるA/Bテスト、自動化オペレーションなど、有料SaaSでしか提供されない機能が標準装備
  • スケーラビリティ:小規模開発はDocker Composeで、大規模本番環境はKubernetesで、規模に応じた柔軟なデプロイが可能

他のツールにはないユニークな機能

Bucketeerには、他のフィーチャーフラグツールには見られない独自の強力な機能があります。

フラグベースのターゲティングルール

あるフラグの評価結果を、別のフラグのターゲティング条件として使用できます。例えば「フラグBでnew-designバリエーションが返されたユーザーにのみ、フラグAのプレミアム機能を表示する」といった高度なターゲティングが可能です。

これはPrerequisites(前提条件)とは異なります。Prerequisitesはフラグ評価の前に必須条件をチェックし、条件を満たさない場合はOFFバリエーションを返しますが、フラグベースルールは別のフラグの評価結果を条件として動的にターゲティングを行います。

スプリットオーディエンスロールアウト

ネストされた実験を実行できる機能です。例えば「全体の5%のユーザーに対して、50/50のA/Bテストを実施する」といった精密なコントロールが可能です。これにより、リスクを最小限に抑えながら複雑な実験デザインを実現できます。

ベイズ統計によるA/Bテスト

一般的なフリークエンティスト統計(頻度主義)ではなく、ベイズ統計を採用しているのもBucketeerの大きな特徴です。

ベイズ統計の利点:

  • 少ないサンプルサイズで結果が得られる:実験期間を短縮し、コストを削減
  • より信頼性の高い意思決定:「どちらが優れているか」という確率を直接計算
  • リアルタイム分析:実験進行中も統計的有意性をリアルタイムで確認可能

セットアップ方法

Bucketeerは、Docker ComposeとKubernetesの2つのデプロイ方法をサポートしています。

Docker Composeでの簡易セットアップ

ローカル開発や小規模チームには、Docker Composeが最適です。

git clone https://github.com/bucketeer-io/bucketeer.git
cd bucketeer
make docker-compose-up

これだけで、MySQL、Redis、Bucketeerプラットフォームのすべてのサービスが起動します。

次に、/etc/hostsに以下を追加してください:

127.0.0.1 web-gateway.bucketeer.io
127.0.0.1 api-gateway.bucketeer.io

管理ダッシュボードには https://web-gateway.bucketeer.io でアクセスできます。

Kubernetesでの本番環境セットアップ

高可用性とスケーラビリティが必要な本番環境では、Kubernetesデプロイメントを使用します:

helm install bucketeer ./manifests/bucketeer -n bucketeer \
  --values ./manifests/bucketeer/values.prod.yaml

Kubernetes版では以下の機能が利用できます:

  • マルチインスタンス構成による高可用性
  • マイクロサービスアーキテクチャによる独立したスケーリング
  • GCP Pub/SubとBigQueryによるイベント処理(標準構成)
  • Redisによるマルチレイヤーキャッシング

GCP以外の環境(AWS EKS、Azure AKS、オンプレミスなど)でも、MySQL + Redisのみを使用するLite版で動作します。

基本的な使い方

1. フィーチャーフラグの作成

管理ダッシュボードから新しいフラグを作成します。フラグにはキー(識別子)、名前、説明、バリエーション(ON/OFFや複数の値)を設定できます。

2. ターゲティングルールの設定

以下のような条件でユーザーをターゲティングできます:

  • ユーザー属性(国、言語、バージョンなど)
  • カスタムセグメント(CSVアップロードも可能)
  • 他のフラグの評価結果(フラグベースルール)
  • ランダムな割合(段階的ロールアウト)

3. SDKの統合

Bucketeerは主要なプラットフォームとプログラミング言語に対応したSDKを提供しています:

クライアントサイドSDK(サーバーで評価):

  • Android(Kotlin/Java)
  • iOS(Swift)
  • JavaScript
  • Flutter
  • React
  • React Native

サーバーサイドSDK(ローカル or リモート評価):

  • Go
  • Node.js

OpenFeature対応:ベンダー中立なOpenFeature 標準もサポートしています。

4. コード例(Go SDK)

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/bucketeer-io/go-server-sdk/pkg/bucketeer"
    "github.com/bucketeer-io/go-server-sdk/pkg/bucketeer/user"
)

func main() {
    // SDKクライアントの初期化
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    
    client, err := bucketeer.NewSDK(
        ctx,
        bucketeer.WithAPIKey("your-api-key"),
        bucketeer.WithAPIEndpoint("api-gateway.bucketeer.io:443"),
        bucketeer.WithTag("your-feature-tag"), // 推奨: パフォーマンス向上のため
    )
    if err != nil {
        log.Fatalf("Failed to initialize SDK: %v", err)
    }
    defer client.Close(ctx)

    // ユーザー属性の設定(オプション)
    attributes := map[string]string{
        "country":      "JP",
        "app_version":  "1.0.0",
        "device_model": "pixel-5",
    }
    
    // ユーザーの作成
    user := user.NewUser(
        "user-id-12345",
        attributes,
    )

    // フィーチャーフラグの評価
    showNewFeature := client.BoolVariation(
        context.Background(),
        user,
        "new-feature-flag",
        false, // デフォルト値
    )

    if showNewFeature {
        fmt.Println("新機能を表示します")
        // 新機能のコード
    } else {
        fmt.Println("従来機能を表示します")
        // 従来機能のコード
    }

    // ゴールイベントの記録(A/Bテスト用)
    client.Track(context.Background(), user, "conversion")
    
    // アプリケーション終了時のリソース解放
    if err := client.Close(ctx); err != nil {
        log.Printf("Failed to close client: %v", err)
    }
}

5. 段階的ロールアウトの設定

Auto Operations機能を使って、時間をかけて段階的にフラグを有効化できます:

  1. ダッシュボードで「Auto Operations」を選択
  2. Progressive Rolloutテンプレートを選択
  3. スケジュール(1時間ごと、1日ごと、1週間ごと)と増分(例:毎日10%ずつ)を設定
  4. 自動的にフラグが段階的にロールアウトされます

エラー率が閾値を超えた場合に自動でフラグをOFFにする設定も可能です。

A/Bテストの実施

1. 実験の作成

フラグを作成後、「Experiment」セクションで実験を設定します:

  • ゴールの定義:コンバージョン率、クリック率など測定したい指標を設定
  • バリエーション:テストしたい複数のバージョンを定義(A/Bだけでなく、A/B/C/Dも可能)
  • トラフィック配分:各バリエーションに割り当てるユーザー比率を設定

2. ゴールイベントの記録

SDKからゴールイベントをトラッキングします:

// ユーザーがコンバージョンした際に記録
client.Track(context.Background(), user, "purchase")

3. 結果の分析

ダッシュボードでリアルタイムに以下を確認できます:

  • 各バリエーションのパフォーマンス
  • ベイズ統計による勝率
  • 統計的有意性
  • コンバージョン率

ベイズ分析により、従来の統計手法より早く信頼性の高い結果が得られます。

インテリジェントな自動化

Flag Lifecycle Alerts

Bucketeerは、7日間以上リクエストのないフラグを自動検出し、Slackに通知します。これにより以下のメリットがあります:

  • 技術的負債の削減:不要なフラグを早期に発見・削除
  • パフォーマンス向上:未使用フラグの評価処理を削減し、レイテンシを改善
  • コードベースのクリーン化:定期的なフラグメンテナンスを促進

Code References

ソースコード内でフラグが使用されている箇所を自動検出する機能も備えており、安全なフラグ削除とライフサイクル管理をサポートします。

Webhook Triggers

CI/CDパイプラインやAPMツール(DatadogNew RelicDynatrace など)と連携し、外部イベントに基づいてフラグを制御できます。

AIを活用したワークフロー

Bucketeerは、Model Context Protocol(MCP) サーバーを提供しており、Claude、ChatGPTなどのAIアシスタントからフラグを管理できます:

これにより、自然言語でフラグを操作したり、ベストプラクティスをAIに質問したりできます。

セキュリティとガバナンス

エンタープライズ環境で求められるセキュリティ機能も充実しています:

  • ロールベースアクセス制御(RBAC):環境ごとにViewer、Editor、Ownerロールを設定
  • 完全な監査ログ:すべての変更履歴(誰が、いつ、何を、なぜ変更したか)を記録
  • APIキー管理:Client、Server、Public APIの3種類のキーで細かくアクセス制御
  • 環境分離:プロジェクトと環境間で完全なデータ分離

他のツールとの比較

SaaSソリューションとの比較

代表的なSaaSソリューション(LaunchDarkly、Split.io、Optimizelyなど)と比較すると、Bucketeerには以下のような優位性があります:

項目Bucketeer (セルフホスト)一般的なSaaS(LaunchDarkly等)
コストインフラコストのみ月額数十万円〜(ユーザー数・評価回数で課金)
データ管理完全に自社管理ベンダーのサーバー
スケーリング無制限プランに応じた制限あり
カスタマイズソースコード変更可能提供機能のみ
エンタープライズ機能すべて標準装備高額プランでのみ提供

参考:一般的なSaaSソリューションでは、例えばLaunchDarklyのエンタープライズプランは月額3,000ドル以上、Split.ioも同様の価格帯からスタートします。評価回数が多い大規模サービスでは、月額料金がさらに高額になる傾向があります。

オープンソース代替との比較

既存のオープンソースフィーチャーフラグツールと比較して、Bucketeerの優位性は以下の点です:

  • ベイズ統計によるA/Bテスト:少ないサンプルで高精度な結果
  • フラグベースルール:フラグ間の複雑な依存関係を表現
  • スプリットオーディエンス:ネストされた実験デザイン
  • 洗練されたUI/UX:非エンジニアでも使いやすいダッシュボード
  • 本番環境での実績:1億ユーザー、月間数十億評価のスケール実績

まとめ

Bucketeerは、エンタープライズグレードのフィーチャーフラグとA/Bテストを、オープンソース・セルフホスティングで実現するプラットフォームです。

こんなチーム・プロジェクトにおすすめ

  • LaunchDarklyやSplit.ioなどのSaaSソリューションのコストに悩んでいるチーム
  • データ主権やコンプライアンス要件がある組織
  • 大規模なユーザーベースを持ち、評価回数の課金が高額になる場合
  • 高度な実験機能(ベイズ統計、ネストされた実験)が必要なプロダクト
  • セキュリティやガバナンスを重視するエンタープライズ環境

Docker Composeで簡単に始められるので、まずはオンラインデモ を試してから、ローカル環境で動かしてみることをお勧めします。

公式ドキュメント には、SDKの使い方、ベストプラクティス、詳細なデプロイガイドが充実していますので、ぜひ参照してください。

参考リンク