このガイドでは、既存のバイナリ デプロイ プロセスを変更せずに、マルチテナント環境で App Lifecycle Manager の機能フラグを実装する方法について説明します。
前提条件
始める前に、次のものを用意してください。
- 機能フラグのデプロイのクイックスタートを完了している。
- App Lifecycle Manager リソースを管理するように構成された
gcloud環境。 - 既存の 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=beta、group=preview、group=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"
次のステップ
- テストと A/B テストについて学習します。
- トラブルシューティングについて学習する。