Skip to content

Feature Flags ​

これは何? ​

このドキュメントでは、Web アプリで利用している Feature Flags について説明します。

概要 ​

Feature flags とは、プロダクト開発時に、機能の公開を制御するための仕組みです。

Quden においては、Backend 側に Feature flags を返すエンドポイントを定義し、Web frontend 側や Chrome extension、Desktop app などで利用しています。

処理の流れは下記に示すとおりです。

mermaid
sequenceDiagram
participant Frontend
participant Backend (NestJS)
participant AWS AppConfig
Frontend->>Backend (NestJS): Request feature flags
Backend (NestJS)->>AWS AppConfig: Get values from AppConfig
AWS AppConfig-->>Backend (NestJS): Return values from AppConfig
Backend (NestJS)->>Backend (NestJS): Merge values with default values
Backend (NestJS)-->>Frontend: Return feature flags

データが定義されている場所 ​

Feature flags の値は、大きく2つの箇所に定義されています。

  • 1: Backend へのハードコーディング
  • 2: AWS AppConfig での管理

1: Backend へのハードコーディング ​

Backend コードベースにおいて、Feature flags の値は src/common/constants.ts に定義されています。

コードベースに直接記述する以上、変更を適用するには再デプロイが必要な点に注意が必要です。主に頻繁に値の変更を伴わないフラグや、フラグ導入の初期段階において利用することが多いです。基本的には、次に説明する 2 の AWS AppConfig での管理を利用することを推奨します。

2: AWS AppConfig での管理 ​

AWS AppConfig は、AWS が提供する構成管理サービスです。Quden では、Feature flags の値を AWS AppConfig で JSON として管理しています。

JSON 形式で設定内容を記述し、AWS AppConfig 上で値の更新をデプロイすることで、Backend を再デプロイすることなく Feature flags の値を変更することができます。

また、JSON の書き方を工夫することで下記のような機能を持たせています。(詳しくは「データ型」参照のこと)

  • フラグの ON/OFF
  • フラグを適用するワークスペースの Allowed List (White List)
  • フラグを有効化する期間の指定

データ型 ​

Feature flags の利用において、下記の大きく2つのデータ型を理解する必要があります。

  • FeatureFlag: 各機能の ON/OFF を管理するシンプルな型
  • AppConfigProfile: AppConfig で管理する際のデータ型

FeatureFlag ​

key として機能名のキャメルケースを、value として boolean を持つオブジェクトです。慣例的に IS_* と記述することが多いです。

src/common/constants.ts に定義されています。

例:

ts
export const FEATURE_FLAGS = {
  // ...
  IS_TRANSCRIBE_AUDIO_AVAILABLE: false,
  IS_IP_ADDRESS_FILTER_AVAILABLE: false,
  // ...
} as const;

AppConfigProfile ​

AppConfigProfile は下記のような type として定義されています。 src/aws-app-config/aws-app-config.service.ts に定義されています。

ts
export type AppConfigProfile = {
  allowedList: {
    // ...
    // その他、Feature flag として管理しない Allowed List の値を定義しています
  };
  featureFlags: {
    // ...
    IS_TRANSCRIBE_AUDIO_AVAILABLE: {
      enabled: boolean;
      allowedWorkspaceList: AvailableWorkspaceInfo[];
    };
    IS_IP_ADDRESS_FILTER_AVAILABLE?: {
      enabled: boolean;
      allowedWorkspaceList: AvailableWorkspaceInfo[];
      filterList: IpAddressFilterListItem[];
    };
    // ...
  };
};

上記をみて分かるように featureFlags に関しては以下の共通する key を持っています。

  • enabled: フラグの ON/OFF を管理する boolean 値
  • allowedWorkspaceList: フラグを適用するワークスペースの Allowed List (White List)

ここに値を指定することで、フラグの ON/OFF をワークスペースごとに制御することができます。

使い方 ​

Feature flags を追加する場合は、大きく下記の流れで行います。