[AWS AppConfig] AppConfig の機能フラグで設定した値に基づいて CDK を deploy してみました

2023.02.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

CX 事業本部のデリバリー部の平内(SIN)です。

AWS AppConfig(以下、AppConfig)を利用すると、「機能の切り替え」などのタスクを安全に効率的に行うことができます。
AWS AppConfig とは?

AWS CDK は、TypeScript などの言語で作成されているため、AWS SDK を使用して AppConfig から動的にパラメータを取得し、それに基づいてスタックを構築することも可能になります。

なお、CDK で AWS SDK によるリソースアクセスをした場合、「コード(及び、パラメータ)等の動的な変更」という位置付けになるため、カスタムリソースを使用した、Create/Update/Delete の各ステージへの完全な対応ができない場合もあることに注意が必要です。

今回は、上記の制約を踏まえた上で、AppConfig で設定したパラメータに基づいて、CDK を deploy してみました。

2 AppConfig の設定

最初に、参照する AppConfig を設定です。

アプリケーションとして MyProject 、機能フラグとして cdkParamsを作成しました。

設定した内容は、以下のようになっています。

  • key1:value1
  • key2:value2
  • key3:value3

環境 prodでデプロイしました。

3 CDK

AWS リソースへのアクセスは、AWS SDK で記述できますが、これには、非同期(async/await)が必須になります。

コンストラクタでは、非同期の処理が書けないので、CDK のコンストラクタを生成する前に、前処理としてリソースにアクセスしたコードが、以下の通りです。

スタックを生成する前に、AppConfig から設定値を読み込んで、スタックのパラメータに渡しています。

bin/my-project.ts

#!/usr/bin/env node
import "source-map-support/register";
import * as cdk from "aws-cdk-lib";
import { MyProjectStack } from "../lib/my-project-stack";
import {
  GetLatestConfigurationCommand,
  StartConfigurationSessionCommand,
  AppConfigDataClient,
} from "@aws-sdk/client-appconfigdata";

preProcessor();

async function preProcessor() {
  const client = new AppConfigDataClient({});
  const input = {
    ApplicationIdentifier: "MyProject",
    EnvironmentIdentifier: "prod",
    ConfigurationProfileIdentifier: "cdkParams",
  };
  const startConfigurationSessionCommand = new StartConfigurationSessionCommand(
    input
  );
  const session = await client.send(startConfigurationSessionCommand);
  const getLatestConfigCommand = new GetLatestConfigurationCommand({
    ConfigurationToken: session.InitialConfigurationToken,
  });
  const response = await client.send(getLatestConfigCommand);
  const appConfigText = new TextDecoder().decode(response.Configuration);
  const appConfg = JSON.parse(appConfigText);

  const app = new cdk.App();
  new MyProjectStack(app, "MyProjectStack", appConfg.params);
}

スタックのコードでは、単順にパラメータで受け取った値を、出力しただけです。 本来は、このパラメータの値に基づいて、各種のリソースを構築することになると思います。

lib/my-project-stack.ts

import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";

export class MyProjectStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    new cdk.CfnOutput(this, "Output", {
      value: JSON.stringify(props),
    });
  }
}

4 動作確認

(1) deploy

CDK を deploy した時の状況です。Output で AppConfig の設定内容を確認することができます。

% cdk deploy

・・・略・・・

 ✅  MyProjectStack

✨  Deployment time: 13.33s

Outputs:
MyProjectStack.Output = {"enabled":true,"key1":"value1","key2":"value2","key3":"value3"}
Stack ARN:
arn:aws:cloudformation:ap-northeast-1:439028474478:stack/MyProjectStack/11393930-a8a0-11ed-a0b2-0a10070d8239

✨  Total time: 18.62s

(2) パラメータ変更

設定値を変更して AppConfig をデプロイします。

  • key1:value100
  • key2:value200
  • key3:value300

CDK を再度 deploy すると、Output が変化していることを確認できます。

 % cdk deploy

・・・略・・・

 ✅  MyProjectStack

✨  Deployment time: 13.2s

Outputs:
MyProjectStack.Output = {"enabled":true,"key1":"value100","key2":"value200","key3":"value300"}
Stack ARN:
arn:aws:cloudformation:ap-northeast-1:439028474478:stack/MyProjectStack/11393930-a8a0-11ed-a0b2-0a10070d8239

✨  Total time: 19.05s

5 最後に

今回は、AppConfig で設定したパラメータに基づいて、CDK を deploy してみました。

AppConfig は、正規表現で制約することで、比較的に安全に設定値変更を公開することが可能です。この辺の利点を CDK と組み合わせることで、少し、デプロイ方法のバリエーションも増えるのでは?と感じています。

なお、繰り返しで恐縮ですが、利用に際しては、CDK の動的変更による副作用への充分な配慮が必要なことを、念の為、付け加えさせてください。

6 参考にさせて頂いたリンク


AWS AppConfig で設定プロファイルの比較が出来るようになりました
AWS AppConfig の機能フラグがパブリックプレビューになっていたので使ってみた
【AWS AppConfig】機能フラグを作成して環境にデプロイするまでの流れを AWS CLI でやってみた
[AWS CDK] AWS Lambda-backed カスタムリソースは、もう必要ない!(場合もある)