Funktions-Flags bereitstellen
In dieser Kurzanleitung erfahren Sie, wie Sie mit App Lifecycle Manager Funktions-Flags erstellen, einführen und verwenden.
In dieser Kurzanleitung lernen Sie, wie Sie einen Flag-Anbieter installieren und konfigurieren und grundlegende Funktions-Flags mit App Lifecycle Manager-Funktions-Flags ausführen.
Hinweis
-
Melden Sie sich bei Ihrem Google-Konto an.
Wenn Sie noch kein Konto haben, melden Sie sich hier für ein neues Konto an.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the App Lifecycle Manager, Artifact Registry, Infrastructure Manager, Developer Connect, Cloud Build, Cloud Storage, Cloud Run and SaaS Config APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Create a service account:
-
Ensure that you have the Create Service Accounts IAM role
(
roles/iam.serviceAccountCreator) and the Project IAM Admin role (roles/resourcemanager.projectIamAdmin). Learn how to grant roles. -
In the Google Cloud console, go to the Create service account page.
Go to Create service account - Select your project.
-
In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.
In the Service account description field, enter a description. For example,
Service account for quickstart. - Click Create and continue.
-
Grant the Project > Owner role to the service account.
To grant the role, find the Select a role list, then select Project > Owner.
- Click Continue.
-
Click Done to finish creating the service account.
-
Ensure that you have the Create Service Accounts IAM role
(
-
Installieren Sie die Google Cloud CLI.
-
Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.
-
Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the App Lifecycle Manager, Artifact Registry, Infrastructure Manager, Developer Connect, Cloud Build, Cloud Storage, Cloud Run and SaaS Config APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Create a service account:
-
Ensure that you have the Create Service Accounts IAM role
(
roles/iam.serviceAccountCreator) and the Project IAM Admin role (roles/resourcemanager.projectIamAdmin). Learn how to grant roles. -
In the Google Cloud console, go to the Create service account page.
Go to Create service account - Select your project.
-
In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.
In the Service account description field, enter a description. For example,
Service account for quickstart. - Click Create and continue.
-
Grant the Project > Owner role to the service account.
To grant the role, find the Select a role list, then select Project > Owner.
- Click Continue.
-
Click Done to finish creating the service account.
-
Ensure that you have the Create Service Accounts IAM role
(
-
Installieren Sie die Google Cloud CLI.
-
Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.
-
Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:
gcloud init - SaaS-Angebot erstellen Sie benötigen ein SaaS-Angebot, um diese Kurzanleitung abzuschließen. Weitere Informationen zum Erstellen eines SaaS-Angebots finden Sie unter SaaS-Angebot erstellen.
Berechtigungen für das App Lifecycle Manager-Dienstkonto gewähren
Wenn Sie die App Lifecycle Manager API aktivieren, erstellt App Lifecycle Manager ein Dienstkonto. Dieses Dienstkonto heißt
service-PROJECT-NUMBER@gcp-sa-saasservicemgmt.iam.gserviceaccount.com,
wobei PROJECT-NUMBER Ihre Projektnummer ist.
Gewähren Sie diesem Dienstkonto die erforderlichen Berechtigungen, indem Sie den folgenden Befehl ausführen:
gcloud projects add-iam-policy-binding `PROJECT_ID` \
--member="serviceAccount:service-<var>`PROJECT_NUMBER`</var>@gcp-sa-saasservicemgmt.iam.gserviceaccount.com" \
--role="roles/saasservicemgmt.serviceAgent"
Ersetzen Sie:
- PROJECT_ID: Eine String-ID, die Ihre Projekt-ID darstellt.
- PROJECT_NUMBER: Ihre Projektnummer.
Referenzdokumentation suchen
Dieses Dienstkonto führt in Ihrem Namen verschiedene Aufgaben aus, z. B. die Bereitstellung von Einheiten.
Repository in Artifact Registry erstellen
Wenn Sie App Lifecycle Manager verwenden möchten, benötigen Sie ein Repository in Artifact Registry. Führen Sie den folgenden Befehl in Ihrem Terminal aus, um dieses Repository zu erstellen:
gcloud artifacts repositories create flags-quickstart \
--repository-format=docker \
--location=us-central1
Dieses Repository enthält einen Blueprint (verpackte Terraform-Dateien), der beschreibt, wie Sie Ihre Einheiten bereitstellen.
Blueprint für eine Anwendung mit Funktions-Flags erstellen
Erstellen Sie ein Python-Skript, das ein Funktions-Flag liest, und verwenden Sie es, um ein Docker-Image zu erstellen und zu übertragen:
Erstellen Sie ein Verzeichnis mit dem Namen
alm_dockerfür den Docker-Build-Kontext.Erstellen Sie im Verzeichnis
alm_dockerdie Dateiflags.pymit diesem Snippet:import google.auth.transport.grpc import google.auth.transport.requests import grpc import logging import time import os import sys from flask import Flask, jsonify from openfeature import api from openfeature.provider import ProviderEvent, ProviderStatus from openfeature.contrib.provider.flagd import FlagdProvider from openfeature.contrib.provider.flagd.config import ResolverType # --- Flask App Setup --- app = Flask(__name__) # --- Logging Setup --- logging.basicConfig(stream=sys.stdout) # Log to stdout for Cloud Run log = logging.getLogger(__name__) log.setLevel(logging.INFO) # Use INFO or DEBUG as needed # --- OpenFeature/Flagd Setup --- FLAG_KEY = "quickstart-flag" DEFAULT_FLAG_VALUE = False # Check for necessary environment variable provider_id = os.environ.get("FLAGD_SOURCE_PROVIDER_ID") if not provider_id: log.critical("FATAL: FLAGD_SOURCE_PROVIDER_ID environment variable not set.") sys.exit("FLAGD_SOURCE_PROVIDER_ID not set") # Exit if critical config is missing log.info(f"Initializing OpenFeature provider for ID: {provider_id}") def add_x_goog_request_params_header(config_name): return lambda context, callback: callback([("x-goog-request-params", f'name={config_name}')], None) try: # Configure gRPC credentials for Google Cloud service configservice_credentials = grpc.composite_channel_credentials( grpc.ssl_channel_credentials(), grpc.metadata_call_credentials( google.auth.transport.grpc.AuthMetadataPlugin( google.auth.default()[0], # Get just the credentials from the tuple google.auth.transport.requests.Request() ) ), grpc.metadata_call_credentials( add_x_goog_request_params_header(provider_id) ) ) # Set up the Flagd provider to connect to SaaS Config service # Using IN_PROCESS resolver type as recommended for direct gRPC connection provider = FlagdProvider( resolver_type=ResolverType.IN_PROCESS, host="saasconfig.googleapis.com", port=443, sync_metadata_disabled=True, # Important when using IN_PROCESS with direct service provider_id=provider_id, channel_credentials=configservice_credentials ) api.set_provider(provider) client = api.get_client() initial_flag_value = client.get_boolean_value(FLAG_KEY, DEFAULT_FLAG_VALUE) log.info(f"***** STARTUP FLAG CHECK ***** Flag '{FLAG_KEY}' evaluated to: {initial_flag_value}") except Exception as e: log.critical(f"FATAL: Failed to initialize OpenFeature provider: {e}", exc_info=True) # Depending on the desired behavior, you might exit or let Flask start # but log the critical failure. Exiting might be safer in production. sys.exit(f"Provider initialization failed: {e}") # --- Flask Routes --- @app.route('/') def home(): """Endpoint to check the feature flag's value.""" log.info(f"Request received for flag: {FLAG_KEY}") try: # Get the flag value. Use the client initialized earlier. # The default value (DEFAULT_FLAG_VALUE) is returned if the flag isn't found # or if the provider isn't ready/errors occur during evaluation. flag_value = client.get_boolean_value(FLAG_KEY, DEFAULT_FLAG_VALUE) log.info(f"Evaluated flag '{FLAG_KEY}': {flag_value}") return jsonify({ "flag_key": FLAG_KEY, "value": flag_value, }) except Exception as e: log.error(f"Error evaluating flag '{FLAG_KEY}': {e}", exc_info=True) # Return an error response but keep the server running return jsonify({ "error": f"Failed to evaluate flag {FLAG_KEY}", "details": str(e), }), 500 if __name__ == '__main__': port = int(os.environ.get('PORT', 8080)) log.info(f"Starting Flask server on port {port}") app.run(host='0.0.0.0', port=port)Dieses Python-Skript zeigt, wie Sie auf Funktions-Flags in Ihrer Anwendung zugreifen, die als Docker-Image auf einer App Lifecycle Manager-Einheit ausgeführt wird. Es verwendet standardmäßige OpenFeature-Prinzipien zur Integration in den App Lifecycle Manager-Konfigurationsdienst für Funktions-Flags (
saasconfig.googleapis.com).Erstellen Sie im Verzeichnis
alm_dockereine Textdatei mit dem Namenrequirements.txt, die dieses Snippet enthält:google-auth grpcio>=1.49.1,<2.0.0dev openfeature-sdk==0.8.0 openfeature-provider-flagd==0.2.2 requests typing_extensions Flask>=2.0Fügen Sie dem
Dockerfileim Verzeichnisalm_dockerFolgendes hinzu:FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY flags.py . CMD ["python", "flags.py"]Führen Sie diesen Befehl in Ihrer lokalen Umgebung aus, um das Docker-Image zu erstellen und zu übertragen:
export DOCKER_REGISTRY="us-central1-docker.pkg.dev/PROJECT_ID/flags-quickstart" export FULL_IMAGE_PATH="${DOCKER_REGISTRY}/flags-quickstart:latest" docker build -t "${FULL_IMAGE_PATH}" . docker push "${FULL_IMAGE_PATH}"Ersetzen Sie:
- PROJECT_ID: Eine String-ID, die Ihre Projekt-ID darstellt.
Erstellen Sie in Ihrer Docker-Umgebung ein Verzeichnis
alm_terraform.Erstellen Sie in
alm_terraformdie folgenden Dateien:main.tflocals { config_path = "projects/${var.system_unit_project}/locations/${var.system_unit_location}/featureFlagsConfigs/${var.system_unit_name}" docker_image_path = "${var.system_unit_location}-docker.pkg.dev/${var.system_unit_project}/${var.docker_repo_name}/${var.docker_tag}" } provider "google" { project = var.system_unit_project region = var.system_unit_location } resource "google_cloud_run_service" "flags_quickstart_service" { name = var.cloud_run_service_name location = var.system_unit_location project = var.system_unit_project template { spec { containers { image = local.docker_image_path env { name = "FLAGD_SOURCE_PROVIDER_ID" value = local.config_path } } service_account_name = var.actuation_sa } } }variables.tfvariable "actuation_sa" { description = "Actuation SA" type = string } variable "system_unit_project" { description = "Project id - variable set by App Lifecycle Manager" type = string } variable "system_unit_location" { description = "Location - variable set by App Lifecycle Manager" type = string } variable "system_unit_name" { description = "Unit name- variable set by App Lifecycle Manager" type = string } variable "docker_repo_name" { description = "The name of the Artifact Registry repository where the Docker image is stored." type = string default = "flags-quickstart" } variable "docker_tag" { description = "The tag of the Docker image to deploy." type = string default = "flags-quickstart:latest" } variable "cloud_run_service_name" { description = "Name for the Cloud Run service to be created." type = string default = "saas-flags-quickstart-svc" }Führen Sie im Verzeichnis
alm_terraformdiesen Befehl aus, um die Terraform-Blueprint-Dateien zu verpacken:zip terraform-files.zip main.tf variables.tf
Anwendungs-Blueprint zum Erstellen einer Einheit verwenden
Nachdem Sie einen Anwendungs-Blueprint erstellt haben, der Funktions-Flags verwendet, müssen Sie eine App Lifecycle Manager-Einheit (flags-unit-kind) und dann eine Einheit dieser Art (flags-quickstart-unit) erstellen.
Weitere Informationen zu Einheiten und Einheitenarten finden Sie unter Einheiten eines Roll-outs modellieren und verpacken .
So erstellen Sie mit dem Anwendungs-Blueprint eine Einheit über die gcloud CLI:
Wenn Sie Ihre Terraform-Konfiguration als OCI-Image (Blueprint) verpacken möchten, erstellen Sie im Terraform-Verzeichnis eine Datei mit dem Namen
Dockerfile:# syntax=docker/dockerfile:1-labs FROM scratch COPY --exclude=Dockerfile --exclude=.git --exclude=.gitignore . /Dockerfileerstellen und in Ihr Artifact Registry-Repository übertragen:IMAGE_NAME="us-central1-docker.pkg.dev/PROJECT_ID/flags-quickstart/flags-quickstart-blueprint:latest" ENGINE_TYPE=inframanager ENGINE_VERSION=1.5.7 docker buildx build -t $IMAGE_NAME \ --push \ --annotation "com.easysaas.engine.type=$ENGINE_TYPE" \ --annotation "com.easysaas.engine.version=$ENGINE_VERSION" \ --provenance=false .Ersetzen Sie:
- PROJECT_ID: Eine String-ID, die Ihre Projekt-ID darstellt.
Erstellen Sie die Ressourcen
flags-unit-kindundflags-release:# Create unit kind gcloud beta app-lifecycle-manager unit-kinds create flags-unit-kind \ --project=PROJECT_ID \ --location=global \ --saas=flags-quickstart-saas-offering # Create release referencing the Blueprint image gcloud beta app-lifecycle-manager releases create flags-release \ --project=PROJECT_ID \ --location=global \ --unit-kind=flags-unit-kind \ --blueprint-package=$IMAGE_NAMEErsetzen Sie:
- PROJECT_ID: Eine String-ID, die Ihre Projekt-ID darstellt.
Erstellen Sie die Einheit
flags-quickstart-unit:gcloud beta app-lifecycle-manager units create flags-quickstart-unit \ --project=PROJECT_ID \ --location=us-central1 \ --unit-kind=flags-unit-kind \ --management-mode=userErsetzen Sie:
- PROJECT_ID: Eine String-ID, die Ihre Projekt-ID darstellt.
Funktions-Flag erstellen und bereitstellen
Bevor ein App Lifecycle Manager-Funktions-Flag von Ihrer bereitgestellten Einheit verwendet werden kann, müssen Sie die Funktions-Flag-Ressource erstellen und einen Roll-out starten, um die Konfiguration an die Einheit zu übertragen.
Führen Sie die Befehle aus, um das Funktions-Flag quickstart-flag zu erstellen und bereitzustellen:
Definieren Sie in Ihrer Umgebung die folgenden Variablen:
export FLAG_ID="quickstart-flag" export FLAG_KEY="quickstart-flag" export SAAS_OFFERING_ID="flags-quickstart-saas-offering" export UNIT_KIND_ID="flags-unit-kind" export UNIT_ID="flags-quickstart-unit" export ROLLOUT_KIND_ID="flags-quickstart-rollout-kind" export ROLLOUT_ID="flags-quickstart-rollout"Erstellen Sie die Funktions-Flag-Ressource:
gcloud beta app-lifecycle-manager flags create ${FLAG_ID} \ --project=${PROJECT_ID} \ --key=${FLAG_KEY} \ --flag-value-type=BOOL \ --location=global \ --unit-kind=${UNIT_KIND_ID}Erstellen Sie eine Überarbeitung:
export FLAG_REVISION_ID="${FLAG_ID}-rev1" gcloud beta app-lifecycle-manager flags revisions create ${FLAG_REVISION_ID} \ --project=${PROJECT_ID} \ --flag=${FLAG_ID} \ --location=globalErstellen Sie ein Release:
export FLAG_RELEASE_ID="${FLAG_ID}-rel1" gcloud beta app-lifecycle-manager flags releases create ${FLAG_RELEASE_ID} \ --project=${PROJECT_ID} \ --flag-revisions=${FLAG_REVISION_ID} \ --unit-kind=${UNIT_KIND_ID} \ --location=globalErstellen Sie eine Roll-out-Art:
gcloud beta app-lifecycle-manager rollout-kinds create ${ROLLOUT_KIND_ID} \ --project=${PROJECT_ID} \ --unit-kind=${UNIT_KIND_ID} \ --rollout-orchestration-strategy=Google.Cloud.Simple.AllAtOnce \ --location=globalErstellen Sie den Roll-out:
gcloud beta app-lifecycle-manager rollouts create ${ROLLOUT_ID} \ --project=${PROJECT_ID} \ --flag-release=${FLAG_RELEASE_ID} \ --rollout-kind=${ROLLOUT_KIND_ID} \ --location=global
Sie können den Roll-out-Status mit dem folgenden Befehl überwachen:
gcloud beta app-lifecycle-manager rollouts describe ${ROLLOUT_ID} --project=${PROJECT_ID} --location=global
Flag-Wert im laufenden Dienst ansehen
Nachdem Ihre App Lifecycle Manager-Einheit den Cloud Run-Dienst erfolgreich bereitgestellt hat, können Sie prüfen, ob Ihre Anwendung ausgeführt wird und das Funktions-Flag korrekt auswertet:
Rufen Sie in der Google Cloud Console Cloud Run auf:
Suchen Sie in der Region
us-central1nach dem Dienstsaas-flags-quickstart-svc. Ein Häkchen nebensaas-flags-quickstart-svczeigt an, dass der Dienst erfolgreich ausgeführt wird.Klicken Sie auf
saas-flags-quickstart-svc, um die Details aufzurufen.Wählen Sie den Tab Logs aus.
Suchen Sie in den Logeinträgen nach einer Meldung wie der folgenden:
INFO:__main__:***** STARTUP FLAG CHECK ***** Flag 'quickstart-flag' evaluated to: falseDies bestätigt, dass die Anwendung gestartet, eine Verbindung zum SaaS-Konfigurationsdienst hergestellt und das Flag
quickstart-flagausgewertet hat.
Klicken Sie auf den Tab Networking, um auf den öffentlichen Endpunkt zuzugreifen.
- Suchen Sie im Abschnitt Endpoints nach der öffentlichen URL.
- Klicken Sie auf die URL, um sie in Ihrem Browser zu öffnen, oder verwenden Sie ein Tool wie
curl, um über das Terminal darauf zuzugreifen (curl YOUR_SERVICE_URL, z. B.). Jedes Mal, wenn Sie auf die URL zugreifen, wertet der Dienst das Funktions-Flag aus und gibt den aktuellen Wert im JSON-Format zurück. Beispiel:
{ "flag_key": "quickstart-flag", "value": false }
Sie haben erfolgreich einen Google Cloud Dienst bereitgestellt, der ein von App Lifecycle Manager verwaltetes Funktions-Flag liest. Sie können den Wert des Flags ändern und einen neuen Roll-out erstellen, um zu sehen, wie Ihre Anwendung die Änderung übernimmt.
Bereinigen
Mit den folgenden Schritten vermeiden Sie, dass Ihrem Google Cloud -Konto die auf dieser Seite verwendeten Ressourcen in Rechnung gestellt werden:
Optional: Projekt löschen
Wenn Sie die Lösung in einem neuen Google Cloud Projekt bereitgestellt haben und das Projekt nicht mehr benötigen, löschen Sie es so:
- Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.
- Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf Löschen.
- Geben Sie an der Eingabeaufforderung die Projekt-ID ein und klicken Sie auf Herunterfahren.
Nächste Schritte
- Probieren Sie die Kurzanleitung Funktions-Flags eigenständig bereitstellen aus, um Flags unabhängig von von App Lifecycle Manager verwalteten Bereitstellungen zu verwenden.
- Sehen Sie sich die sprachspezifischen Integrationsleitfäden an (Python, Java, Go).
- Weitere Informationen zu App Lifecycle Manager finden Sie in der Übersicht zu App Lifecycle Manager.