Amazon Web Services ブログ

AWS AppConfig 機能フラグ(プレビュー)のご紹介

最新の DevOps プラクティスでは、開発チームは顧客からのフィードバックに基づいてアプリケーション開発を継続的かつ短時間で繰り返す必要があります。これらの反復では主に、アプリケーションへの新機能の導入、または制限の引き上げやフォールトトレランスの向上などの運用上のイベントに対処するためのアプリケーションのチューニングを行います。
機能フラグは機能トグルとも呼ばれ、開発者や DevOps プロフェッショナルがアプリケーションコード内の機能をすばやく有効または無効にするために広く使用されています。一般的な使用例の 1 つは、アプリケーションの新機能の起動を簡素化することです。開発者は、アプリケーションコードを事前にデプロイし、エンドユーザーが機能にアクセスできないように機能フラグの後ろに隠すことができます。機能を公開する時期になると、開発者は機能フラグを有効にして、ユーザーがその機能を使用できるようになります。もう 1 つのユースケースは、DevOps のプロフェッショナルが、アプリケーションで運用イベントが発生したときに詳細ログをオンにし、運用イベントが終了したらログをオフにする運用フラグを有効にすることです。

2019 年に、Amazon 全体で数千ものチームが使用しているベストプラクティスを使用して、アプリケーション設定の変更をアプリケーションにデプロイできる AWS AppConfig のローンチを発表しました。AWS AppConfig を利用すると、アプリケーション設定データと機能フラグをアプリケーションの実行時に一元的に管理およびデプロイできます。

2021年11月に、AWS AppConfig 機能フラグのローンチを発表しました。従来、AWS AppConfig では機能フラグをアプリケーション設定データと共に JSON もしくは YAML で定義する必要がありましたが、この機能により、機能フラグを切り離して管理出来るようになりました。機能フラグ設定の作成、フラグとフラグ属性の定義、フラグ属性値を検証するための制約の定義、およびアプリケーション実行時の新機能のデプロイを迅速に行うことができます。Amazon の何千ものチームがこのソフトウェアのベストプラクティスを使用して、お客様からのフィードバックに基づいて製品の開発を繰り返し、お客様に継続的に機能をリリースしています。

AWS AppConfig 機能フラグは、アプリケーションに変更を加える際に、新しい機能を反映させる割合をコントロールできます。また、設定データがアプリケーションへの入力として正しいことを検証できます。新しい値を徐々にデプロイしながら、万が一エラーが発生した場合は、AWS AppConfig は変更を自動的にロールバックして、アプリケーションの停止を防ぐことができます。機能フラグを活用するサンプルアプリケーションを構築することで、AWS AppConfig 機能フラグがどのように動くかご紹介します。

サンプルアプリケーションの概要

サンプルアプリケーションの Feature Flag Store は、ホームページに複数の商品を表示する EC サイトです。Web サイトでは、顧客が商品を選択することで、商品についてさらに詳しく調べることができます。閲覧が完了すると、顧客はカートに商品を追加し、リストされている支払いオプションのいずれかを使用して支払いを完了することができます。AppConfig 機能フラグを使用して、完全なコードをデプロイすることなく、この Web サイトに新機能をデプロイします。以下で、新機能の作成とデプロイについて見ていきましょう。

  1. 商品の在庫表示機能
  2. 2つめの支払いオプション

Application Image

このアプリケーションは、フロントエンド用の静的 Web サイトと Amazon API GatewayAWS LambdaDynamoDB を使用した API ベースのサーバーレスバックエンドで構成されます。機能フラグが作成され、AWS AppConfig からフェッチされます。アプリケーションのフロントエンドは React を使用して構築され、AWS Amplify Hosting を介した配信を目的としています。開発およびデモの目的で、Amplify Hostingにデプロイせずにローカルで実行することも可能です。

Architecture

このアプリケーションでは、2 つの Lambda 関数を使用します。1つ目の Lambda 関数は、Amazon DynamoDB テーブルから製品のリストを取得し、AWS AppConfig から機能フラグをフェッチします。2 つ目の Lambda 関数は AWS AppConfig から機能フラグをフェッチして、フロントエンド機能をオンにします。両方の Lambda 関数は、AWS AppConfig Lambda 拡張機能をレイヤーとして使用して、AWS AppConfig から設定データを取得します。AWS AppConfig Lambda 拡張機能を Lambda 関数と統合すると、AppConfig から設定を取得するプロセスが簡素化されます。AWS AppConfig を使用して、Amazon Elastic Compute Cloud (EC2) でホストされているアプリケーション、コンテナ、オンプレミスサーバー、IoT デバイス、およびモバイルアプリケーションに設定と機能フラグをデプロイすることもできます。最初に AWS AppConfig を使用して機能フラグを作成し、その新しい機能をアプリケーションに導入します。

AWS AppConfig アプリケーション、環境、および機能フラグの作成

    1. AWS マネジメントコンソールで AWS AppConfig に移動し、[使用を開始する] を選択します。
    2. アプリケーション名を入力し、[アプリケーションを作成]をクリックします。
      Create Application
      URL のアプリケーション ID を書き留めます。アプリケーションをデプロイする際には、アプリケーション ID を使用します。
      Application ID
    3. アプリケーションを作成したら、[構成プロファイルと機能フラグ] タブを選択します。このタブでは、機能フラグと自由形式の設定を保存できるようになりました。次に、[作成] を選択して、機能フラグ設定プロファイルを作成します。
      My Website
    4. [機能フラグ] を選択し、機能フラグ設定プロファイルを作成します。
      Configuration Profile Type
      Feature Flag Cofiguration Profile
    5. 機能フラグ設定プロファイルが正常に作成されました。この設定プロファイルを使用すると、アプリケーションの機能フラグを作成して一元的に管理できます。次に、2 つの機能フラグを作成します。1 つは商品の在庫を表示できるフラグで、もう 1 つはチェックアウトオプションとしてモバイル決済を有効にする機能フラグです。
      Feature Flag Store 1
    6. [新しいフラグを追加] を選択して、フラグの作成を開始します。フラグ名を「show-stock」と入力します。AppConfig は、一意のフラグキーを自動的に設定します。フラグを作成する前に、ここでフラグを有効または無効にすることもできます。
      Add Flag 1
    7. AppConfig では、コードパスを実行できるブール値フラグを作成するだけでなく、フラグ内に詳細な値を属性として格納することもできます。たとえば、開発者が顧客に対して「在庫を表示」機能を有効にしたいが、表示されるアイテムの最大値を 10 に制限したい場合、フラグのプロパティを制御する属性を追加できます。AppConfig では、属性値の検証を可能にする制約を追加することもできます。フラグデータがアプリケーションで使用可能になったときに有効または無効にできる属性を複数追加できます。AppConfig では、次の属性タイプがサポートされています。
      • 文字列
      • 数値
      • ブール値
      • 文字列配列
      • 数値配列
    8. 次に示すように、同じ設定プロファイル内で、キーを「mobile-payment」とする別のフラグを作成します。このフラグに属性を追加して、このオプションに対応するテキストを UI に表示する方法を変更します。[新しい属性の追加] を選択し、属性キーを「title」、属性タイプを「文字列」に設定し、任意の文字列値を入力します。[フラグを作成] を選択します。
      Add Flag 2
    9. [新しいバージョンを保存] を選択して、変更内容を保存します。この 2 つの機能フラグはまだ有効になっていないことに注意してください。
      Feature Flag Store 2
      Feature Flag Store3
    10. [デプロイを開始] をクリックします。環境の名前を入力後、[環境を作成] をクリックして、この設定のデプロイ先となる環境を作成します。環境 ID を書き留めます。環境の作成時に、オプションで Amazon CloudWatch アラームをモニターセクションに追加できます。モニターを追加すると、設定のデプロイ中にエラーが発生した場合、AWS AppConfig は以前のバージョンにロールバックできます。
    11. 「デプロイを開始」をクリックして、機能フラグをデプロイします。
      Start Deployment
      Deployment1

機能フラグ設定プロファイルを作成すると、AWS AppConfig は一部のメタデータとともにデータをホストされた設定として保存することに注意してください。次の CLI コマンドを使用して、AppConfig で作成された JSON ファイルを表示できます。

aws appconfig get-hosted-configuration-version --application-id <value> --configuration-profile-id <value> --version-number <value> <output filename>

{
  "flags": {
    "mobile_payment": {
      "_createdAt": "2021-10-01T20:58:48.884Z",
      "_updatedAt": "2021-10-01T20:58:48.884Z",
      "attributes": {
        "title": {
          "constraints": {
            "type": "string"
          }
        }
      },
      "name": "mobile-payment"
    },
    "show_stock": {
      "_createdAt": "2021-10-01T18:46:02.458Z",
      "_updatedAt": "2021-10-01T18:46:02.458Z",
      "name": "Show-stock"
    }
  },
  "values": {
    "mobile_payment": {
      "_createdAt": "2021-10-01T20:58:48.884Z",
      "_updatedAt": "2021-10-01T20:58:48.884Z",
      "enabled": false,
      "title": "Mobile payments (for orders over $5)"
    },
    "show_stock": {
      "_createdAt": "2021-10-01T18:46:02.458Z",
      "_updatedAt": "2021-10-01T18:46:02.458Z",
      "enabled": false
    }
  },
  "version": "1"
}

デプロイされた設定を取得するには、ドキュメントの説明に従って GetLatestConfiguration API を呼び出します。GetLatestConfiguration API 呼び出しへの応答として、機能フラグと属性を定義する情報は削除されます。簡略化された JSON には、指定した各フラグキーと一致するキーのマップと、「enabled」属性が true または false のマップである値が含まれます。この場合、機能をまだ有効にしていないため、この属性は false に設定されます。getLatestConfiguration を呼び出すと、次の出力が得られます。

{
  "mobile_payment": {
    "enabled": false
  },
  "show_stock": {
    "enabled": false
  }
}

アプリケーションをインストールし、新機能をリリースします。バックエンドは AWS サーバーレスアプリケーションモデル (SAM) を使用して構築されており、インストールには AWS SAM CLI が必要です。AWS SAM CLI のインストール手順については、こちらをご覧ください。

バックエンドアプリケーションのインストール

  1. サンプルアプリケーションリポジトリをローカル開発マシンにクローンします。
    gh repo clone aws-samples/aws-appconfig-feature-flags
  2. 以下のコマンドを実行してバックエンドディレクトリに移動し、依存関係をインストールします。
    cd appconfig-feature-flags
    cd backend
    npm install
  3. sam build を使用して AWS SAM テンプレートファイルを使用してアプリケーションを処理およびビルドします。
  4. 次のコマンドを使用してバックエンドアプリケーションをデプロイし、プロンプトに従います。sam deploy --guided
  5. プロンプトが表示されたら AppConfig アプリケーション、環境、および設定プロファイルの ID を追加し、すべてのデプロイメントプロンプトを確認します。
  6. デプロイの出力で、DynamoDBTableName キーと HttpAPIURL キーを書き留めます。次のような出力が得られます。
    Key DynamoDBTableName \
    Description The name of your DynamoDB table \
    Value sam-app-DynamoDBTable-XXXXXXXXXXX \
    \
    Key HttpApiUrl \
    Description URL of your API endpoint \
    Value https://XXXXXXXX.execute-api.XX-XXXXXXXX-1.amazonaws.com

DynamoDB テーブルへのサンプルデータの入力

  1. テンプレートファイル dynamodb.json.template を開き、YOUR_DYNAMODB_TABLE_NAME を sam デプロイの出力から得た DynamoDBTableName キーの値に置き換えます。このファイルを dynamodb.json として保存します。
  2. 次のコマンドを実行して、DynamoDB テーブルにサンプルデータを入力します。
    aws dynamodb batch-write-item --request-items file://dynamodb.json
  3. 次のような出力が得られます。
    {
    "UnprocessedItems": {}
    }

フロントエンドアプリケーションのインストール

  1. frontend ディレクトリに移動し、次のコマンドを使用して依存関係をインストールします。
    cd frontend
    npm install
  2. src フォルダーにあるテンプレートファイル config.json.template を開き、YOUR_API_ENDPOINT を sam デプロイ出力の HttpAPIURL キーの値に置き換えます。ファイルを config.json として保存します。
  3. 次のコマンドを使用してローカルの開発用サーバーを起動します。
    npm start
  4. ブラウザで http://localhost:3000/ を開き、Web アプリケーションを表示します。以下のサイトが表示されます。Web サイトには複数の商品が掲載されていますが、各商品の在庫は表示されません。任意の商品を選択し、カートに商品を追加します。カートに移動すると、支払い方法として「デビットカード」しか使用できないことがわかります。AWS AppConfig を使用して、先に作成した機能フラグをアプリケーションにデプロイします。
    Feature Flag Store UI 1
    Checkout UI 1

AppConfig 機能フラグのデプロイ

  1. 機能フラグ設定プロファイルに戻り、トグルを選択して両方のフラグを有効にします。新しいバージョンとして保存してください。
    Flag
  2. [デプロイを開始] をクリックして、機能フラグを Web アプリケーションにデプロイします。フラグをデプロイする環境とデプロイ戦略を選択し、もう一度 [デプロイを開始] をクリックします。
  3. デプロイの進捗状況は、デプロイの詳細ページで確認できます。
  4. デプロイが完了したら、ブラウザをリロードして、アプリケーションの実行時に Web サイトの機能を確認します。
    Feature Flag Store UI 2
    Checkout UI 2

GetLatestConfiguration API を呼び出して、アプリケーションによって取得された JSON データを表示することもできます。

{
  "mobile_payment": {
    "enabled": true,
    "title": "Mobile payments (for orders over $5)"
  },
  "show_stock": {
    "enabled": true
  }
}

まとめ

AWS AppConfig 機能フラグを使用すると、コードをデプロイせずに新機能を本番環境に安全にリリースできます。これにより、開発者と DevOps チームは機能フラグの設定データを検証し、監視および制御された方法で 1 つまたは複数の機能フラグをアプリケーションにデプロイできます。アプリケーション設定をコードから分離することは、長年 Amazon のベストプラクティスでした。AWS AppConfig 機能フラグにより、お客様は AWS AppConfig を使用して機能フラグを簡単に作成、管理、デプロイできるようになりました。

著者について

Vinni Satija Sagar

Vinni は AWS AppConfig のプロダクトマネージャーで、ワシントン DC を拠点に活動しています。お客様を起点に考え、お客様のニーズに応えるソリューションを作成しています。

Gunnar Grosch

Gunnar はスウェーデンを拠点とする AWS のシニアデベロッパーアドボケイトです。開発者に着想を与えるコンテンツの作成と、開発者コミュニティの支援に重点を置いています。レジリエンス、信頼性、カオスエンジニアリング、オペレーショナルエクセレンス、サーバーレスに関心を持っています。

翻訳はソリューションアーキテクトの村田が担当しました。原文はこちら