Firebase Remote Configの設定情報の取得と更新をAPIで行う

# 概要

最近ABテストのためにRemote Configの設定を確認や更新する機会が多いが、ブラウザからでは面倒なためプログラムから行えないか調べた。

# Remote Config API

Remote ConfigはAPIが公開されているため、プログラムから設定情報の取得と更新は簡単に行えそうだ。

https://firebase.google.com/docs/remote-config/automate-rc

# サンプルコードを動かす

Node.jsのサンプルコードがあるのでこれを動かしてみる。

https://github.com/firebase/quickstart-nodejs/tree/master/config

## Firebaseプロジェクトとサービスアカウントの作成

[Firebaseコンソール](https://console.firebase.google.com/?hl=ja)からプロジェクトを新規作成した。作成後、適当なRemote Configのパラメータを作成しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43438/7b94b3fb-bbf2-0aaa-e332-aaef2dc7dba0.png)


次にサービスアカウントを作成する。サービスアカウントを自動で作成されていて、Firebaseコンソールで、[プロジェクトを設定] > [サービス アカウント]を開くと確認できる。

そこで、[新しい秘密鍵の生成] をクリックし、[キーを生成]をクリックするとキーがローカルにダウンロードされる。このキーをSDKの認証に使用する。

## 設定情報の取得

[firebase/quickstart-nodejs](https://github.com/firebase/quickstart-nodejs)をcloneし、configディレクトリに移動し`npm install`を実行する。

先ほどダウンロードしたキーを環境変数`GOOGLE_APPLICATION_CREDENTIALS`にセットする。

```zsh
$ export GOOGLE_APPLICATION_CREDENTIALS=path_to_key
```

そして、次のコマンドを実行するとRemote Configの設定情報が`config.json`に保存される。

```zsh
$ node index.js get
```

今回のサンプルプロジェクトの場合、次のようなjsonが取得できる。

```json
{
    "conditions":[],
    "parameters":{
        "sample":{
            "defaultValue":{
                "value":"test"
            }
        }
    },
    "parameterGroups":{},
    "etag":"etag-123456789-1",
    "version":{
        "versionNumber":"1",
        "updateOrigin":"CONSOLE",
        "updateType":"INCREMENTAL_UPDATE",
        "updateUser":{
            "email":"update user email"
        },
        "updateTime":"Sun, 20 Dec 2020 10:17:55 GMT"
    }
}

```

## 設定情報の更新

設定情報を取得できたので更新を行ってみる。先ほどのjsonを次のように変更する。

```json
{
    "conditions":[],
    "parameters":{
        "sample":{
            "defaultValue":{
                "value":"change from api"
            }
        }
    },
    "parameterGroups":{},
    "etag":"etag-123456789-1",
    "version":{
        "versionNumber":"1",
        "updateOrigin":"CONSOLE",
        "updateType":"INCREMENTAL_UPDATE",
        "updateUser":{
            "email":"update user email"
        },
        "updateTime":"Sun, 20 Dec 2020 10:17:55 GMT"
    }
}
```

そして、次のコマンドを実行する。

```zsh
$ node index.js publish
```

実際に確認すると次のように変更されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43438/7078c429-5e75-41ec-f741-523fed5122a9.png)

## cURLでの設定情報の取得

cURLコマンドでの設定情報の取得を試してみる。設定情報は、次のようにすることで取得できる。

```zsh
curl --compressed -D headers -H "Authorization: Bearer ACCESS TOKEN" \
-X GET https://firebaseremoteconfig.googleapis.com/v1/projects/MY-PROJECT-ID/remoteConfig \ 
-o config.json
```

ここで、ACCESS TOKENはSDKを使用して取得する。[firebase/quickstart-nodejs/confg/index.json](https://github.com/firebase/quickstart-nodejs/blob/master/config/index.js#L9)にトークンを取得するコードが含まれているので、それを使用する。また、MY-PROJECT-IDには対象となるFirebaseプロジェクトのIDを指定する。

簡単にトークンが取得できるようindex.jsonの98行目以降を次のように変更する。

```javascript
if (action && action === 'get') {
  getTemplate();
} else if (action && action === 'publish') {
  publishTemplate();
} else if (action && action === 'update') {
  getAndUpdateTemplate();
} else if (action && action === 'accesstoken') { 
  getAccessToken().then(token => {
    console.log(token);
  });
} else {
  console.log(
`
Invalid command. Please use one of the following:
node index.js get
node index.js publish
node index.js update
node index.js accesstoken
`
  );
}
```

そして次のコマンドを実行するとトークンが得られる。

```zsh
$ node index.js accesstoken
```

得られたトークンを使いcURLコマンドを実行すると設定情報を取得することができた。


# 参考

- https://firebase.google.com/docs/remote-config/automate-rc
- https://github.com/firebase/quickstart-nodejs/tree/master/config