Firebase Remote Config の一部の値を Node.js と Firebase CLI を使って更新する
プログラムで実行することになった経緯
Firebase コンソール上で手作業で更新する運用していたところ、開発環境で更新すべきところを誤って本番環境の値を更新するというオペレーションミスが発生した。
2度と繰り返さないよう、更新プログラムを実行する前にレビューを通すことでリスクを軽減する。
こちらの記事では、jsonファイルをアップロードし全ての設定値を更新する方法が紹介されている。
本記事では、特定の値のみ更新するプログラムを運用する方法を紹介する。
Firebase コンソールで手動で値を追加
Firebase コンソール上でRemote Configのパラメータを追加する。
プラットフォーム別に条件を設定する。
Firebase CLIのセットアップ
インストール
% npm install -g firebase-tools
Firebase CLIにログイン
Firebase CLIで使用するGoogleアカウントにログインする。
次にプロジェクト一覧を出力しFirebaseコンソールと同期できていることを確認する。
% firebase login
% firebase projects:list
カレントプロジェクトを指定
プロジェクトを切り替える。
% firebase use numa-sample-project-dev
Remote ConfigをJson形式で取得
Firebase CLIを使ってRemote Configの最新の状態をフェッチし、確認する。
% firebase remoteconfig:get --output remote_config_values.json
以下フェッチしたjson。コンソールで追加したkey-valueが含まれている。
{
"conditions": [
{
"name": "ios",
"expression": "device.os == 'ios'",
"tagColor": "BLUE"
},
{
"name": "android",
"expression": "device.os == 'android'",
"tagColor": "GREEN"
}
],
"parameters": {
"hoge_flag": {
"defaultValue": {
"value": "false"
},
"conditionalValues": {
"ios": {
"value": "false"
},
"android": {
"value": "false"
}
},
"valueType": "BOOLEAN"
}
}
}
設定値を変更する
Admin SDKのセットアップ
まず、Firebase Admin SDKをインストールして初期化する必要がある。firebase-adminパッケージをインストールするには、以下のコマンドを実行する。
% npm install firebase-admin
GoやPythonもサポートしているらしい。
Firebase コンソールからサービスアカウントキーを取得
Firebase Admin SDK を使用できるようになるには
Firebase コンソールからサービスアカウントキーを取得し、
プログラムで指定する必要がある。
値を更新するプログラム
update_remote_config.jsを作成し、Node.jsのコードでhoge_flagを更新するプログラムを書く。
const admin = require('firebase-admin');
// 初期化時にサービスアカウントキーのパスを指定
const serviceAccount = require('./firebase-adminsdk.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
const remoteConfig = admin.remoteConfig();
// Remote Config の Boolean 型の値を条件ごとに更新する関数
async function updateRemoteConfig(key, iosValue, androidValue) {
// 現在のRemote Configの値を取得
const template = await remoteConfig.getTemplate();
// 値を更新
if (!template.parameters[key]) {
template.parameters[key] = {};
}
// iOS と Android の条件を作成
const iosCondition = {
name: "ios",
expression: "device.os == 'ios'",
tagColor: "BLUE",
};
const androidCondition = {
name: "android",
expression: "device.os == 'android'",
tagColor: "GREEN",
};
// 条件をテンプレートに追加
template.conditions = [iosCondition, androidCondition];
// 条件ごとの値を設定
template.parameters[key].conditionalValues = {
ios: { value: JSON.stringify(iosValue) },
android: { value: JSON.stringify(androidValue) },
};
// Remote Configを更新(更新されたテンプレートを適用)
await remoteConfig.publishTemplate(template);
console.log('Remote Config updated successfully');
}
updateRemoteConfig("hoge_flag", true, true).catch((error) => {
console.error('Error updating Remote Config:', error);
});
プログラム実行
% node update_remote_config.js
無事更新できた 🎉
このプログラムをgitでリポジトリにプッシュしてリスクを減らす運用をしていきたい。
補足
Firebase CLIで更新までできるつもりでいたが2023/4現在はFirebase CLIだけでは更新できないようだった。
Discussion