段階的な機能のロールアウトを使用する

このガイドでは、App Lifecycle Manager の機能フラグを使用して、段階的な機能ロールアウトを構成して実行する方法について説明します。ターゲティング属性の定義方法、割合ベースの割り当ての構成方法、段階的なロールアウトを安全に実行する方法について説明します。

ここでは、トラフィックの 1% に対してのみ enhanced-search アルゴリズムを有効にし、残りの 99% は標準検索を継続するシナリオを想定します。この 1% のトラフィックは、属性 userID によってランダム化されます。

前提条件

始める前に、標準のクイックスタートのいずれかを完了して、ベースライン インフラストラクチャまたはスタンドアロンのフィーチャー トグル リソースをプロビジョニングしていることを確認してください。

フラグをアプリケーションに統合する

ユーザーデータに基づく割合ベースの割り当てをサポートするには、評価メソッドを呼び出す前に、実行時に属性値(userID など)を OpenFeature 評価コンテキストに付加する必要があります。

次の例は、初期化されたクライアントを取得し、ターゲット設定コンテキストを付加してフラグを評価する方法を示しています。

```go import ( "context" "fmt" "log"

"github.com/open-feature/go-sdk/pkg/openfeature"

)

// ユーザー ID の例 - 実際のアプリケーションでは、これはリクエスト コンテキストから取得されます。 var userID = "example-user-123"

// 1. クライアントを取得します。 client := openfeature.NewClient("simple-api")

// 2. ユーザーデータを含む評価コンテキストを作成する evalCtx := openfeature.NewEvaluationContext( userID, map[string]interface{}{ "userID": userID, // userID が動的に渡されるようにする }, )

// 3. フラグを評価する(到達不能の場合はデフォルトで false) isEnhanced, err := client.BooleanValue(context.Background(), "enhanced-search", false, evalCtx) if err != nil { log.Printf("フラグの評価に失敗しました: %v", err) }

// 4. ビジネス ロジックを実行します。 if isEnhanced { log.Printf("ユーザー %s の拡張検索アルゴリズム", userID) } else { log.Printf("ユーザー %s の標準検索アルゴリズム", userID) } </devsite-tab> <devsite-tab title="Java">java // 1. クライアントを取得する var client = OpenFeatureAPI.getInstance().getClient("simple-api");

// 2. ユーザーデータを使用して評価コンテキストを作成する var context = new dev.openfeature.sdk.MutableContext(); context.add("userID", userID);

// 3. フラグを評価する boolean isEnhanced = client.getBooleanValue("enhanced-search", false, context);

// 4. ビジネス ロジックを実行する if (isEnhanced) { System.out.println("Executing enhanced search algorithm..."); } else { System.out.println("Executing standard search algorithm..."); } </devsite-tab> <devsite-tab title="Python">python import openfeature from openfeature.evaluation_context import EvaluationContext

1. クライアントの取得

client = openfeature.api.get_client()

2. ユーザーデータを使用して評価コンテキストを作成する

eval_ctx = EvaluationContext( targeting_key=str(user_id), attributes={ "userID": user_id,
} )

3. 評価フラグ

is_enhanced = client.get_boolean_value( "enhanced-search", False, eval_ctx )

4. ビジネス ロジックを実行する

if is_enhanced: print(f"Executing enhanced search for user {user_id}") else: print(f"Executing standard search for user {user_id}") ```

フラグの動作を構成する

ランダム化された属性パラメータを定義し、フィーチャー トグル リソースの割合ベースの割り当てルールに関連付けます。

  1. ターゲティング属性を作成する: userID 属性リソースをグローバルに定義して、ターゲティング評価用に登録します。

    gcloud beta app-lifecycle-manager flags attributes create "user-id-attr" \
      --key="userID" \
      --attribute-value-type="STRING" \
      --location="global"
    
  2. フィーチャー トグルの割り当てルールを定義する: userID でランダム化された enabled バリアントに 1% の重みを割り当てるフィーチャー トグル リソースを作成します。

    gcloud beta app-lifecycle-manager flags create "enhanced-search" \
      --key="enhanced-search" \
      --flag-value-type=BOOL \
      --location="global" \
      --unit-kind="demo-test-unitKind" \
      --variants='[ { "id": "Enabled", "booleanValue": true }, { "id": "Disabled", "booleanValue": false } ]' \
      --evaluation-spec='{
        "allocations": [{
          "id": "percentage-rollout",
          "randomizedOn": "userID",
          "slots": [
            {"variant": "enabled", "weight": 1},
            {"variant": "disabled", "weight": 99}
          ]
        }],
        "defaultTarget": "percentage-rollout",
        "attributes": ["projects/PROJECT_ID/locations/global/flagAttributes/user-id-attr"]
      }' \
    

フラグ構成のロールアウトを作成する

新しく作成した段階的割り当てルールを安全に配布するには、標準の不変ロールアウト フェーズを進めます。

  1. リビジョンを作成する: 1% の割り当て構成のスナップショットをキャプチャします。

    gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \
       --location="global" \
       --flag="enhanced-search"
    
  2. リリースを作成する: ユニットの種類に対してデプロイするリビジョンをパッケージ化します。

    gcloud beta app-lifecycle-manager flags releases create "release-of-enhanced-search" \
       --location="global" \
       --unit-kind="demo-test-unitkind" \
       --flag-revisions="enhanced-search-rev-1"
    
  3. ロールアウトを開始する: オーケストレーション戦略を定義し、構成をデプロイします。

    gcloud beta app-lifecycle-manager rollout-kinds create "rollout-kind-of-enhanced-search" \
       --unit-kind="demo-test-unikind" \
       --rollout-orchestration-strategy="Google.Cloud.Simple.AllAtOnce" \
       --location="global"
    
    gcloud beta app-lifecycle-manager rollouts create "rollout-of-enhanced-search" \
       --flag-release="release-of-enhanced-search" \
       --rollout-kind="rollout-kind-of-enhanced-search" \
       --location="global"
    
  4. ロールアウトをモニタリングする: デプロイが SUCCEEDED 状態に達したことを確認します。

    gcloud beta app-lifecycle-manager rollouts describe "rollout-of-enhanced-search" \
       --location="global"
    

フラグのターゲット設定を更新する

1% のロールアウトが成功し、安定していると判断されたら、フラグの内部割り当ての重みを更新して(50% など)、ロールアウトの割合を拡大します。

  1. フラグの仕様を更新します。割り当てスロットを 50% 有効、50% 無効に変更します。

    gcloud beta app-lifecycle-manager flags update "enhanced-search" \
      --evaluation-spec='{
        "allocations": [{
          "id": "percentage-rollout",
          "randomizedOn": "userID",
          "slots": [
            {"variant": "enabled", "weight": 50},
            {"variant": "disabled", "weight": 50}
          ]
        }],
        "defaultTarget": "percentage-rollout",
        "attributes": ["projects/PROJECT_ID/locations/global/flagAttributes/user-id-attr"]
      }'
    
  2. 拡張機能をデプロイする: ライフサイクルに沿って、更新された重みを接続されたクライアントに配布します。

    gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-2" \
       --location="global" \
       --flag="enhanced-search"
    
    gcloud beta app-lifecycle-manager flags releases create "enhanced-search-50pct" \
       --location="global" \
       --unit-kind="demo-test-unitkind" \
       --flag-revisions="enhanced-search-rev-2"
    
    gcloud beta app-lifecycle-manager rollouts create "rollout-of-enhanced-search-50pct" \
       --flag-release="enhanced-search-50pct" \
       --rollout-kind="rollout-kind-of-enhanced-search" \
       --location="global"
    

    このオペレーションは、機能が 100% のデプロイに達するまで継続的に繰り返すことができます。

フラグを廃止する

curl --request POST
"https://saasservicemgmt.googleapis.com/v1beta1/projects/PROJECT_ID/locations/global/flagReleases?flagReleaseId=obsolete-enhanced-search"
--header "Authorization: Bearer $(gcloud auth application-default print-access-token)"
--header "Content-Type: application/json"
--header "Accept: application/json"
--data "{ "unitKind": "projects/PROJECT_ID/locations/global/unitKinds/UNIT_KIND_ID", "obsoleteFlags": ["projects/PROJECT_ID/locations/global/flags/enhanced-search"] }"

フィーチャー トグルのロールアウトが完了し、標準の運用動作として機能するようになったら、安全に廃止する必要があります。

  1. アプリケーションから削除: アプリケーションのコードベースからすべてのフラグ評価条件ロジックを削除し、更新されたペイロードを本番環境にデプロイします。
  2. クリーンアップ用にマーク: フラグの状態を CLEANUP に設定して、プロビジョニング解除の意図を明示的に示します。
  3. 最終ロールアウトをデプロイする: 最終ロールアウトを実行して、バックエンド構成を明示的に使用不可にします。その後、管理プレーンからフラグとリビジョンのメタデータを安全に削除できます。