2024-09-01 v0.2.0で破壊的な変更をリリースしたので本エントリのコードも合わせて修正しました
OpenFeatureとは
OpenFeatureをご存知ですか?OpenFeatureは特定のベンダーに依存しないフィーチャーフラグの標準APIを定めるプロジェクトです。CNCF仲間のOpenTelemetryと同じような取り組みのフィーチャーフラグ版と捉えてもらうと良いのではないかと思います。フィーチャーフラグの標準APIがあるとどう嬉しいのかについては他のエントリでも紹介されていますのでぜひ探して読んでみてください。
AWSでフィーチャーフラグといえばAppConfig
さて、OpenFeatureが定めるのは単なるクライアントインタフェースなので、バックエンドが必要です。AWSを利用している身としてはフィーチャーフラグを自前で作ったり外部のSaaSに頼るよりまず、AWS AppConfigというサービスを選択肢として挙げたいです。
AppConfigを用いることで、デプロイと機能リリースのタイミングを分離することができます。なんらかの機能をリリースするために環境変数を変えてECSにコンテナをデプロイした経験はありませんか?これがECS側でノーデプロイで機能リリース・差し戻しができるようになるということです。
2024年7月にはマルチバリアントフラグといって、ユーザ名などのコンテクストを条件にフラグや属性の値を変える仕組みがリリースされたばかりです。
そんな今ホットなサービスのAppConfigですが、探してもAWS AppConfig 機能フラグ向けのOpenFeature Go Providerが見つかりませんでした。このままではOpenFeatureのバックエンドとしてAppConfigを選択することができません。
なければ作ればいいじゃない、ということで作りました。
使い方
以下のようにして、AppConfig Providerを実体化しOpenFeature SDKのSetProvider関数に渡します。
import ( "github.com/Arthur1/openfeature-provider-go-aws-appconfig/appconfig" "github.com/open-feature/go-sdk/openfeature" ) openfeature.SetProvider(appconfigprovider.NewProvider("AppConfigのアプリケーション名", "同環境名", " 同設定プロファイル名"))
あとは、OpenFeatureのBoolean Evaluation関数を呼ぶと、AppConfigエージェント経由で指定した機能フラグを評価して結果を取得することができます。
client := openfeature.NewClient("app") evalCtx := openfeature.NewTargetlessEvaluationContext( map[string]any{"userId": "userA"}, ) flagRes, err := client.BooleanValueDetails(ctx, "feature1", false, evalCtx)
現状AppConfig機能フラグではフラグの値にBooleanしか使えないため、OpenFeatureとしてBoolean以外に定義されているようなフラグ型の評価はできません。
詳しい使用方法や、AppConfigの概念とOpenFeatureの概念の対応づけについてはリポジトリのREADME.mdをご覧ください。
動作確認のため、リポジトリ内にデモを用意しています。
ここに含まれるterraformをapplyすることで、AppConfig機能フラグのリソース群や、AppConfigエージェントをレイヤーに持つLambda関数などが作られます。
Lambdaのコードはこのようになっており、今回私が開発したAppConfig機能フラグ向けのOpenFeature Providerを用いて、フィーチャーフラグの値を評価しログに書くという手続きが記述されています。
このLambda関数を実行すると、以下のようにログが出力され、このProviderがAppConfigエージェントを介して適切にフィーチャーフラグを取得できていることがわかります。
まとめ
プロダクト志向を掲げるエンジニアとして素早いデリバリーのためにフィーチャーフラグはなくてはならない仕掛けだと感じています。
OpenFeatureはまだまだ発展途中のプロジェクトですが、今回作ったフィーチャーフラグバックエンドにAWS AppConfigを使うProviderによって手軽に利用できるようになったと思うのでぜひ活用してみてください。盛り上がるときっとAWS公式でもライブラリを(Go言語に限らず)提供してくれることでしょう。
OpenFeature側でオーナー持ってもらっても良いかなと思い、openfeature/go-sdk-contribにissueは建ててみました。