このガイドでは、Go アプリケーションを App Lifecycle Manager の機能フラグと統合する方法について説明します。OpenFeature
SDK と flagd プロバイダを使用して、App Lifecycle Manager で管理されるフラグを評価し、Go
サービスで機能の可用性と動作を動的に制御する方法について説明します。
このガイドでは、次のいずれかのクイックスタートを完了して、必要な App Lifecycle Manager リソース(SaaS サービス、ユニットの種類、ユニット、フラグ、ロールアウトなど)がすでに設定されていることを前提としています。
- クイックスタート: App Lifecycle Manager(統合)で機能フラグをデプロ 2 する: アプリケーションのデプロイを App Lifecycle Manager で管理する場合。
- クイックスタート: フィーチャー トグルをスタンドアロンで使用する: アプリケーション インフラストラクチャを個別に管理しているが、フィーチャー トグルの管理に App Lifecycle Manager を使用する場合。
前提条件
始める前に、次の準備をしてください。
- Go がインストールされている: バージョン 1.23 以降。
- App Lifecycle Manager の機能フラグのクイックスタートを完了している:
アプリケーションのデフォルト認証情報(ADC)の
gcloudを認証している: Go アプリケーションは ADC を使用して Google Cloud サービスを認証します。ローカルで実行している場合(スタンドアロンで使用する場合、またはローカル Docker テストの場合)は、環境で認証されていることを確認してください。gcloud auth application-default loginIAM 権限: Go アプリケーションを実行する ID には、 プロジェクトに対する
roles/saasconfig.viewerIdentity and Access Management ロールが必要です。これにより、フラグ構成を読み取ることができます。 Google Cloudgcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ --member="user:YOUR_EMAIL_ADDRESS" \ --role="roles/saasconfig.viewer"YOUR_PROJECT_IDとYOUR_EMAIL_ADDRESSは適宜置き換えてください。
重要な環境変数について
Go アプリケーションは、環境変数を使用して正しいフラグ構成に接続し、目的のフラグを評価します。
FLAGD_SOURCE_PROVIDER_ID: App Lifecycle Manager サービスから取得するフィーチャー トグル構成を指定します。ユニットに関連付けられたFeatureFlagConfigの完全なリソース名である必要があります。- 形式:
projects/PROJECT_ID/locations/LOCATION/featureFlagsConfigs/UNIT_ID - 例:
projects/my-gcp-project/locations/us-central1/featureFlagsConfigs/my-app-instance-01
- 形式:
Go プロジェクトを設定する
アプリケーションを実行する前に、モジュールを初期化し、必要な初期化ロジックと評価ロジックを追加します。
プロジェクト ディレクトリを作成します。
mkdir go-featureflag-app cd go-featureflag-app go mod init go-featureflag-appアプリケーション コードを作成します。 次の内容の
main.goという名前のファイルを追加して、プロバイダを初期化し、フラグを評価します。package main import ( "context" "fmt" "log" "os" flagd "github.com/open-feature/go-sdk-contrib/providers/flagd/pkg" "github.com/open-feature/go-sdk/openfeature" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/oauth" "google.golang.org/grpc/metadata" ) // GetNewFlagdProvider initializes a flagd provider configured for App Lifecycle Manager func GetNewFlagdProvider(ctx context.Context) (*flagd.Provider, error) { providerID := os.Getenv("FLAGD_SOURCE_PROVIDER_ID") if providerID == "" { return nil, fmt.Errorf("FLAGD_SOURCE_PROVIDER_ID environment variable is not set") } creds, err := oauth.NewApplicationDefault(ctx) if err != nil { return nil, err } // Interceptor to inject the Unit name into headers for regional routing routingInterceptor := func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) { md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("name=%s", providerID)) ctx = metadata.NewOutgoingContext(ctx, md) return streamer(ctx, desc, cc, method, opts...) } options := []flagd.ProviderOption{ flagd.WithHost("saasconfig.googleapis.com"), flagd.WithPort(443), flagd.WithInProcessResolver(), flagd.WithProviderID(providerID), flagd.WithGrpcDialOptionsOverride([]grpc.DialOption{ grpc.WithTransportCredentials(credentials.NewTLS(nil)), grpc.WithPerRPCCredentials(creds), grpc.WithStreamInterceptor(routingInterceptor), }), } return flagd.NewProvider(options...) } // InitializeFeatureManagement registers the provider globally func InitializeFeatureManagement(ctx context.Context) error { provider, err := GetNewFlagdProvider(ctx) if err != nil { return err } openfeature.SetProvider(provider) return nil } func main() { ctx := context.Background() InitializeFeatureManagement(ctx); // 1. Get Client client := openfeature.NewClient("simple-api") // 2. Create Evaluation Context evalCtx := openfeature.NewEvaluationContext() // 3. Evaluate Flag // Default to false if evaluation fails isEnhanced, err := client.BooleanValue(context.Background(), "enhanced-search", false, evalCtx) if err != nil { log.Printf("Flag evaluation failed: %v", err) } // 4. Return response if isEnhanced { fmt.Println("Enhanced search feature is enabled.") } else { fmt.Println("Enhanced search feature is disabled.") } }go.mod を作成します。 特定のバージョンを使用すると、安定性が確保されます。
module go-featureflag-app go 1.23 require ( github.com/open-feature/go-sdk v1.15.1 github.com/open-feature/go-sdk-contrib/providers/flagd v0.3.0 google.golang.org/grpc v1.74.2 golang.org/x/oauth2 v0.22.0 )依存関係を取得します。
go mod tidy go mod download
Go アプリケーションを実行する
アプリケーションは、スタンドアロン構成を使用してローカルで実行することも、コンテナとしてデプロイすることもできます。
スタンドアロン(ローカル)で実行する
環境変数を設定します。
export PROJECT_ID="your-gcp-project-id" export LOCATION_1="us-central1" export UNIT_ID="my-app-instance-01" export FLAGD_SOURCE_PROVIDER_ID="projects/${PROJECT_ID}/locations/${LOCATION_1}/featureFlagsConfigs/${UNIT_ID}"アプリケーションを実行します。
go run main.go
統合(コンテナ化)を実行する
Dockerfile を作成します。
FROM golang:1.23 as builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /go-featureflag-app . FROM gcr.io/distroless/static-debian11 WORKDIR / COPY --from=builder /go-featureflag-app /go-featureflag-app ENTRYPOINT ["/go-featureflag-app"]イメージをビルドして push します。
export PROJECT_ID="your-gcp-project-id" docker build -t gcr.io/${PROJECT_ID}/my-go-app:latest . docker push gcr.io/${PROJECT_ID}/my-go-app:latestサービスをデプロイします。 ユニット ブループリントを更新して
gcr.io/${PROJECT_ID}/my-go-app:latestを参照し、App Lifecycle Manager のロールアウトを使用して新しいリリースをデプロイします。
フラグの変更を確認する
アプリケーションが実行されたら、フラグが正しく評価されることを確認します。
- 初期値を観察する: 出力に初期状態に対応する値が記録されていることを確認します。
- App Lifecycle Manager でフラグを更新する: コンソールまたは Google Cloud を使用してフラグの動作を変更します。
gcloud - 更新された値を確認する: ローカル コンパイルを再実行するか、コンテナログを観察して、更新された結果を確認します。
次のステップ
- App Lifecycle Manager の機能フラグの概要で、コンセプトの詳細を確認する。
- App Lifecycle Manager のロールアウトで、フラグを安全にデプロイする方法を確認する。
- App Lifecycle Manager のメインの概要を確認する。