こんにちは、CX事業本部 IoT事業部の若槻です。
前回のエントリではAWS CDKでAppConfigの機能フラグを作成してみました。
今回は、AWS Step FunctionsでAWS AppConfigから機能フラグを取得する構成をAWS CDKで作成してみました。
やってみた
実装
AWS CDK v2(TypeScript)で次のようなCDKスタックを作成しました。
lib/aws-cdk-app-stack.ts
import {
aws_appconfig,
aws_stepfunctions,
aws_stepfunctions_tasks,
Stack,
StackProps,
} from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class AwsCdkAppStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
// AppConfig Application
const testApp = new aws_appconfig.CfnApplication(this, 'testApp', {
name: 'testApp',
});
// AppConfig Environment
const testEnvironment = new aws_appconfig.CfnEnvironment(
this,
'testEnvironment',
{
applicationId: testApp.ref,
name: 'testEnvironment',
}
);
// AppConfig ConfigurationProfile
const testConfigureProfile = new aws_appconfig.CfnConfigurationProfile(
this,
'testConfigureProfile',
{
name: 'testConfigureProfile',
applicationId: testApp.ref,
locationUri: 'hosted',
type: 'AWS.AppConfig.FeatureFlags',
}
);
// AppConfig DeploymentStrategy
new aws_appconfig.CfnDeploymentStrategy(this, 'testDeploymentStrategy', {
name: 'testDeploymentStrategy',
deploymentDurationInMinutes: 0,
growthFactor: 100,
replicateTo: 'NONE',
finalBakeTimeInMinutes: 0,
});
// ConfigurationSessionを開始するタスク
const startConfigurationSessionTask =
new aws_stepfunctions_tasks.CallAwsService(
this,
'startConfigurationSessionTask',
{
service: 'appconfigdata',
action: 'startConfigurationSession',
parameters: {
ApplicationIdentifier: testApp.name,
ConfigurationProfileIdentifier: testConfigureProfile.name,
EnvironmentIdentifier: testEnvironment.name,
},
iamResources: [
`arn:${this.partition}:appconfig:${this.region}:${this.account}:application/${testApp.ref}/environment/${testEnvironment.ref}/configuration/${testConfigureProfile.ref}`,
`arn:${this.partition}:appconfig:${this.region}:${this.account}:application/${testApp.ref}/configurationprofile/${testConfigureProfile.ref}`,
],
iamAction: 'appconfig:*',
}
);
// 最新のConfigurationを取得するタスク
const getLatestConfigurationTask =
new aws_stepfunctions_tasks.CallAwsService(
this,
'getLatestConfigurationTask',
{
service: 'appconfigdata',
action: 'getLatestConfiguration',
parameters: {
ConfigurationToken: aws_stepfunctions.JsonPath.stringAt(
'$.InitialConfigurationToken'
),
},
iamResources: [
`arn:${this.partition}:appconfig:${this.region}:${this.account}:application/${testApp.ref}/configurationprofile/${testConfigureProfile.ref}`,
],
iamAction: 'appconfigdata:GetLatestConfiguration',
}
);
// ステートマシン
new aws_stepfunctions.StateMachine(this, 'myStateMachine', {
stateMachineName: 'myStateMachine',
definition: startConfigurationSessionTask.next(
getLatestConfigurationTask
),
});
}
}
- AppConfigのリソースとしてApplication、Environment、ConfigurationProfile、DeploymentStrategyを作成しています。
- AppConfigの利用でDeploymentStrategyの作成は必須ではありませんが、
deploymentDurationInMinutes
およびfinalBakeTimeInMinutes
を短くしたDeploymentStrategyを利用することによりデプロイを即反映させることができます。(既定はそれぞれ10分) - 参考:【AWS AppConfig】デプロイ戦略を自作してデプロイ直後の再デプロイをすぐさま可能とする方法を試してみた | DevelopersIO
- AppConfigの利用でDeploymentStrategyの作成は必須ではありませんが、
- AppConfigでの機能フラグの取得は、StartConfigurationSessionで取得したトークンを使って、GetLatestConfigurationを実行することにより行えます。よってそれぞれのAPIを実行するStateMachine Taskを設けています。
上記をCDK Deployしてスタックをデプロイします。これにより次の定義のState Machineが作成されます。
Definition
{
"StartAt": "startConfigurationSessionTask",
"States": {
"startConfigurationSessionTask": {
"Next": "getLatestConfigurationTask",
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:appconfigdata:startConfigurationSession",
"Parameters": {
"ApplicationIdentifier": "testApp",
"ConfigurationProfileIdentifier": "testConfigureProfile",
"EnvironmentIdentifier": "testEnvironment"
}
},
"getLatestConfigurationTask": {
"End": true,
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:appconfigdata:getLatestConfiguration",
"Parameters": {
"ConfigurationToken.$": "$.InitialConfigurationToken"
}
}
}
}
動作確認
まずAppConfigコンソールにアクセスし、CDKで作成されたAppConfigのアプリケーション内のConfiguration Profileに機能フラグを作成します。
機能フラグの作成画面です。ここで内容となる属性を指定します。また右上のスイッチをOn
にして機能フラグを有効にし、APIで取得可能とします。
新規バージョンとして保存し、バージョンのデプロイを行います。
このときDeployment strategyにはCDKで作成したものを指定し、デプロイ時間を短縮できるようにします。デプロイを開始します。
すると即時でデプロイが完了しました。
State Machineを実行すると、getLatestConfigurationTask
の結果で機能フラグの属性が取得できています!
{
"Configuration": {
"testFlag": {
"enabled": true,
"key1": "hoge",
"key2": 123,
"key3": true
}
},
"ContentType": "application/json",
"NextPollConfigurationToken": "AYADeMkmJnBwUdg...",
"NextPollIntervalInSeconds": 60
}
機能フラグが無効の場合
ちなみに機能フラグが無効のバージョンが最新としてデプロイされている場合。
この場合はgetLatestConfiguration
でフラグの属性が取得できなくなるので注意してください。
{
"Configuration": {
"testFlag": {
"enabled": false
}
},
"ContentType": "application/json",
"NextPollConfigurationToken": "AYADeKmvLJvZvXz...",
"NextPollIntervalInSeconds": 60
}
参考
- Resource types defined by AWS AppConfig - Actions, resources, and condition keys for AWS AppConfig - Service Authorization Reference
- 【AWS AppConfig】機能フラグで定義した属性が GetLatestConfiguration で取得できなかった場合に確認すること | DevelopersIO
以上