Utiliser des flags de fonctionnalité pour une architecture mutualisée

Ce guide explique comment implémenter des flags de fonctionnalité App Lifecycle Manager dans un environnement mutualisé sans modifier votre processus de déploiement binaire existant.

Prérequis

À vérifier avant de commencer :

  1. Vous avez suivi le guide de démarrage rapide Déployer des flags de fonctionnalité.
  2. Vous disposez d'un environnement gcloud configuré pour gérer les ressources App Lifecycle Manager.
  3. Vous disposez d'une offre SaaS existante. Pour en savoir plus sur la création d'une offre SaaS, consultez Créer une offre SaaS.

Modélisation des ressources

Dans une configuration mutualisée, nous vous recommandons de définir un type d'unité pour votre service ou application, ainsi qu'une unité pour chaque instance du service ou de l'application (représentant un locataire ou un déploiement).

Pour implémenter des flags de fonctionnalité dans un environnement mutualisé, définissez des attributs Common Expression Language (CEL) qui identifient vos locataires, configurez votre application pour qu'elle injecte des identifiants de locataire au moment de l'exécution et utilisez des règles d'évaluation pour affecter des fonctionnalités à des locataires spécifiques.

Dans les cas plus simples, vous pouvez également créer manuellement des déploiements distincts pour chaque client.

1. Créer une offre SaaS (si ce n'est pas déjà fait)

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

2. Créer un UnitKind

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

3. Créer des unités pour les locataires

Lorsque vous créez des unités, utilisez des libellés pour classer les services de locataire en groupes (par exemple, 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"

Définir des attributs et des flags

Vous devez définir formellement des attributs (tels que customerID) pour garantir la sûreté du typage dans les règles d'évaluation.

1. Créer l'attribut customerID

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

2. Créer le flag de fonctionnalité

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

Intégration d'applications

Intégrez le SDK OpenFeature à votre service. Votre application doit injecter le customerID dans le contexte au moment de l'exécution.

Exemple 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,
)

Configurer le ciblage spécifique au locataire

Utilisez des règles d'évaluation pour activer une fonctionnalité pour des clients spécifiques.

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

Déploiement progressif manuel avec des filtres

Pour les cas d'utilisation plus simples, vous pouvez émuler des vagues en déclenchant manuellement des déploiements distincts pour chaque libellé client.

1. Créer une révision et une version

# 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. Déclencher des déploiements manuels

Vous pouvez orchestrer manuellement le déploiement en déclenchant des opérations distinctes par groupe cible à l'aide de --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"

Étape suivante