Menggunakan tombol fitur Mandiri
Pelajari cara menggunakan tombol fitur App Lifecycle Manager sebagai layanan mandiri untuk mengelola ketersediaan fitur di aplikasi Anda, meskipun aplikasi tersebut tidak di-deploy atau dikelola oleh App Lifecycle Manager.
Pengantar
Panduan memulai ini menunjukkan cara menggunakan kemampuan peluncuran terkontrol dan tombol fitur yang andal dari App Lifecycle Manager tanpa perlu menggunakan App Lifecycle Manager untuk penyediaan infrastruktur (seperti men-deploy VM atau layanan Cloud Run menggunakan cetak biru Terraform). Pendekatan ini ideal jika Anda mengelola infrastruktur aplikasi secara independen, tetapi ingin menggunakan App Lifecycle Manager untuk pengelolaan tombol fitur yang aman.
Dalam pendekatan mandiri ini, Anda akan:
- Membuat model sistem Anda dengan resource App Lifecycle Manager yang ringan: Buat
UnitsApp Lifecycle Manager untuk mewakili komponen infrastruktur yang ada (misalnya, deployment microservice tertentu, lingkungan tenant, instance biner tunggal). Unit ini hanya bertindak sebagai target untuk konfigurasi tombol dan tidak melibatkan deployment infrastruktur menggunakan cetak biru App Lifecycle Manager. - Menentukan dan Mendistribusikan Tombol: Gunakan App Lifecycle Manager API atau Google Cloud konsol untuk membuat tombol fitur. Kelola siklus prosesnya menggunakan
RolloutsApp Lifecycle Manager untuk memastikan propagasi perubahan konfigurasi yang aman dan bertahap keUnitsyang dimodelkan. Hal ini memberikan konsistensi dan keamanan operasional meskipun hanya mengelola tombol. - Berintegrasi dengan Aplikasi Anda: Gunakan OpenFeature SDK dengan penyedia
flagddalam kode aplikasi Anda (berjalan di mana saja – lokal, on-premise, cloud yang dikelola sendiri). Konfigurasikan untuk terhubung ke layanan tombol App Lifecycle Manager (saasconfig.googleapis.com), autentikasi, dan mengidentifikasi dirinya sendiri menggunakan nama resourceUnityang sesuai untuk mengambil nilai tombol yang benar.
Pendekatan ini memungkinkan Anda mendapatkan manfaat dari distribusi tombol yang aman dan terkelola tanpa mengubah pipeline deployment atau alat pengelolaan infrastruktur yang ada.
Tombol fitur App Lifecycle Manager berada dalam Pratinjau Pribadi. Akses memerlukan daftar yang diizinkan. Untuk meminta akses bagi organisasi atau project Anda, isi formulir ini.
Panduan memulai ini menggunakan aplikasi Python dasar yang berjalan secara lokal untuk mendemonstrasikan akses ke tombol, yang mensimulasikan cara aplikasi yang ada akan terintegrasi.
Tujuan
- Menyiapkan project baru atau menggunakan project yang sudah ada. Google Cloud
- Mengaktifkan API yang diperlukan (App Lifecycle Manager dan SaaS Config).
- Memberikan izin Identity and Access Management yang diperlukan untuk pembuatan resource dan pembacaan tombol.
- Membuat resource App Lifecycle Manager minimal (Penawaran SaaS, Jenis Unit, Unit) untuk memodelkan komponen aplikasi tanpa men-deploy infrastruktur.
- Menentukan resource tombol fitur yang terkait dengan Jenis Unit.
- Membuat mekanisme peluncuran tombol (Jenis Peluncuran) yang menentukan strategi distribusi.
- Mendistribusikan konfigurasi tombol awal menggunakan Peluncuran App Lifecycle Manager.
- Menjalankan aplikasi Python contoh secara lokal yang terhubung ke layanan tombol App Lifecycle Manager dan mengevaluasi tombol untuk Unit yang dimodelkan.
- Memperbarui nilai tombol, membuat rilis tombol baru, dan mendistribusikan perubahan.
- Memastikan aplikasi mengambil nilai tombol yang diperbarui.
Sebelum memulai
-
Login ke Akun Google Anda.
Jika Anda belum memilikinya, Daftar untuk membuat akun baru.
-
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 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.-
Instal Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
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 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.-
Instal Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init -
Instal Python: Pastikan Anda telah menginstal Python 3.7+ di mesin tempat Anda akan menjalankan aplikasi contoh. Anda juga memerlukan pip untuk menginstal dependensi.
python --version
pip --version
-
Mengautentikasi gcloud untuk Kredensial Default Aplikasi (ADC): Skrip Python lokal menggunakan ADC untuk mengautentikasi ke Google Cloud layanan. Login menggunakan akun pengguna Anda:
gcloud auth application-default login
-
Memberikan Izin Identitas Aplikasi: Aplikasi Anda memerlukan izin untuk membaca konfigurasi tombol dari layanan SaaS Config. Berikan peran `roles/saasconfig.viewer` ke identitas yang akan digunakan aplikasi. Untuk panduan memulai ini menggunakan ADC secara lokal dengan akun pengguna Anda, berikan peran ke alamat email Anda:
Ganti PROJECT_ID dengan Google Cloud project ID Anda dan YOUR_EMAIL_ADDRESS dengan email yang terkait dengan login CLI Anda.gcloud projects add-iam-policy-binding PROJECT_ID \ --member="user:YOUR_EMAIL_ADDRESS" \ --role="roles/saasconfig.viewer"
Membuat resource App Lifecycle Manager minimal
Meskipun kita tidak men-deploy infrastruktur dengan App Lifecycle Manager, kita memerlukan beberapa resource untuk mengatur, menargetkan, dan mendistribusikan tombol kita dengan aman. Resource ini mewakili komponen aplikasi yang ada dalam App Lifecycle Manager.
Menentukan variabel: Tetapkan variabel lingkungan untuk nama dan lokasi resource.
export PROJECT_ID="your-project-id" export SAAS_OFFERING_ID="standalone-flags-saas" export UNIT_KIND_ID="standalone-app-kind" export UNIT_ID="my-app-instance-01" export LOCATION_1="us-central1" # Example region where your app instance conceptually resides # Add more locations if your app components span multiple regions # export LOCATION_2="europe-west1"Membuat penawaran SaaS: Tindakan ini berfungsi sebagai container tingkat atas untuk konfigurasi layanan Anda, termasuk tombol.
gcloud beta app-lifecycle-manager saas create ${SAAS_OFFERING_ID} \ --project=${PROJECT_ID} \ --location=global \ --locations=name=${LOCATION_1} # Add --locations=name=${LOCATION_2} if using more regions gcloud beta app-lifecycle-manager saas create ${SAAS_OFFERING_ID} \ --project=${PROJECT_ID} \ --location=${LOCATION_1} \ --locations=name=${LOCATION_1}Membuat jenis unit: Tindakan ini menentukan jenis komponen yang Anda modelkan. Yang terpenting, kami tidak menyediakan cetak biru karena kami tidak mengelola infrastruktur.
gcloud beta app-lifecycle-manager unit-kinds create ${UNIT_KIND_ID} \ --project=${PROJECT_ID} \ --location=global \ --saas=${SAAS_OFFERING_ID} gcloud beta app-lifecycle-manager unit-kinds create ${UNIT_KIND_ID} \ --project=${PROJECT_ID} \ --location=${LOCATION_1} \ --saas=${SAAS_OFFERING_ID}Membuat unit: Tindakan ini mewakili instance tertentu dari aplikasi Anda.
gcloud beta app-lifecycle-manager units create ${UNIT_ID} \ --project=${PROJECT_ID} \ --unit-kind=${UNIT_KIND_ID} \ --location=${LOCATION_1}
Menentukan dan meluncurkan tombol fitur
Sekarang, buat tombol fitur yang sebenarnya dan gunakan mekanisme peluncuran App Lifecycle Manager untuk membuat konfigurasinya tersedia bagi unit yang Anda buat.
Menentukan variabel tombol:
export FLAG_ID="standalone-flag-01" export FLAG_KEY="enable-beta-feature"Membuat resource, revisi, dan rilis tombol:
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} \ export FLAG_REVISION_ID_1="${FLAG_ID}-rev1" gcloud beta app-lifecycle-manager flags revisions create ${FLAG_REVISION_ID_1} \ --project=${PROJECT_ID} \ --flag=${FLAG_ID} \ --location=global export FLAG_RELEASE_ID_1="${FLAG_ID}-rel1" gcloud beta app-lifecycle-manager flags releases create ${FLAG_RELEASE_ID_1} \ --project=${PROJECT_ID} \ --flag-revisions=${FLAG_REVISION_ID_1} \ --unit-kind=${UNIT_KIND_ID} \ --location=globalMembuat jenis peluncuran: Tentukan strategi untuk mendistribusikan perubahan tombol.
export ROLLOUT_KIND_ID="standalone-flags-rollout-kind" 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=globalMembuat peluncuran: Mulai proses distribusi.
export ROLLOUT_ID_1="${FLAG_ID}-rollout1" gcloud beta app-lifecycle-manager rollouts create ${ROLLOUT_ID_1} \ --project=${PROJECT_ID} \ --flag-release=${FLAG_RELEASE_ID_1} \ --rollout-kind=${ROLLOUT_KIND_ID} \ --location=globalMemantau peluncuran: Pastikan deployment berhasil sebelum melanjutkan.
gcloud beta app-lifecycle-manager rollouts describe ${ROLLOUT_ID_1} \ --project=${PROJECT_ID} \ --location=global
Mengonfigurasi infrastruktur mandiri
Dalam penyiapan mandiri, Anda mengelola hosting aplikasi sendiri (misalnya, Cloud Run atau GKE) dan menggunakan App Lifecycle Manager murni untuk sinkronisasi konfigurasi. Kode aplikasi tetap standar di seluruh deployment; kode ini hanya memerlukan variabel lingkungan FLAGD_SOURCE_PROVIDER_ID untuk ada saat runtime agar dapat terhubung ke Layanan Konfigurasi SaaS.
Anda dapat memetakan definisi unit App Lifecycle Manager ke dalam definisi deployment Terraform standar dengan meneruskan jalur yang dibuat sebagai variabel lingkungan.
Menentukan infrastruktur Anda: Petakan jalur dalam template deployment Anda (misalnya,
standalone.tf).variable "project_id" { type = string } variable "region" { type = string } variable "unit_id" { type = string } resource "google_cloud_run_v2_service" "standalone_app" { name = "my-standalone-service" location = var.region template { containers { image = "us-central1-docker.pkg.dev/my-project/my-repo/my-image:latest" env { name = "FLAGD_SOURCE_PROVIDER_ID" value = "projects/${var.project_id}/locations/${var.region}/featureFlagsConfigs/${var.unit_id}" } } } }Menentukan nilai variabel Anda: Berikan parameter unit konfigurasi dalam file variabel terkait (misalnya,
terraform.tfvars).project_id = "PROJECT_ID" region = "LOCATION_1" unit_id = "UNIT_ID"
Mengintegrasikan dan menjalankan aplikasi contoh
Jalankan aplikasi Python contoh secara lokal untuk terhubung ke layanan tombol App Lifecycle Manager menggunakan konfigurasi unit yang dimodelkan.
Membuat direktori dan file project:
mkdir saas_flags_standalone_app cd saas_flags_standalone_appBuat
requirements.txt: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.0Instal dependensi:
pip install -r requirements.txtMembuat app.py:
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.contrib.provider.flagd import FlagdProvider from openfeature.contrib.provider.flagd.config import ResolverType app = Flask(__name__) logging.basicConfig(stream=sys.stdout, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') log = logging.getLogger(__name__) FLAG_KEY = os.environ.get("FLAG_KEY", "enable-beta-feature") DEFAULT_FLAG_VALUE = False # CRITICAL: Read the Unit resource name from environment variable. # This identifies the application instance to the flag service. provider_id = os.environ.get("FLAGD_SOURCE_PROVIDER_ID") if not provider_id: log.critical("FATAL: FLAGD_SOURCE_PROVIDER_ID not set.") sys.exit("FLAGD_SOURCE_PROVIDER_ID not set") log.info(f"Initializing OpenFeature provider for Unit: {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: credentials, detected_project_id = google.auth.default( scopes=["https://www.googleapis.com/auth/cloud-platform"] ) auth_req = google.auth.transport.requests.Request() configservice_credentials = grpc.composite_channel_credentials( grpc.ssl_channel_credentials(), grpc.metadata_call_credentials( google.auth.transport.grpc.AuthMetadataPlugin(credentials, auth_req) ), grpc.metadata_call_credentials( add_x_goog_request_params_header(provider_id) ) ) provider = FlagdProvider( resolver_type=ResolverType.IN_PROCESS, host="saasconfig.googleapis.com", port=443, sync_metadata_disabled=True, provider_id=provider_id, channel_credentials=configservice_credentials ) api.set_provider(provider) client = api.get_client() time.sleep(5) 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) sys.exit(f"Provider initialization failed: {e}") @app.route('/') def home(): log.info(f"Request received for endpoint '/', evaluating flag: {FLAG_KEY}") try: 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, "provider_id": provider_id }) except Exception as e: log.error(f"Error evaluating flag '{FLAG_KEY}': {e}", exc_info=True) 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 web server on host 0.0.0.0 port {port}") app.run(host='0.0.0.0', port=port)Menjalankan aplikasi:
export FLAGD_SOURCE_PROVIDER_ID="projects/${PROJECT_ID}/locations/${LOCATION_1}/featureFlagsConfigs/${UNIT_ID}" python app.pyMemverifikasi nilai tombol awal: Jalankan pemeriksaan terhadap endpoint lokal di terminal sekunder.
curl http://localhost:8080
Memperbarui tombol dan mendistribusikan perubahan
Ubah status runtime definisi tombol dan distribusikan update ke target yang terhubung.
Memperbarui resource tombol:
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} export FLAG_REVISION_ID_2="${FLAG_ID}-rev2" gcloud beta app-lifecycle-manager flags revisions create ${FLAG_REVISION_ID_2} \ --project=${PROJECT_ID} \ --flag=${FLAG_ID} \ --location=global export FLAG_RELEASE_ID_2="${FLAG_ID}-rel2" gcloud beta app-lifecycle-manager flags releases create ${FLAG_RELEASE_ID_2} \ --project=${PROJECT_ID} \ --flag-revisions=${FLAG_REVISION_ID_2} \ --unit-kind=${UNIT_KIND_ID} \ --location=globalMembuat peluncuran baru untuk update:
export ROLLOUT_ID_2="${FLAG_ID}-rollout2" gcloud beta app-lifecycle-manager rollouts create ${ROLLOUT_ID_2} \ --project=${PROJECT_ID} \ --flag-release=${FLAG_RELEASE_ID_2} \ --rollout-kind=${ROLLOUT_KIND_ID} \ --location=globalMemantau peluncuran baru:
gcloud beta app-lifecycle-manager rollouts describe ${ROLLOUT_ID_2} \ --project=${PROJECT_ID} \ --location=globalMemverifikasi perubahan dalam aplikasi yang berjalan:
curl http://localhost:8080
Pembersihan
Agar akunAnda tidak dikenai biaya untuk resource yang digunakan pada halaman ini, ikuti langkah-langkah berikut. Google Cloud
- Tekan
Ctrl+Cdi terminal tempatapp.pyberjalan untuk menghentikan aplikasi Python lokal. - Tetapkan status tombol.
- Buat peluncuran baru untuk menghapus tombol yang tidak digunakan lagi.
Setelah peluncuran selesai dan tombol yang tidak digunakan lagi telah dihapus, hapus resource App Lifecycle Manager:
gcloud beta app-lifecycle-manager rollouts delete ${ROLLOUT_ID_1} --project=${PROJECT_ID} --location=global --quiet gcloud beta app-lifecycle-manager rollouts delete ${ROLLOUT_ID_2} --project=${PROJECT_ID} --location=global --quiet gcloud beta app-lifecycle-manager rollout-kinds delete ${ROLLOUT_KIND_ID} --project=${PROJECT_ID} --location=global --quiet gcloud beta app-lifecycle-manager flags releases delete ${FLAG_RELEASE_ID_1} --project=${PROJECT_ID} --location=global --quiet gcloud beta app-lifecycle-manager flags releases delete ${FLAG_RELEASE_ID_2} --project=${PROJECT_ID} --location=global --quiet gcloud beta app-lifecycle-manager flags delete ${FLAG_ID} --project=${PROJECT_ID} --location=global --quiet gcloud beta app-lifecycle-manager units delete ${UNIT_ID} --project=${PROJECT_ID} --location=${LOCATION_1} --quiet gcloud beta app-lifecycle-manager unit-kinds delete ${UNIT_KIND_ID} --project=${PROJECT_ID} --location=global --quiet gcloud beta app-lifecycle-manager unit-kinds delete ${UNIT_KIND_ID} --project=${PROJECT_ID} --location=${LOCATION_1} --quiet gcloud beta app-lifecycle-manager saas delete ${SAAS_OFFERING_ID} --project=${PROJECT_ID} --location=global --quiet gcloud beta app-lifecycle-manager saas delete ${SAAS_OFFERING_ID} --project=${PROJECT_ID} --location=${LOCATION_1} --quietHapus direktori lokal:
cd .. rm -rf saas_flags_standalone_app
Langkah berikutnya
- Baca ringkasan tombol fitur App Lifecycle Manager untuk mengetahui detail konseptual selengkapnya.
- Coba panduan memulai Men-deploy tombol fitur untuk melihat cara tombol terintegrasi secara erat dengan deployment yang dikelola App Lifecycle Manager.