멀티 테넌트 아키텍처에 기능 플래그 사용

이 가이드에서는 기존 바이너리 배포 프로세스를 수정하지 않고 멀티 테넌트 환경에서 App Lifecycle Manager 기능 플래그를 구현하는 방법을 설명합니다.

기본 요건

시작하기 전에 다음 사항을 확인하세요.

  1. 기능 플래그 배포 빠른 시작을 완료했습니다.
  2. App Lifecycle Manager 리소스를 관리하도록 구성된 gcloud 환경입니다.
  3. 기존 앱 제품입니다. 앱 제품을 만드는 방법에 대한 자세한 내용은 앱 제품 만들기를 참조하세요.

리소스 모델링

멀티 테넌트 설정에서는 서비스 또는 애플리케이션의 단위 종류와 모든 서비스 또는 애플리케이션 인스턴스 (테넌트 또는 배포를 나타냄)의 단위를 정의하는 것이 좋습니다.

멀티 테넌트 환경에서 기능 플래그를 구현하려면 테넌트를 식별하는 CEL (Common Expression Language) 속성을 정의하고, 런타임에 테넌트 식별자를 삽입하도록 애플리케이션을 구성하고, 평가 규칙을 사용하여 특정 테넌트의 기능에 영향을 줍니다.

더 간단한 경우 각 고객에 대해 별도의 출시를 수동으로 만들 수도 있습니다.

1. 앱 제품 만들기 (아직 만들지 않은 경우)

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"

Application Integration

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"

다음 단계