App Lifecycle Manager のフィーチャー トグルを使用すると、新しいコードのデプロイやインフラストラクチャの変更を必要とせずに、アプリケーション内の機能の可用性と動作を制御できます。
フラグは主に次の 2 つの方法で使用できます。
- 統合: フラグ管理を、App Lifecycle Manager で管理されるアプリケーション デプロイと組み合わせます。
- スタンドアロン: システム コンポーネントを App Lifecycle Manager ユニットとしてモデル化することで、アプリケーション インフラストラクチャが別の場所で管理されている場合でも、堅牢なフラグ設定システムを独立して使用できます。
フィーチャー トグルは、ユニットやロールアウトなどの App Lifecycle Manager のコアコンセプトと統合されています。これにより、アプリケーション インフラストラクチャとともにフラグ構成を管理できます(統合アプローチ)。
App Lifecycle Manager のユニットまたはロールアウトに詳しくない場合は、メインの App Lifecycle Manager の概要をご覧ください。
App Lifecycle Manager のフィーチャー トグルを使用する理由
App Lifecycle Manager でフィーチャー トグルを実装すると、SaaS の開発と運用のライフサイクルにいくつかのメリットがあります。
- 機能のリリースをコードのデプロイから切り離す: デフォルトでは無効となる機能の新しいコードを本番環境にデプロイします。特定のユーザーに対して機能を有効にしたり、準備が整った段階で段階的にデプロイしたりすることで、大規模なデプロイに伴うリスクを軽減できます。
- 安全性、スピード、信頼性の向上:
- 限定されたユーザーを対象に、本番環境で機能をテストする(カナリア リリース)。
- App Lifecycle Manager のロールアウト機能を使用して段階的なロールアウトを行い、潜在的な問題の影響を最小限に抑えます。
- 許可リストとテナントのカスタマイズを有効にする: テナント、サービス、環境を表すユニットの機能を有効または無効にします。
- ロールバックを簡素化する: フィーチャー トグルを無効にすると、多くの場合、以前のバージョンのアプリケーションをデプロイするよりもはるかに高速で、中断が少なくなります。このワークフローを使用すると、バイナリをロールバックせずに、問題のある機能を無効にできます。
- フラグ構成の統合管理: フィーチャー トグルの定義を管理し、それらを使用してロールアウトを構成します。このワークフローでは、フィーチャー トグルのロールアウトを作成してアプリケーションの機能を変更できるため、運用の信頼性が向上します。
App Lifecycle Manager のフィーチャー トグルの仕組み
App Lifecycle Manager でフィーチャー トグルを使用するには、主に 2 つの側面があります。管理プレーン(フラグの定義とデプロイ)とデータプレーン(アプリケーション内でのフラグ値へのアクセス)です。
App Lifecycle Manager との統合
App Lifecycle Manager を使用してアプリケーションのデプロイを管理する場合(Terraform ブループリントを使用してインフラストラクチャをデプロイする場合など):
- フラグを定義する: App Lifecycle Manager 内にフィーチャー トグル リソースを作成し、一意の
Flag key(enable-new-dashboardなど)を指定して、ユニットの種類に関連付けます。ブール値フラグがサポートされています。 - フラグの変更をプロビジョニングする: フラグの変更(作成または更新)は、App Lifecycle Manager のロールアウトを開始するまで有効になりません。これにより、フラグのデプロイにバッチ、管理機能、安全チェックなどの機能を使用できます。ロールアウトにより、ターゲット ユニットに関連付けられたフラグ構成が更新されます。
- アプリケーションでフラグにアクセスする: プロビジョニングされたユニット(Cloud Run または Google Kubernetes Engine のコンテナなど)内で実行されるアプリケーション コードは、
flagdプロバイダで構成された OpenFeature SDK を使用します。このプロバイダはsaasconfig.googleapis.comサービス エンドポイントに接続します。App Lifecycle Manager を使用して、必要なユニット識別子をアプリケーション環境に挿入し、SDK がその特定のユニットの正しいフラグ値を取得できるようにします。
この緊密な統合により、インフラストラクチャのライフサイクルとともに機能のライフサイクルを管理できます。実用的な例については、クイックスタート: フィーチャー トグルをデプロイするをご覧ください。
管理プレーン
管理プレーンを操作して、フラグを定義して制御します。 Google Cloud コンソール、gcloud CLI、または App Lifecycle Manager API を使用して、次のことができます。
- フラグを作成または更新する: フラグを定義するには、
Flag keyを指定し、単位の種類に関連付けて、タイプとデフォルト値を設定します。 - ロールアウトを作成する: ロールアウトを開始して、フラグの変更(作成または更新)を、フラグのユニットタイプに属するターゲット ユニットに配布します。ロールアウトにより、構成されたポリシーに従って変更が安全かつ確実に適用されます。
データプレーン
アプリケーション コードは、データプレーンとやり取りしてフラグ値を使用します。
- OpenFeature SDK: ベンダーに依存しない OpenFeature SDK をアプリケーションに統合します。
flagdプロバイダ:flagdプロバイダを使用するように OpenFeature SDK を構成します。- 構成:
flagdプロバイダを App Lifecycle Manager フィーチャー トグル サービス エンドポイント(saasconfig.googleapis.com:443)にポイントします。 - ターゲティング:
provider_idを指定して、フラグ構成を識別します。この値は通常、App Lifecycle Manager ユニットの完全なリソース名(projects/PROJECT_ID/locations/LOCATION/featureFlagsConfigs/UNIT_IDなど)に対応します。 - 認証: プロバイダは、アプリケーションのデフォルト認証情報(ADC)を使用して、 Google Cloud サービス エンドポイントへのリクエストを安全に認証します。使用するサービス アカウントには、
roles/saasconfig.viewerIdentity and Access Management ロールが必要です。 - フラグの評価: コードで標準の OpenFeature メソッド(
client.get_boolean_value(...))を使用して、フラグ値を確認します。プロバイダは、デプロイ済みの最新の構成をサービスから取得します。
App Lifecycle Manager には、データプレーンとの統合に関するリファレンス実装と例が用意されています。
フィーチャー トグルの値のタイプ
App Lifecycle Manager のフィーチャー トグルは、標準のオン/オフのブール値評価以上の機能をサポートしています。STRING、INTEGER、DOUBLE の値を使用してフラグを定義し、ランタイムしきい値、テーマ パラメータ、構成上限などの複雑な運用変数を制御できます。
ブール値フラグとは異なり、非ブール値フラグは作成時に明示的に定義して、可能な戻り値の型の範囲を指定する必要があります。
文字列フラグ
文字列フラグは、接続されたクライアントに構成識別子を直接渡します。
gcloud beta app-lifecycle-manager flags create "feature-mode" \
--key="feature-mode" \
--flag-value-type=STRING \
--location="global" \
--unit-kind="UNIT_KIND_ID" \
--variants='[{"id": "standard", "stringValue": "STANDARD"}, {"id": "advanced", "stringValue": "ADVANCED"}]' \
--evaluation-spec='{"defaultTarget": "standard"}'
整数フラグ
整数フラグは、正確な数値制限とペイロード境界を制御します。
gcloud beta app-lifecycle-manager flags create "max-retry-count" \
--key="max-retry-count" \
--flag-value-type=INTEGER \
--location="global" \
--unit-kind="UNIT_KIND_ID" \
--variants='[{"id": "low", "integerValue": 3}, {"id": "high", "integerValue": 10}]' \
--evaluation-spec='{"defaultTarget": "low"}'
ダブルフラッグ
倍精度フラグは、確率しきい値または浮動小数点パラメータに使用される高精度値を返します。
gcloud beta app-lifecycle-manager flags create "sampling-rate" \
--key="sampling-rate" \
--flag-value-type=DOUBLE \
--location="global" \
--unit-kind="demo-test-unitkind" \
--variants='[{"id": "minimal", "doubleValue": 0.01}, {"id": "full", "doubleValue": 1.0}]' \
--evaluation-spec='{"defaultTarget": "minimal"}'
ロールアウトを使用してフィーチャー トグルをプロビジョニングする
App Lifecycle Manager は、ロールアウトを使用してフィーチャー トグルの更新をプロビジョニングすることで、大規模な変更や更新を安全に行います。
段階的な公開を行わない場合、フラグ構成の軽微な変更(1% のユーザーに対して機能を有効にするなど)が、すべてのアプリケーション インスタンスに瞬時に伝播されます。この機能で回帰が発生すると、インフラストラクチャ全体で同時に問題が発生する可能性があります。このグローバルな伝播により、サービスに広範な影響が及ぶリスクが大幅に高まります。
App Lifecycle Manager のロールアウトでは、フラグの変更を段階的に制御して配布することで、このリスクを軽減し、予期しない問題の潜在的な範囲を制限します。
フィーチャー トグル セット
フィーチャー トグル セットは、複数のフィーチャー トグルをグループ化し、1 つの論理リソースとして管理できるようにします。これは、複数のフラグを調整する必要がある機能をリリースする場合に便利です。
マニフェスト
マニフェストを使用すると、JSON ファイルを使用してフィーチャー トグルを定義して管理できます。これらの定義を App Lifecycle Manager API に push することも、既存の構成を pull してアプリケーションのタイプセーフなアクセサを生成することもできます。
複雑なターゲティング
Common Expression Language(CEL)を使用すると、ユーザー属性やリクエスト属性に基づいて高度なターゲティング ルールを作成し、どのユーザーにどの機能を表示するかを正確に制御できます。
詳しくは、複雑なターゲティングをご覧ください。
マルチテナント アーキテクチャ
フラグを特定のユニットまたはユニットのグループ(ラベルまたはテナントを使用)にターゲット設定する場合は、App Lifecycle Manager でマルチテナント デプロイを使用できます。テナント フリート全体に段階的なロールアウトを実装することもできます。
フィーチャー トグルを割り当てる
割り当て(テストやベースラインなど)を定義し、トラフィック分割を使用してテストまたはランダム化されたロールアウトを実行します。
次のステップ
- フィーチャー トグルをデプロイするクイックスタートを試して、App Lifecycle Manager で管理されるデプロイにフラグを統合します。
- このプラットフォームを初めて使用する場合は、メインの App Lifecycle Manager の概要をご覧ください。