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

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

기본 요건

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

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

리소스 모델링

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

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

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

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"

다음 단계