Remote Config テンプレートとバージョニング


Remote Config テンプレートは、Firebase プロジェクト用に作成した JSON 形式のパラメータと条件のセットです。アプリが値をフェッチするクライアント テンプレートと、サーバー クライアントが値をフェッチできるサーバー テンプレートを作成できます。

このセクションでは、クライアント テンプレートについて説明します。サーバー固有のテンプレートの詳細を得るには、[サーバー テンプレート] をクリックします。

このテンプレートは Firebase コンソールを使用して変更や管理を行うことができます。このコンソールの[パラメータ] タブと [条件] タブ

Remote Config REST API と Admin SDK または Firebase CLI を使用して、クライアント テンプレートを変更および管理することもできます。

クライアント テンプレート ファイルの例を次に示します。

      {
        "conditions": [
          {
            "name": "ios",
            "expression": "device.os == 'ios'"
          }
        ],
        "parameters": {
          "welcome_message": {
            "defaultValue": {
              "value": "Welcome to this sample app"
            },
            "conditionalValues": {
              "ios": {
                "value": "Welcome to this sample iOS app"
              }
            }
          },
          "welcome_message_caps": {
            "defaultValue": {
              "value": "false"
            }
          },
          "header_text": {
            "defaultValue": {
              "useInAppDefault": true
            }
          }
        },
        "version": {
          "versionNumber": "28",
          "updateTime": "2020-05-14T18:39:38.994Z",
          "updateUser": {
            "email": "user@google.com"
          },
          "updateOrigin": "CONSOLE",
          "updateType": "INCREMENTAL_UPDATE"
        }
      }

これらのバージョン管理タスクは、Firebase コンソールで実行できます。

  • 保存されているすべてのテンプレート バージョンの一覧表示
  • 特定のバージョンの再取得
  • 特定のクライアント バージョンへのロールバック
  • [変更履歴] ページで Remote Config テンプレートを削除します

Firebase CLI と Remote Config バックエンド API を使用して、テンプレートの一覧表示、テンプレートの取得、テンプレートのロールバックを行うこともできます。

テンプレート タイプごとに、保存される生涯バージョン数の上限は 300 個(300 個のクライアント テンプレートと 300 個のサーバー テンプレート)です。これには、削除されたテンプレートの保存バージョン番号も含まれます。プロジェクトの有効期間中にテンプレート タイプごとに 300 を超えるテンプレート バージョンを公開すると、最も古いバージョンが削除され、そのタイプのバージョンは最大 300 個まで維持されます。

パラメータを更新するたびに、Remote Config はバージョニングされた新しいバージョンの Remote Config テンプレートを作成し、必要に応じて取得またはロールバックできるバージョンとして以前のテンプレートを保存します。バージョン番号は、Remote Config によって保存された初期値から順に増えていきます。例に示すとおり、すべてのテンプレートに version フィールドがあり、その特定のバージョンに関するメタデータが含まれています。

必要に応じて、Remote Config コンソールの[変更履歴]ページで Remote Config テンプレートを削除できます。

Remote Config テンプレートのバージョンを管理する

このセクションでは、Remote Config テンプレートのバージョンを管理する方法について説明します。

プログラムでテンプレートを作成、変更、保存する方法について詳しくは、プログラムで Remote Config を変更するをご覧ください。

保存されている Remote Config テンプレートのすべてのバージョンを一覧表示する

保存されているすべての Remote Config テンプレート バージョンのリストを取得できます。操作:

Firebase コンソール

[Parameters] タブで、右上に表示される時計アイコンを選択します。[変更履歴] ページが開き、保存されているすべてのテンプレート バージョンが右側のリストメニューに一覧表示されます。

保存されているバージョンごとに表示される詳細情報には、変更の発生理由(コンソール、REST API、ロールバックのいずれかによる変更、またはテンプレートの強制保存による増分変更)が含まれます。

Firebase CLI

firebase remoteconfig:versions:list

返されるバージョンの数を制限するには、--limit オプションを使用します。すべてのバージョンを取得するには 0 を渡します。

Node.js

function listAllVersions() {
  admin.remoteConfig().listVersions()
    .then((listVersionsResult) => {
      console.log("Successfully fetched the list of versions");
      listVersionsResult.versions.forEach((version) => {
        console.log('version', JSON.stringify(version));
      });
    })
    .catch((error) => {
      console.log(error);
    });
}

Java

ListVersionsPage page = FirebaseRemoteConfig.getInstance().listVersionsAsync().get();
while (page != null) {
  for (Version version : page.getValues()) {
    System.out.println("Version: " + version.getVersionNumber());
  }
  page = page.getNextPage();
}

// Iterate through all versions. This will still retrieve versions in batches.
page = FirebaseRemoteConfig.getInstance().listVersionsAsync().get();
for (Version version : page.iterateAll()) {
  System.out.println("Version: " + version.getVersionNumber());
}

REST

curl --compressed -D headers -H "Authorization: Bearer <var>token</var>" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/<var>my-project-id</var>/remoteConfig:listVersions

テンプレートのリストには、更新の時刻、更新を行ったユーザー、更新方法など、保存されているすべてのバージョンのメタデータが含まれます。バージョン要素の例はこちらです:

```json
{
  "versions": [{
    "version_number": "6",
    "update_time": "2022-05-12T02:38:54Z",
    "update_user": {
      "name": "Jane Smith",
      "email": "jane@developer.org",
      "imageUrl": "https://lh3.googleusercontent.com/a-/..."
    },
    "description": "One small change on the console",
    "origin": "CONSOLE",
    "update_type": "INCREMENTAL_UPDATE"
  }]
}
```

Remote Config テンプレートの特定のバージョンを取得する

保存されている特定のバージョンの Remote Config テンプレートを取得できます。保存されたテンプレートのバージョンを取得するには:

Firebase コンソール

デフォルトでは、[変更履歴] タブの詳細ペインに、現在アクティブなテンプレートが表示されます。一覧内の別のバージョンの詳細情報を表示するには、右のメニューからそのバージョンを選択します。

現在選択されているバージョンと保存されている別のバージョンの詳細な差分を表示するには、選択されていないバージョンのコンテキスト メニューにカーソルを合わせて、[選択したバージョンと比較] を選択します。

Firebase CLI

firebase remoteconfig:get -v VERSION_NUMBER

オプションで、-o, FILENAME で指定したファイルに出力を書き込むことができます。

Node.js

テンプレートの最新バージョンを取得するには、引数なしで getTemplate() を渡します。特定のバージョンを取得するには、getTemplateAtVersion() を使用します。

// Get template version: 6
admin.remoteConfig().getTemplateAtVersion('6')
  .then((template) => {
    console.log("Successfully fetched the template with ETag: " + template.etag);
  })
  .catch((error) => {
    console.log(error);
  });

Java

Template template = FirebaseRemoteConfig.getInstance().getTemplateAtVersionAsync(versionNumber).get();
// See the ETag of the fetched template.
System.out.println("Successfully fetched the template with ETag: " + template.getETag());

REST

curl --compressed -D headers -H "Authorization: Bearer <var>token</var>" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/<var>my-project-id</var>/remoteConfig?version_number=6

URL パラメータ ?version_numberGET オペレーションでのみ有効です。これを使用してアップデートのバージョン番号を指定することはできません。?version_number パラメータがない同様の get リクエストを使用すると、現在アクティブなテンプレートが取得されます。

Remote Config テンプレートの特定の保存済みバージョンにロールバックする

保存されている任意のバージョンのテンプレートにロールバックできます。テンプレートをロールバックするには:

Firebase コンソール

[変更履歴] ページでロールバック可能な以前のテンプレート バージョンを選択すると、そのバージョンにロールバックするためのオプション ボタンがページの右上に表示されます。そのバージョンにロールバックし、すべてのアプリとユーザーに対してすぐにその値を使用する必要がある場合のみ、このボタンをクリックして確定してください。

Firebase CLI

firebase remoteconfig:rollback -v VERSION_NUMBER

Node.js

// Roll back to template version: 6
admin.remoteConfig().rollback('6')
  .then((template) => {
    console.log("Successfully rolled back to template version 6.");
    console.log("New ETag: " + template.etag);
  })
  .catch((error) => {
    console.log('Error trying to rollback:', e);
  })

Java

try {
  Template template = FirebaseRemoteConfig.getInstance().rollbackAsync(versionNumber).get();
  System.out.println("Successfully rolled back to template version: " + versionNumber);
  System.out.println("New ETag: " + template.getETag());
} catch (ExecutionException e) {
  if (e.getCause() instanceof FirebaseRemoteConfigException) {
    FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause();
    System.out.println("Error trying to rollback template.");
    System.out.println(rcError.getMessage());
  }
}

REST

保存されている Remote Config テンプレートにロールバックするには、カスタム メソッド :rollback を使用し、適用する特定のバージョンをリクエスト本文に指定して HTTP POST を発行します。次に例を示します。

curl --compressed -D headers -H "Authorization: Bearer <var>token</var>" -H "Content-Type: application/json" -X POST https://firebaseremoteconfig.googleapis.com/v1/projects/<var>my-project-id</var>/remoteConfig:rollback -d '{"version_number": 6}'

レスポンスには、アクティブになった保存済みテンプレートの内容と、その新しいバージョンのメタデータが含まれます。

このロールバック操作を行うと、実際には新しい番号のバージョンが作成されることに注意してください。たとえば、バージョン 10 からバージョン 6 にロールバックすると、実際にはバージョン 6 の新しいコピーが作成されます。この新しいコピーは元のバージョンと同じですが、バージョン番号が 11 であるという点のみ異なります。有効期限が切れていないと仮定すると、元のバージョン 6 は保存されたままで、バージョン 11 がアクティブなテンプレートになります。

Remote Config テンプレートを削除する

Remote Config テンプレートは Firebase コンソールから削除できます。Remote Config テンプレートを削除するには:

1. Remote Config [パラメータ] ページで、 [変更履歴] をクリックします。
  1. 削除するテンプレートに切り替えて、 [その他] をクリックし、[削除] を選択します。

  2. 削除を確認するメッセージが表示されたら、[削除] をクリックします。

Remote Config テンプレートをダウンロードして公開する

Remote Config テンプレートをダウンロードして公開することにより、テンプレートをソース管理システムやビルドシステムに統合したり、構成の更新を自動化したり、複数のプロジェクト間でパラメータと値を同期したりできます。

現在アクティブな Remote Config テンプレートをプログラマティックにダウンロードできます。 その後、エクスポートされた JSON ファイルを更新して同じプロジェクトに公開したり、新規または既存のプロジェクトに公開したりすることができます。

たとえば、開発環境、テスト環境、ステージング環境、本番環境など、ソフトウェア開発ライフサイクルのさまざまな段階にある複数のプロジェクトがあるとします。この場合、十分にテストされたテンプレートをステージング環境から本番環境に昇格させるには、ステージング プロジェクトからテンプレートをダウンロードして本番環境プロジェクトに公開します。

この方法を使用して、プロジェクト間で構成を移行したり、確立されたプロジェクトのパラメータと値を新しいプロジェクトに入力したりすることもできます。

A/B Testing テストでバリアントとして作成されたパラメータとパラメータ値は、エクスポートされるテンプレートには含まれません。

Remote Config テンプレートをエクスポートしてインポートするには:

  1. 現在の Remote Config 構成テンプレートをダウンロードします。
  2. Remote Config テンプレートを検証します
  3. Remote Config テンプレートを公開します

現在の Remote Config テンプレートをダウンロードする

アクティブな Remote Config テンプレートを JSON 形式でダウンロードするには、次を使用します。

Firebase コンソール

  1. Remote Config Parameters or Conditions タブで メニューを開き、[Download current config file] を選択します。
  2. メッセージが表示されたら [構成ファイルのダウンロード] をクリックし、ファイルの保存場所を選択して [保存] をクリックします。

Firebase CLI

firebase remoteconfig:get -o filename

Node.js

function getTemplate() {
  var config = admin.remoteConfig();
  config.getTemplate()
      .then(function (template) {
        console.log('ETag from server: ' + template.etag);
        var templateStr = JSON.stringify(template);
        fs.writeFileSync('config.json', templateStr);
      })
      .catch(function (err) {
        console.error('Unable to get template');
        console.error(err);
      });
}

Java

Template template = FirebaseRemoteConfig.getInstance().getTemplateAsync().get();
// See the ETag of the fetched template.
System.out.println("ETag from server: " + template.getETag());

REST

curl --compressed -D headers -H "Authorization: Bearer token" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig -o filename

このコマンドは、JSON ペイロードを 1 つのファイルに出力し、ヘッダー(ETag を含む)を別の headers ファイルに出力します。

Remote Config テンプレートを検証する

更新したテンプレートを公開する前に、Firebase Admin SDK または REST API を使用して検証できます。Firebase CLI または Firebase コンソールで公開操作を行う際にも、テンプレートが検証されます。

このテンプレート検証プロセスでは、パラメータや条件で重複しているキー、無効な条件名、存在しない条件、ETag の形式の誤りなどのエラーがチェックされます。たとえば、リクエストに最大許容数(2,000 個)を超えるキーが含まれる場合は、エラー メッセージ Param count too large が返されます。

Node.js

function validateTemplate(template) {
  admin.remoteConfig().validateTemplate(template)
      .then(function (validatedTemplate) {
        // The template is valid and safe to use.
        console.log('Template was valid and safe to use');
      })
      .catch(function (err) {
        console.error('Template is invalid and cannot be published');
        console.error(err);
      });
}

Java

try {
  Template validatedTemplate = FirebaseRemoteConfig.getInstance()
          .validateTemplateAsync(template).get();
  System.out.println("Template was valid and safe to use");
} catch (ExecutionException e) {
  if (e.getCause() instanceof FirebaseRemoteConfigException) {
    FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause();
    System.out.println("Template is invalid and cannot be published");
    System.out.println(rcError.getMessage());
  }
}

REST

テンプレートの更新を検証するには、公開リクエストの末尾に URL パラメータ ?validate_only=true を追加します。

curl --compressed -H "Content-Type: application/json; UTF8" -H "If-Match: last-returned-etag" -H "Authorization: Bearer token" -X PUT https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig?validate_only=true -d @filename

テンプレートが正常に検証されると、curl コマンドは送信された JSON テンプレートを返します。保存された headers ファイルには、HTTP/2 ステータス 200 と、接尾辞が -0 の更新された ETag が含まれます。テンプレートの検証に合格しなかった場合は、JSON レスポンスで検証エラーを受信します。headers ファイルには 200 以外のレスポンスが含まれます(ETag は含まれません)。

Remote Config テンプレートを公開する

テンプレートをダウンロードして JSON コンテンツに対して必要な変更を加え、検証した後、そのテンプレートをプロジェクトに公開できます。

テンプレートを公開すると、既存の構成テンプレート全体が更新後のファイルに置き換えられ、テンプレートのバージョンが 1 つ増えます。構成全体が置き換えられるため、JSON ファイルからパラメータを削除してからテンプレートを公開すると、パラメータはサーバーから削除され、クライアントはそのパラメータを使用できなくなります。

公開すると、パラメータと値の変更内容はアプリとユーザーに即座に適用されます。必要に応じて、前のバージョンにロールバックできます。

テンプレートを公開するには、次のコマンドを使用します。

Firebase コンソール

  1. Remote Config パラメータまたは条件タブで メニューを開き、[ファイルから公開] を選択します。
  2. プロンプトが表示されたら [参照] をクリックし、公開する Remote Config ファイルを選択して [選択] をクリックします。
  3. ファイルが検証されます。検証が正常に完了した場合は、[公開] をクリックして構成をアプリとユーザーに即座に適用できます。

Node.js

function publishTemplate() {
  var config = admin.remoteConfig();
  var template = config.createTemplateFromJSON(
      fs.readFileSync('config.json', 'UTF8'));
  config.publishTemplate(template)
      .then(function (updatedTemplate) {
        console.log('Template has been published');
        console.log('ETag from server: ' + updatedTemplate.etag);
      })
      .catch(function (err) {
        console.error('Unable to publish template.');
        console.error(err);
      });
}

Java

try {
  Template publishedTemplate = FirebaseRemoteConfig.getInstance()
          .publishTemplateAsync(template).get();
  System.out.println("Template has been published");
  // See the ETag of the published template.
  System.out.println("ETag from server: " + publishedTemplate.getETag());
} catch (ExecutionException e) {
  if (e.getCause() instanceof FirebaseRemoteConfigException) {
    FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause();
    System.out.println("Unable to publish template.");
    System.out.println(rcError.getMessage());
  }
}

REST

curl --compressed -H "Content-Type: application/json; UTF8" -H "If-Match: last-returned-etag" -H "Authorization: Bearer token" -X PUT https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig -d @filename

この curl コマンドでは、コンテンツを指定するために「@」文字を使用し、その後にファイル名を続けます。

ダウンロードされるテンプレートには Remote Config のパーソナライズと条件が含まれています。そのため、別のプロジェクトに公開する場合は、次の制限事項に注意する必要があります。

  • あるプロジェクトから別のプロジェクトにパーソナライズをインポートすることはできません。

    たとえば、あるプロジェクトでパーソナライズを有効にしていて、テンプレートをダウンロードして編集した場合、そのテンプレートを同じプロジェクトに公開することは可能ですが、テンプレートからパーソナライズを削除しない限り別のプロジェクトに公開することはできません。

  • 条件はプロジェクト間でインポートできますが、公開する前に、特定の条件値(アプリ ID やオーディエンスなど)がターゲット プロジェクトに存在している必要があります。

    たとえば、Remote Config パラメータでプラットフォーム値 iOS を指定する条件を使用する場合、プラットフォーム値はどのプロジェクトでも同じであるため、テンプレートを別のプロジェクトに公開できます。一方で、ターゲット プロジェクトに存在しない特定のアプリ ID やユーザー オーディエンスに依存する条件が含まれている場合は、検証に失敗します。

  • 公開するテンプレートに Google Analytics に依存する条件が含まれている場合は、ターゲット プロジェクトで Analytics を有効にする必要があります。

Remote Config テンプレートのデフォルトをダウンロードする

アプリが常にインターネットに接続しているとは限らないため、すべての Remote Config パラメータに対してクライアントサイド アプリのデフォルト値を構成する必要があります。また、アプリのクライアントのデフォルト値と Remote Config バックエンドのデフォルトのパラメータ値は、時間の経過とともに変化する可能性があるため、定期的に同期する必要があります。

このセクションの最後にあるプラットフォーム別のリンクで説明しているように、これらのデフォルト値をアプリ内で手動で設定できます。または、このプロセスを効率化するために、アクティブな Remote Config テンプレート内のすべてのパラメータとそれらのデフォルト値に関する Key-Value ペアのみを含むファイルをダウンロードすることもできます。後者の場合、このファイルをプロジェクトに組み込み、それらの値をインポートするようにアプリを構成できます。

これらのファイルは、Android アプリの場合は XML 形式、iOS アプリの場合はプロパティ リスト(plist)形式、ウェブアプリの場合は JSON 形式でダウンロードできます。

アプリと Remote Config バックエンドが常に同期されるように、新しいアプリのリリース前には Remote Config のデフォルトを定期的にダウンロードすることをおすすめします。

テンプレートのデフォルトを含むファイルをダウンロードするには:

REST

curl --compressed -D headers -H "Authorization: Bearer token -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig:downloadDefaults?format=file_format'

ダウンロードするファイル形式に応じて、format 値として XMLPLIST、または JSON を使用します。

Firebase コンソール

  1. [Parameters] タブで メニューを開き、[デフォルト値をダウンロード] を選択します。
  2. メッセージが表示されたら、ダウンロードするファイル形式に対応するラジオボタンをクリックし、[ファイルをダウンロード] をクリックします。

Remote Config のデフォルト値をアプリにインポートする方法については、以下をご覧ください。