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

Remote Config テンプレートは、Firebase プロジェクト用にユーザーが作成する、JSON 形式のパラメータと条件のサーバーサイド セットです。このテンプレートは Firebase コンソールを使用して変更や管理を行うことができます。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"
    }
  }

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

Firebase コンソール、Firebase CLI、または Remote Config バックエンド API を使用すれば、次のバージョン管理タスクを行うことができます。

  • 保存されているすべてのテンプレート バージョンの一覧表示
  • 特定のバージョンの再取得
  • 特定のバージョンへのロールバック

必要に応じて、Remote Config コンソールの [変更履歴] ページで Remote Config テンプレートを削除できます。有効期間内に保存されるバージョン数の上限は、合計 300 です。これには、削除されたテンプレートに対して保存されているバージョン数が含まれます。プロジェクトの有効期間内に 300 を超えるテンプレート バージョンを公開すると、最も古いバージョンが削除され、バージョン数の上限が 300 に維持されます。

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

このセクションでは、Remote Config テンプレートのバージョンを管理する方法について説明します。プログラムでテンプレートを作成、変更、保存する方法について詳しくは、プログラムで Remote Config を変更するをご覧ください。

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

保存されているすべての Remote Config テンプレート バージョンの一覧を取得できます。次に例を示します。

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

Firebase コンソール

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

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

Firebase CLI

firebase remoteconfig:versions:list

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

テンプレートのリストには、保存されているすべてのバージョンのメタデータが含まれます。メタデータには、アップデートの時刻、作成したユーザー、コンソールと REST API のどちらを使用して作成されたかなどが含まれます。バージョン要素の例を次に示します。

{
  "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 テンプレートを取得できます。次に例を示します。

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 リクエストを使用すると、現在アクティブなテンプレートが取得されます。

Firebase コンソール

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

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

Firebase CLI

firebase remoteconfig:get -v VERSION_NUMBER

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

保存されている特定の Remote Config テンプレート バージョンにロールバックする

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

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}'

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

Firebase コンソール

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

Firebase CLI

firebase remoteconfig:rollback -v VERSION_NUMBER

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

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

Remote Config テンプレートは Firebase コンソールで削除できます。Remote Config テンプレートを削除する手順は次のとおりです。

  1. Remote Config の [パラメータ] ページで、 [変更履歴] をクリックします。

  2. 削除するテンプレートに切り替えて、 [その他] をクリックし、[削除] を選択します。

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

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

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

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

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

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

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

Remote Config テンプレートのエクスポートとインポートを行うには:

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

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

現在アクティブな Remote Config テンプレートをプログラマティックにダウンロードできます。または Firebase コンソールを使用してダウンロードすることもできます。

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

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 ファイルに出力します。

Firebase コンソール

  1. Remote Config のパラメータタブまたは条件タブメニューを開き、[現在の構成ファイルをダウンロード] を選択します。
  2. メッセージが表示されたら [構成ファイルのダウンロード] をクリックし、ファイルの保存場所を選択して [保存] をクリックします。

Firebase CLI

firebase remoteconfig:get -o filename

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 ファイルからパラメータを削除してからテンプレートを公開すると、パラメータはサーバーから削除され、クライアントはそのパラメータを使用できなくなります。

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

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

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 コマンドでは、コンテンツを指定するために「@」文字を使用し、その後にファイル名を続けます。

Firebase コンソール

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

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

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

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

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

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

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

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 のデフォルト値をアプリにインポートする方法については、以下をご覧ください。