マルチテナント アーキテクチャに機能フラグを使用する

このガイドでは、既存のバイナリ デプロイ プロセスを変更せずに、マルチテナント環境で App Lifecycle Manager の機能フラグを実装する方法について説明します。

前提条件

始める前に、次のものを用意してください。

  1. 機能フラグのデプロイのクイックスタートを完了している。
  2. App Lifecycle Manager リソースを管理するように構成された gcloud 環境。
  3. 既存の SaaS サービス。SaaS サービスを作成する方法について詳しくは、SaaS サービスを作成するをご覧ください。

リソース モデリング

マルチテナント設定では、サービスまたはアプリケーションのユニットの種類と、サービスまたはアプリケーションのインスタンス(テナントまたはデプロイを表す)ごとにユニットを定義することをおすすめします。

マルチテナント環境で機能フラグを実装するには、テナントを識別する Common Expression Language(CEL)属性を定義し、実行時にテナント ID を挿入するようにアプリケーションを構成し、評価ルールを使用して特定のテナントの機能に影響を与えます。

簡単なケースでは、顧客ごとに個別のロールアウトを手動で作成することもできます。

1. SaaS サービスを作成する(まだ作成していない場合)

gcloud beta app-lifecycle-manager saas create "SAAS_NAME" \
    --project="PROJECT_ID" \
    --location="global" \
    --locations=name="LOCATION_1"

2. UnitKind を作成する

gcloud beta app-lifecycle-manager unit-kinds create "tenant-service-kind" \
    --project="PROJECT_ID" \
    --location="global" \
    --saas="SAAS_NAME"

3. テナントのユニットを作成する

ユニットを作成するときは、ラベルを使用して、テナント サービスをグループ(group=betagroup=previewgroup=all など)に分類します。

# Create a unit for Tenant A (Beta group)
gcloud beta app-lifecycle-manager units create "tenant-a-service" \
    --unit-kind="tenant-service-kind" \
    --location="LOCATION_1" \
    --labels="group=beta"

# Create a unit for Tenant B (Standard group)
gcloud beta app-lifecycle-manager units create "tenant-b-service" \
    --unit-kind="tenant-service-kind" \
    --location="LOCATION_1" \
    --labels="group=all"

属性とフラグを定義する

評価ルールの型安全性を確保するには、属性(customerID など)を正式に定義する必要があります。

1. customerID 属性を作成する

gcloud beta app-lifecycle-manager flags attributes create "customer-id-attr" \
    --key="customerID" \
    --attribute-value-type="STRING" \
    --location=global

2. フィーチャー トグルを作成する

gcloud beta app-lifecycle-manager flags create "enhanced-search" \
    --key="enhanced-search" \
    --flag-value-type=BOOL \
    --unit-kind="tenant-service-kind"

アプリケーションの統合

OpenFeature SDK をサービスに統合します。アプリケーションは、実行時に customerID をコンテキストに挿入する必要があります。

Go の例:

// Inject customerID into the evaluation context
evalCtx := map[string]any{
    "customerID": currentTenant.ID,
}

// Evaluate the flag
isEnabled, err := client.BooleanValue(
    context.Background(),
    "enhanced-search",
    false,
    evalCtx,
)

テナント固有のターゲティングを構成する

評価ルールを使用して、特定の顧客に対して機能を有効にします。

gcloud beta app-lifecycle-manager flags update "enhanced-search" \
    --location="global"
    --evaluation-spec='{
      "rules": [{
        "id": "allowlist-for-premium-tenants",
        "condition": "customerID in [\"tenant-xyz-123\", \"tenant-abc-789\"]",
        "target": "Enabled"
      }],
      "defaultTarget": "Disabled",
      "attributes": ["projects/PROJECT_ID/locations/global/flagAttributes/customer-id-attr"]
    }'

フィルタを使用した手動の段階的展開

よりシンプルなユースケースでは、顧客ラベルごとに個別のロールアウトを手動でトリガーすることで、ウェーブをエミュレートできます。

1. リビジョンを作成してリリースする

# Create a Revision (Snapshot)
gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \
    --location=global \
    --flag="enhanced-search"

# Create a Release
gcloud beta app-lifecycle-manager flags releases create "release-of-enhanced-search" \
    --location=global \
    --unit-kind="tenant-service-kind" \
    --revisions="enhanced-search-rev-1"

2. 手動ロールアウトをトリガーする

--unit-filter を使用してターゲット グループごとに個別のオペレーションをトリガーすることで、ロールアウトを手動でオーケストレートできます。

# Rollout to Beta group first
gcloud beta app-lifecycle-manager rollouts create "beta-rollout" \
    --flag-release="release-of-enhanced-search" \
    --rollout-kind="rollout-kind-of-enhanced-search" \
    --location=global \
    --rollout-orchestration-strategy="Google.Cloud.Simple.AllAtOnce" \
    --unit-filter="labels.group == beta"

# After verification, rollout to the rest of the fleet
gcloud beta app-lifecycle-manager rollouts create "full-rollout" \
    --flag-release="release-of-enhanced-search" \
    --rollout-kind="rollout-kind-of-enhanced-search" \
    --location=global \
    --rollout-orchestration-strategy="Google.Cloud.Production" \
    --unit-filter="labels.group == all"

次のステップ