AWS AppConfigの機能フラグがパブリックプレビューになっていたので使ってみた

2021.12.14

いわさです。

数ヶ月前に以下の記事でAppConfigのパラメータ比較について紹介したのですが、その後コンソールを見てみるとUIが少し変わっていました。

「自由形式の設定プロファイル」というタイプ情報が表示されるようになっています。
調べたところ、フィーチャーフラグを設定するための機能がパブリックプレビューとなっていました。

利用にあたり、従来とUIや取得方法が変わっているようだったので試してみました。

本機能はパブリックプレビューのため、今後変更される可能性があります

機能(フィーチャー)フラグ

前回以下のような形式で構成情報を作成していました。
実はハイライト部分はフィーチャーフラグを想定して設定していました。

{
  "features": [
    {
      "features": "enable-admin",
      "enabled": false
    },
    {
      "features": "enable-password-encrypt",
      "enabled": true
    },
    {
      "features": "enable-hogehoge",
      "enabled": true
    }
  ],
  "apis": [
    {
      "function": "get-admins",
      "ref": "https://xxx-aaa.bb/xxxxx"
    }
  ]
}

フィーチャーフラグは事前に外部からフラグ情報を注入したアプリケーションをデプロイしておくことで、アプリケーションデプロイを伴わずに迅速に機能の有効化、無効化を行う方法で、様々なアプリケーションで導入されています。

従来AppConfigで実現するためには上記のように構成ファイルに機能フラグも含める必要がありましたが、今回のプレビュー機能で機能フラグと構成情報を切り離して管理することが出来るようになりました。

機能フラグの登録

設定プロファイル作成時に機能フラグ/自由形式の設定を選択します。
自由形式の構成はAppConfigがホストする設定保存先以外に、S3やパラメータストアなどいくか選択肢がありましたが、機能フラグの場合は選択出来ません。

フラグのON/OFFの他にオプションで属性情報を含ませることも可能です。
ON/OFFとあわせて追加の構成情報が必要になる場合はあわせて利用すると良いですね。
パラメータの入力チェック機能があるので、不正なパラメータが反映されることを防ぐことも出来ます。

試してみる

では使ってみたいと思います。

機能フラグを新規作成します。
クライアント側で利用する場合は新しいバージョンの保存とデプロイが済んでいる必要がありますので、済ませておきます。

今回はAWS CLIからフラグの確認を行ってみます。
実際はAWS SDKを使って取得する形になると思います。AWSのサンプルコードでも以下のような使われ方がされています。

const getConfig = require('/opt/nodejs/getConfig');
const getFeature = require('/opt/nodejs/getFeature');

async function getProducts() {
  const config = await getConfig();
  const flag = await getFeature('show_stock', config);
  let attributesToGet = '';
  if (flag) {
    attributesToGet = ['id', 'itemDesc', 'itemName', 'itemPrice', 'itemImage', 'itemStock'];
  } else {
    attributesToGet = ['id', 'itemDesc', 'itemName', 'itemPrice', 'itemImage'];
  }

  ...

  return response;
};

引用元: aws-samples/aws-appconfig-feature-flags

CLIからGetConfigurationしてみます。

[cloudshell-user@ip-10-0-99-65 ~]$ aws appconfig get-configuration --application iwasa-config --environment product --configuration hoge-app-flags --client-id iwasa20211214 hogeflags

An error occurred (BadRequestException) when calling the GetConfiguration operation: Feature flag configurations must be accessed via AWS AppConfig Data's GetLatestConfiguration API.

失敗しました。

従来の自由形式の設定であればGetConfigurationで取得可能だったのですが、どうやら機能フラグ形式の場合は取得出来ません。
試しに自由形式型を取得してみましょう。

[cloudshell-user@ip-10-0-99-65 ~]$ aws appconfig get-configuration --application iwasa-config --environment product --configuration hoge-app-config --client-id iwasa20211214 hogeconfig
{
    "ConfigurationVersion": "4",
    "ContentType": "application/json"
}
[cloudshell-user@ip-10-0-99-65 ~]$ cat hogeconfig 
{
  "features": [
    {
      "features": "enable-admin",
      "enabled": false
    },
    {
      "features": "enable-password-encrypt",
      "enabled": true
    },
    {
      "features": "enable-hogehoge",
      "enabled": true
    }
  ],
  "apis": [
    {
      "function": "get-admins",
      "ref": "https://xxx-aaa.bb/xxxxx"
    }
  ]
}

取得出来ましたね。

GetLatestConfigurationを使う

さて、機能フラグを取得する場合はGetLatestConfigurationを使う必要があり、AWS CLIの場合だとaws appconfigではなくaws appconfigdataAPIを利用する必要があります。
そして、この機能はバージョン2.4.0で実装されたものになりますので、古い環境の場合はCLIのバージョンは事前に更新しておきましょう。

では、バージョンアップした環境で試してみます。
GetLatestConfigurationを使う場合は、先にStartConfigurationSessionを行ってトークンを取得しておく必要があります。

[cloudshell-user@ip-10-0-99-65 ~]$ aws appconfigdata start-configuration-session --application-identifier iwasa-config --configuration-profile-identifier hoge-app-flags --environment-identifier product
{
    "InitialConfigurationToken": "hogehogehogehoge"
}
[cloudshell-user@ip-10-0-99-65 ~]$ aws appconfigdata get-latest-configuration --configuration-token hogehogehogehoge hogeresult
{
    "ContentType": "application/json",
    "NextPollConfigurationToken": "hogehogehogehoge2",
    "NextPollIntervalInSeconds": "60"
}
[cloudshell-user@ip-10-0-99-65 ~]$ cat hogeresult | jq
{
  "flag-key-2": {
    "enabled": false
  },
  "flag-name-1": {
    "enabled": true,
    "hoge1": "test-str",
    "hoge2": 5,
    "hoge3": true,
    "hoge4": [
      "aaa"
    ],
    "hoge5": [
      25
    ]
  }
}

取得出来ました。
アプリケーション側では、このenabled値を判定し機能の有効化/無効化を実装する形となります。

次に、設定値を変更してみます。
先程と同様、デプロイまでしないと反映されないのでご注意ください。

[cloudshell-user@ip-10-0-99-65 ~]$ aws appconfigdata get-latest-configuration --configuration-token hogehoge hogeresult2
{
    "ContentType": "application/json",
    "NextPollConfigurationToken": "piyopiyo",
    "NextPollIntervalInSeconds": "60"
}
[cloudshell-user@ip-10-0-99-65 ~]$ cat hogeresult2 | jq
{
  "flag-key-2": {
    "enabled": true
  },
  "flag-name-1": {
    "enabled": true,
    "hoge1": "test-str",
    "hoge2": 5,
    "hoge3": true,
    "hoge4": [
      "aaa"
    ],
    "hoge5": [
      25
    ]
  }
}

フラグが切り替わったことを確認することが出来ました。

さいごに

本日はパブリックプレビューになっていた、AppConfigの機能フラグを使ってみました。

機能フラグの実装のために本番環境の必須構成情報をアップデートする必要がないので、安全に設定更新の運用が出来そうですね。
まだプレビューですが、是非試してみてください。