【AWS AppConfig】機能フラグを作成して環境にデプロイするまでの流れを AWS CLI でやってみた

はじめに

テントの中から失礼します、IoT 事業部のてんとタカハシです!

AppConfig の機能フラグは、今年(2022年)の3月から一般提供が開始されました。そこから3ヶ月ほど経過していますが、本番で導入されているケースも徐々に増えているんじゃないでしょうか。

今回は、AppConfig の機能フラグを作成して環境にデプロイまでの流れを全て AWS CLI でやってみた例を記載していきます。

機能フラグの使い方については、下記の記事を参考にしていただければと思います。

環境

今回、AWS CLI で各リソースを作成するにあたり使用した環境は下記の通りです。

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H1824

$ aws --version
aws-cli/2.7.9 Python/3.9.11 Darwin/19.6.0 exe/x86_64 prompt/off

手順

アプリケーションの作成

まずは親となるアプリケーションを作成します。

$ aws appconfig create-application --name SampleApplication

{
    "Id": "0f6obu6",
    "Name": "SampleApplication"
}

マネジメントコンソール上で「SampleApplication」が作成されていること確認できます。

機能フラグ設定プロファイルの作成

続いて、機能フラグ設定プロファイルを作成します。引数には作成したアプリケーションの ID を指定します。

$ aws appconfig create-configuration-profile \
  --application-id 0f6obu6 \
  --name SampleProfile \
  --location-uri hosted \
  --type AWS.AppConfig.FeatureFlags

{
    "ApplicationId": "0f6obu6",
    "Id": "lehhn08",
    "Name": "SampleProfile",
    "LocationUri": "hosted",
    "Type": "AWS.AppConfig.FeatureFlags"
}

指定したアプリケーションの中に「SampleProfile」が作成されていること確認できます。

環境の作成

続いて、環境を作成します。引数には作成したアプリケーションの ID を指定します。

$ aws appconfig create-environment \
  --application-id 0f6obu6 \
  --name dev

{
    "ApplicationId": "0f6obu6",
    "Id": "f73rq4b",
    "Name": "dev",
    "State": "ReadyForDeployment"
}

指定したアプリケーションの中に「dev」が作成されていること確認できます。

機能フラグの作成

続いて、機能フラグを作成します。ここが本記事の肝となる部分です。

引数で指定する主な内容は下記の通りです。

  • application-id:作成したアプリケーションの ID
  • configuration-profile-id:作成した機能フラグ設定プロファイルの ID
  • content:作成する機能フラグを定義した JSON ファイル(の中身を base64 エンコードしたもの)
  • latest-version-number:バージョン番号
    • 0始まりとなるため注意が必要で、初めてバージョンを作成する場合は「0」を指定する(バージョン1が作成される)
$ aws appconfig create-hosted-configuration-version \
  --application-id 0f6obu6 \
  --configuration-profile-id lehhn08 \
  --content-type "application/json" \
  --content $(cat ./content.json | base64) \
  --latest-version-number 0 \
  result.txt

{
    "ApplicationId": "0f6obu6",
    "ConfigurationProfileId": "lehhn08",
    "VersionNumber": "1",
    "ContentType": "application/json"
}

機能フラグを定義する JSON のスキーマについては、下記ドキュメントに記載があります。

今回は下記の JSON を用意して機能フラグを作成してみました。作成可能な属性の型(数値、文字列、ブール値、数値配列、文字列配列)を全て入れ込んでいます。詳細は後に説明します。

content.json

{
  "version": "1",
  "flags": {
    "sampleFlag": {
      "name": "SampleFlag",
      "description": "sample flag",
      "attributes": {
        "sampleString": {
          "description": "sample string enum",
          "constraints": {
            "type": "string",
            "required": true,
            "enum": ["red", "blue", "yellow"]
          }
        },
        "sampleNumber": {
          "description": "sample number",
          "constraints": {
            "type": "number",
            "required": true,
            "minimum": 1,
            "maximum": 10
          }
        },
        "sampleBool": {
          "description": "sample boolean",
          "constraints": {
            "type": "boolean",
            "required": true
          }
        },
        "sampleStringArray": {
          "description": "sample string array pattern",
          "constraints": {
            "type": "array",
            "required": true,
            "elements": {
              "type": "string",
              "pattern": "[A-Z]{2}"
            }
          }
        },
        "sampleNumberArray": {
          "description": "sample number array",
          "constraints": {
            "type": "array",
            "required": false,
            "elements": {
              "type": "number"
            }
          }
        }
      }
    },
    "shortTermFlag": {
      "name": "ShortTermFlag",
      "description": "short term flag",
      "_deprecation": {
        "status": "planned"
      }
    }
  },
  "values": {
    "sampleFlag": {
      "enabled": true,
      "sampleString": "red",
      "sampleNumber": 1,
      "sampleBool": true,
      "sampleStringArray": ["AA", "BB", "CC"],
      "sampleNumberArray": []
    }
  }
}

コマンドを実行した後、機能フラグと属性が作成されていることを確認できます。バージョンは「1」となっており、5つの属性を持つ「SampleFlag」と、属性を持たない「ShortTermFlag」のフラグ2つが作成されています。

SampleFlag の詳細はこちら。

ShortTermFlag の詳細はこちら。

デプロイ

最後に、作成した機能フラグを環境にデプロイします。

引数で指定する主な内容は下記の通りです。

  • application-id:作成したアプリケーションの ID
  • environment-id:作成した環境の ID
  • deployment-strategy-id:デプロイ戦略の ID(今回はデフォルトで用意されている AppConfig.AllAtOnce を指定)
  • configuration-profile-id:作成した機能フラグ設定プロファイルの ID
  • configuration-version:バージョン番号(ここは1始まり)
$ aws appconfig start-deployment \
 --application-id 0f6obu6 \
 --environment-id f73rq4b \
 --deployment-strategy-id AppConfig.AllAtOnce \
 --configuration-profile-id lehhn08 \
 --configuration-version 1

{
    "ApplicationId": "0f6obu6",
    "EnvironmentId": "f73rq4b",
    "DeploymentStrategyId": "AppConfig.AllAtOnce",
    "ConfigurationProfileId": "lehhn08",
    "DeploymentNumber": 1,
    "ConfigurationName": "SampleProfile",
    "ConfigurationLocationUri": "hosted",
    "ConfigurationVersion": "1",
    "DeploymentDurationInMinutes": 0,
    "GrowthType": "LINEAR",
    "GrowthFactor": 100.0,
    "FinalBakeTimeInMinutes": 10,
    "State": "DEPLOYING",
    "EventLog": [
        {
            "EventType": "DEPLOYMENT_STARTED",
            "TriggeredBy": "USER",
            "Description": "Deployment started",
            "OccurredAt": "2022-06-23T17:17:59.007000+00:00"
        }
    ],
    "PercentageComplete": 0.0,
    "StartedAt": "2022-06-23T17:17:59.007000+00:00"
}

指定した環境に新しいデプロイ番号が振られていることを確認できます。

手順としては以上になります。

機能フラグを定義する JSON について

改めて、JSON のスキーマは下記のドキュメントに記載されています。が、スキーマではなく実例の JSON が本記事投稿時点では載っていなかったので、解読に少し時間を要しました。せっかくなので、上記で記載した JSON の詳細について説明しようと思います。

最上位の Key

まず、最上位にある Key は「version」「flags」「values」の3つになります。

{
  "version": "1", // "1" 固定、おそらくスキーマのバージョン
  "flags": { // フラグの名前や、フラグに含める属性の定義(属性名や型など)を記載する
    ...  
  },
  "values": { // フラグごとに有効/無効を指定したり、属性ごとの値を指定する
    ... 
  }
}

flags

「flags」の直下には作成するフラグのキーを指定します。更にその中でフラグの名前、説明、属性ごとの定義、Short-term flag の有効化を指定することができます。属性を持たないフラグを作成することも可能です。

...

  "flags": {
    "sampleFlag": { // フラグキー
      "name": "SampleFlag", // フラグ名
      "description": "sample flag", // フラグの説明
      "attributes": {
        ...
      }
    },
    "shortTermFlag": {
      "name": "ShortTermFlag",
      "description": "short term flag",
      "_deprecation": {  // Short-term flag
        "status": "planned" // 有効にする
      }
      // 属性なし
    }

...

それぞれマネジメントコンソール上での表示は下記の通りになります。

補足ですが、Short-term flag についての説明は下記のドキュメントに記載があります。

With AWS AppConfig Feature flags, you can keep your flags organized by identifying some flags as short-term. Short-term flags are often used to launch a new feature. After the feature is launched, you will want to clean up the code and the flags that are no longer used. Identifying a flag as short-term will help you keep track of flags that you will deprecate in the future. If you identify a flag as short-term, you can filter on this attribute in the console. You are not required to identify any flags as short-term. This identifier is only meant to help you filter on temporary flags and clean up unused flags in your application configuration and code.

将来的に非推奨となるフラグであることを示したり、マネジメントコンソール上でフラグの一覧をフィルタリングして表示することが可能になります。

attributes

続いて「attriburtes」の中には、作成する属性ごとの名前や型の定義を記載します。

...

      "attributes": {
        "sampleString": { // 属性キー
          "description": "sample string enum", // 説明
          "constraints": {
            "type": "string", // 型(文字列)
            "required": true, // 値を必須にする
            "enum": ["red", "blue", "yellow"] // 制約(列挙型)
          }
        },
        "sampleNumber": {
          "description": "sample number",
          "constraints": {
            "type": "number", // 型(数値)
            "required": true,
            "minimum": 1, // 制約(最小値)
            "maximum": 10 // 制約(最大値)
          }
        },
        "sampleBool": {
          "description": "sample boolean",
          "constraints": {
            "type": "boolean", // 型(ブール値)
            "required": true
          }
        },
        "sampleStringArray": {
          "description": "sample string array pattern",
          "constraints": {
            "type": "array", // 型(配列)
            "required": true,
            "elements": {
              "type": "string", // 要素の型(文字列)
              "pattern": "[A-Z]{2}" // 制約(正規表現)
            }
          }
        },
        "sampleNumberArray": {
          "description": "sample number array",
          "constraints": {
            "type": "array", // 型(配列)
            "required": false,
            "elements": {
              "type": "number" // 要素の型(数値)
            }
          }
        }
      }

...

それぞれマネジメントコンソール上での表示は下記の通りになります。

values

最上位に戻りまして、「values」では flags で定義したフラグの有効/無効を指定したり、属性ごとの値を指定します。

...

  "values": {
    "sampleFlag": {
      "enabled": true, // フラグを有効にする
      "sampleString": "red", // 各属性の定義が続く
      "sampleNumber": 1,
      "sampleBool": true,
      "sampleStringArray": ["AA", "BB", "CC"],
      "sampleNumberArray": []
    }
  }

...

それぞれマネジメントコンソール上での表示は下記の通りになります。

JSON の説明については以上になります。

おわりに

AWS CLI を使って一連の流れを試したことにより、機能フラグの理解度がグッと上がった気がします。一部、バージョン番号の指定が0始まりだったりなど、少し癖を感じる部分もありますが、今後も理解を深めていくために色々と触ってみようと思います。

今回は以上になります。最後まで読んで頂きありがとうございました!