Usar flags de recursos para arquitetura multilocatária

Este guia explica como implementar flags de recursos do App Lifecycle Manager em um ambiente multilocatário sem modificar o processo de implantação binária atual.

Pré-requisitos

Antes de começar, verifique se você atende a estes requisitos:

  1. Concluiu o guia de início rápido de implantação de flags de recursos.
  2. Tem um ambiente gcloud configurado para gerenciar recursos do App Lifecycle Manager.
  3. Tem uma oferta de SaaS. Para mais informações sobre como criar uma oferta de SaaS, consulte Criar uma oferta de SaaS.

Modelagem de recursos

Em uma configuração multilocatária, recomendamos que você defina um tipo de unidade para seu serviço ou aplicativo e uma unidade para cada instância do serviço ou aplicativo (que representa um locatário ou implantação).

Para implementar flags de recursos em um ambiente multilocatário, defina atributos da Common Expression Language (CEL, na sigla em inglês) que identifiquem seus locatários, configure o aplicativo para injetar identificadores de locatários no ambiente de execução e use regras de avaliação para afetar recursos de locatários específicos.

Para casos mais simples, também é possível criar lançamentos separados para cada cliente.

1. Criar uma oferta de SaaS (se ainda não tiver feito isso)

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

2. Criar um UnitKind

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

3. Criar unidades para locatários

Ao criar unidades, use rótulos para categorizar os serviços de locatários em grupos (por exemplo, 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"

Definir atributos e flags

É necessário definir formalmente os atributos (como customerID) para garantir a segurança de tipo nas regras de avaliação.

1. Criar o atributo customerID

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

2. Criar a flag de recurso

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

Integração do aplicativo

Integre o SDK do OpenFeature ao seu serviço. O aplicativo precisa injetar o customerID no contexto no ambiente de execução.

Exemplo de 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,
)

Configurar a segmentação específica do locatário

Use regras de avaliação para ativar um recurso para clientes específicos.

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"]
    }'

Lançamento gradual manual com filtros

Para casos de uso mais simples, é possível emular ondas acionando lançamentos separados manualmente para cada rótulo de cliente.

1. Criar revisão e lançamento

# 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. Acionar lançamentos manuais

É possível orquestrar manualmente o lançamento acionando operações separadas por grupo de destino usando --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 seguir