この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
CX事業本部、MAD事業部の小倉@大阪オフィスです。
本日、Amazon CloudWatch Evidentlyなる機能がリリースされました。
フィーチャーフラグの管理やA/Bテストの実行を支援する機能になっています。東京リージョンも対応しています。
やってみた
今回はCognitoを使ってログイン処理を行ったユーザに対して、フィーチャーフラグコントロールをやってみることにしました。
Evidently Projectの作成
サイドメニューから「Evidently」を選択し、以下の画面から「Create project」ボタンを押してProjectを作成します。
Project名と説明を入力しました。
「Evalution event storage」の設定を行うと、イベントをS3又はCloudWatch Logsに保存できるようです。私はS3を選択し、バケットの指定を行いました。
Projectが作成されました。
Featureの作成
Projectページの上にある「Add Feature」ボタンを押して、Featureを作成します。
Feature variationsの欄で、機能フラグ、A/Bテストにおいて、AWS側からコントロールしたい値を設定します。
今回は、Reactアプリ上の表示/非表示をAWS側からコントロールしようと思い、以下の様に設定しました。
- Variation type : Boolean
- Variation name
- Variation1 => False
- Variation2 => True
この値をAWSから取得するとき、True or Falseが返されるようになるイメージです。
Reactアプリの準備
一旦ここでお題となるReactアプリを準備します。下準備として、以下の簡単なアプリを用意しました。
create-react-app
でReactアプリケーションを作成amplify auth
を使ってCognitoでユーザ認証可能にする
準備ができたら、amplify publish
してAWSリソースを作成しておきます。
IAMポリシーの準備
作成されたAWSリソースの内、CognitoのAuthRole(認証されたユーザ用のRole)に以下のポリシーを追加します。
- AmazonCloudWatchEvidentlyFullAccess
- ResourceGroupsandTagEditorReadOnlyAccess
また、イベント情報をS3/CloudWatch Logsに保存する場合、以下もあわせて追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketPolicy",
"s3:PutBucketPolicy",
"s3:GetObject",
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogDelivery",
"logs:DeleteLogDelivery",
"logs:DescribeResourcePolicies",
"logs:PutResourcePolicy"
],
"Resource": [
"*"
]
}
]
}
https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Evidently-permissions.html
Reactアプリの編集
AWS側で管理する値を取得、参照するように、以下のコードを作成しました。フラグによって、「Learn React」部分の表示/非表示を切り替えます。
尚、aws-sdk-jsは今朝(2021/11/30)リリースされたv2.10.39.0
でAmazon CloudWatch Evidentlyに対応しています。
import logo from './logo.svg';
import './App.css';
import Amplify from "aws-amplify";
import awsExports from "./aws-exports";
import {withAuthenticator} from '@aws-amplify/ui-react'
import Evidently from "aws-sdk/clients/evidently";
import {Auth} from "@aws-amplify/auth";
import {useEffect, useState} from "react";
Amplify.configure(awsExports);
async function getEvaluateFeature(){
const credentials = await Auth.currentCredentials();
const userinfo = await Auth.currentUserInfo();
console.log(userinfo)
// Initialize the Amazon CloudWatch Evidently client
const evidently = new Evidently({
endpoint: 'https://evidently.ap-northeast-1.amazonaws.com',
credentials: credentials,
region: 'ap-northeast-1'
});
// API request structure
const evaluateFeatureRequest = {
// entityId for calling evaluate feature API
entityId: userinfo.username,
// Name of your feature
feature: 'example-feature-1',
// Name of your project
project: "Evidently-Test-Project",
};
return evidently.evaluateFeature(evaluateFeatureRequest).promise();
}
function App() {
const [variation, setVariation] = useState();
useEffect(() => {
(async() =>{
const res = await getEvaluateFeature();
console.log(res)
console.log(res.value)
setVariation(res.value.boolValue)
})()
},[])
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
{ variation &&
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
}
</header>
</div>
);
}
export default withAuthenticator(App)
- 認証されたユーザのクレデンシャル、ユーザ情報を取得
- Amazon CloudWatch Evidentlyのクライアントを初期化
- entityId,feature名、project名を指定してフラグ値取得リクエスト
entityId
は、ユーザをセグメント化する文字列を指定します。今回はCognitoのユーザ名にしました。
この状態でアプリを起動してみると、フラグの値はFeature画面でデフォルトに指定したFalse
が常に返ってくるようになっています。
Launchの設定
フラグ管理したい機能をローンチします。Projectページの上にある「Create launch」から設定します。
Feature nameの欄で、事前に作成したexample-feature-1を指定します。
Launch configurationでは、「Start launch now」で直ちに設定が反映されるようにします。
(Schedule launchを選択すると、日時指定での設定が可能です)
先ず、必ずFalse
の値が返る様に、Variation1を100%に設定してみます。
アプリにアクセスすると、取得したフラグの値がFalse
であり、「Learn React」が非表示になっています。
次に、必ずTrue
となるよう、Variation2を100%に変更してみます。
今度はTrue
が取得出来、「Learn React」が表示されるようになりました。
今度はTrue
,False
の割合をそれぞれ50%にしてみます。
ソース上でentityId
にCognitoのユーザ名を指定しているので、ログインしたユーザが異なれば取得できる結果が変わってきます。
アプリにアクセスしてみます。
ユーザ:cm-ogura でアクセスしたときはTrue
が取得できています。
一方、ユーザ:cm-ogura-2でアクセスしたときはFalse
が取得できています。
その他の機能
上記以外にも、
- Variationの割当状況のグラフ表示
- A/Bテスト向けのメトリクス収集
- Variationのオーバーライド指定
- 特定のユーザがアクセスした場合、必ず
True
を返す等が可能
- 特定のユーザがアクセスした場合、必ず
などの機能があるようです。興味があるかたは、是非ドキュメント を見てみてください。
まとめ
Reactアプリを使って簡単に動作を検証してみました。
フィーチャーフラグの様な、ビジネスに直接は関係ないが、運用上必要になる機能がAWSマネージドで提供されるのは嬉しい方も多いのではないでしょうか。今後のアップデートにも期待したいですね。