DEV Community

Cover image for Exploring Feature Flag use AWS AppConfig
8 2

Exploring Feature Flag use AWS AppConfig

Hello Everyone!

This week, I learned about AWS AppConfig, especially for Feature Flag. I need feature flags for my applications since I use Trunk Based Development. Let's move on.

Setup AWS AppConfig

You may setup your AWS AppConfig use this official guide. You need to follow the 6 steps from the guide:

  1. Create an AWS AppConfig application
  2. Create an environment
  3. Create configuration profiles and feature flags
  4. Create a deployment strategy
  5. Deploying a configuration
  6. Retrieving the configuration

In this article, I will focus on step 6 and the code.

Retrieve the Feature Flag from AWS AppConfig

Before you retrieve the Feature Flag, you will need AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY with appropriate access. I have created a "small library" to call the feature flag and use AWS SDK for Javascript.

import {
  AppConfigDataClient,
  BadRequestException,
  GetLatestConfigurationCommand,
  StartConfigurationSessionCommand,
} from "@aws-sdk/client-appconfigdata";

const client = new AppConfigDataClient({});
let existingToken: string;

const getToken = async (): Promise<string> => {
  const getSession = new StartConfigurationSessionCommand({
    ApplicationIdentifier: process.env.APP_CONFIG_APP_IDENTIFIER,
    ConfigurationProfileIdentifier:
      process.env.APP_CONFIG_CONFIG_PROFILE_IDENTIFIER,
    EnvironmentIdentifier: process.env.APP_CONFIG_ENVIRONMENT_IDENTIFIER,
  });
  const sessionToken = await client.send(getSession);
  return sessionToken.InitialConfigurationToken || "";
};

const featureFlag = async (flag: string): Promise<boolean> => {
  if (!existingToken) {
    existingToken = await getToken();
    console.log(existingToken);
  }
  try {
    const command = new GetLatestConfigurationCommand({
      ConfigurationToken: existingToken,
    });
    const response = await client.send(command);
    let flags: any = {};
    if (response.Configuration) {
      let str = "";
      for (let i = 0; i < response.Configuration.length; i++) {
        str += String.fromCharCode(response.Configuration[i]);
      }
      const allFlag = JSON.parse(str);
      console.log(allFlag);
      flags = Object.assign({}, allFlag);
    }
    return Boolean(flags[flag]?.enabled);
  } catch (err) {
    if (err instanceof BadRequestException) {
      existingToken = await getToken();
      console.log(existingToken);
      // recall
      return featureFlag(flag);
    } else {
      throw err;
    }
  }
};

export default featureFlag;
Enter fullscreen mode Exit fullscreen mode

Code Explanation: For getting my feature flag, I need to call GetLatestConfiguration API. Before I call that API, I need to get my configuration session token (use getToken). If you want to check my code. I've published the code in Github and the library to NPM.

GitHub logo berviantoleo / feature-flag

Explore Feature Flag using AWS AppConfig

feature-flag

Explore Feature Flag using AWS AppConfig

Environment Variables

AWS_REGION="ap-southeast-1"
AWS_ACCESS_KEY_ID=""
AWS_SECRET_ACCESS_KEY=""
APP_CONFIG_APP_IDENTIFIER=""
APP_CONFIG_CONFIG_PROFILE_IDENTIFIER=""
APP_CONFIG_ENVIRONMENT_IDENTIFIER=""
Enter fullscreen mode Exit fullscreen mode

How to try?

  1. Setup Environment
  2. Modify demo/index.ts with your flag.
  3. Run npm install or yarn
  4. Run yarn dev or npm run dev

LICENSE

MIT

MIT License
Copyright (c) 2022 Bervianto Leo Pratama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of
Enter fullscreen mode Exit fullscreen mode

Note: Please don't use this for production. This library is still in heavy development and experimental. I want to improve this library before becoming production-ready.

How to call my library?

  • Promise then/catch
import featureFlag from '@berviantoleo/feature-flag';

featureFlag('try_feature_flag').then((result) => {
  console.log(result);
});
Enter fullscreen mode Exit fullscreen mode

You may use async/await approach too.

  • Example output

Example output

Welcome to contribute to my small library/project. :) If you have any inputs, feel free to add them here too.

What's Next?

I'm going to create a similar library/project for .NET. So stay tuned!

GIF Try

Thank you

Thank you

Source from unsplash

Image of Timescale

Timescale – the developer's data platform for modern apps, built on PostgreSQL

Timescale Cloud is PostgreSQL optimized for speed, scale, and performance. Over 3 million IoT, AI, crypto, and dev tool apps are powered by Timescale. Try it free today! No credit card required.

Try free

Top comments (0)

Create a simple OTP system with AWS Serverless cover image

Create a simple OTP system with AWS Serverless

Implement a One Time Password (OTP) system with AWS Serverless services including Lambda, API Gateway, DynamoDB, Simple Email Service (SES), and Amplify Web Hosting using VueJS for the frontend.

Read full post

👋 Kindness is contagious

Explore a sea of insights with this enlightening post, highly esteemed within the nurturing DEV Community. Coders of all stripes are invited to participate and contribute to our shared knowledge.

Expressing gratitude with a simple "thank you" can make a big impact. Leave your thanks in the comments!

On DEV, exchanging ideas smooths our way and strengthens our community bonds. Found this useful? A quick note of thanks to the author can mean a lot.

Okay