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 カスタムリソースは、もう必要ない!(場合もある)