AWS Step FunctionsでAWS AppConfigから機能フラグを取得してみた(AWS CDK)

2022.09.14

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

こんにちは、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
      ),
    });
  }
}

上記を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
  }

参考

以上