Feature Flags
これは何?
このドキュメントでは、Web アプリで利用している Feature Flags について説明します。
概要
Feature flags とは、プロダクト開発時に、機能の公開を制御するための仕組みです。
Quden においては、Backend 側に Feature flags を返すエンドポイントを定義し、Web frontend 側や Chrome extension、Desktop app などで利用しています。
処理の流れは下記に示すとおりです。
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 に定義されています。
例:
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 に定義されています。
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 を追加する場合は、大きく下記の流れで行います。
- 1:
FeatureFlagの定義src/common/constants.tsのFEATURE_FLAGSにデフォルト値として定義します
- 2:
AppConfigProfileの定義- AWS コンソールにログインし、JSON を更新します
- 詳しくは How-to: AppConfig を使って許可リストを更新する方法 | ジパンク | Quden も参照してください