Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

プログラムでリモート構成を変更する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このドキュメントでは、 Remote Config テンプレートと呼ばれる一連の JSON 形式のパラメーターと条件をプログラムで読み取り、変更する方法について説明します。これにより、クライアント アプリがクライアント ライブラリを使用してフェッチできるバックエンドでテンプレートの変更を行うことができます。

このガイドで説明されているRemote Config REST APIまたはAdmin SDKを使用すると、Firebase コンソールでのテンプレートの管理をバイパスして、Remote Config の変更を独自のプロセスに直接統合できます。たとえば、Remote Config バックエンド API を使用すると、次のことができます。

  • Remote Config の更新のスケジュール設定。 cron ジョブと組み合わせて API 呼び出しを使用することにより、Remote Config の値を定期的に変更できます。
  • 独自の独自システムから Firebase Remote Config に効率的に移行するために、構成値をバッチ インポートします。
  • Cloud Functions for Firebase で Remote Config を使用し、サーバー側で発生するイベントに基づいてアプリの値を変更します。たとえば、Remote Config を使用してアプリの新機能を宣伝し、十分な人数が新機能を操作したことを検出したら、その宣伝を自動的にオフにすることができます。

    カスタム ツールおよびサーバーと対話する Remote Config バックエンドを示す図

このガイドの次のセクションでは、Remote Config バックエンド API で実行できる操作について説明します。 REST API を介してこれらのタスクを実行するコードを確認するには、次のサンプル アプリのいずれかを参照してください。

Firebase Admin SDK を使用して Remote Config を変更する

Admin SDK は、特権環境から Firebase を操作できるサーバー ライブラリのセットです。 Remote Config の更新の実行に加えて、Admin SDK は、Firebase 認証トークンの生成と検証、Realtime Database からの読み取りと書き込みなどを可能にします。 Admin SDK の前提条件とセットアップの詳細については、「 Firebase Admin SDK をサーバーに追加する」を参照してください。

一般的な Remote Config フローでは、現在のテンプレートを取得し、いくつかのパラメーターまたはパラメーター グループと条件を変更し、テンプレートを検証してから公開します。これらの API 呼び出しを行う前に、SDK からのリクエストを承認する必要があります。

SDK を初期化し、API リクエストを承認する

パラメータを指定せずに Admin SDK を初期化すると、SDK はGoogle アプリケーションのデフォルト認証情報を使用し、 FIREBASE_CONFIG環境変数からオプションを読み取ります。 FIREBASE_CONFIG変数の内容が{で始まる場合、JSON オブジェクトとして解析されます。それ以外の場合、SDK は文字列がオプションを含む JSON ファイルの名前であると想定します。

例えば:

Node.js

const admin = require('firebase-admin');
admin.initializeApp();

ジャワ

FileInputStream serviceAccount = new FileInputStream("service-account.json");
FirebaseOptions options = FirebaseOptions.builder()
        .setCredentials(GoogleCredentials.fromStream(serviceAccount))
        .build();
FirebaseApp.initializeApp(options);

現在の Remote Config テンプレートを取得する

Remote Config テンプレートを使用する場合は、それらがバージョン管理されていること、および各バージョンの作成時から更新で置き換えるまでの有効期間が制限されていることに注意してください: 90 日間、保存されたバージョンの合計制限は 300 です。詳細については、テンプレートとバージョン管理を参照してください。

バックエンド API を使用して、Remote Config テンプレートの現在アクティブなバージョンを JSON 形式で取得できます。

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

テンプレートを取得するには:

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);
      });
}

ジャワ

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

Remote Config パラメータの変更

Remote Config パラメーターとパラメーター グループをプログラムで変更および追加できます。たとえば、「new_menu」という名前の既存のパラメーター グループに、季節情報の表示を制御するパラメーターを追加できます。

Node.js

function addParameterToGroup(template) {
  template.parameterGroups['new_menu'].parameters['spring_season'] = {
    defaultValue: {
      useInAppDefault: true
    },
    description: 'spring season menu visibility.',
  };
}

ジャワ

template.getParameterGroups().get("new_menu").getParameters()
        .put("spring_season", new Parameter()
                .setDefaultValue(ParameterValue.inAppDefault())
                .setDescription("spring season menu visibility.")
        );

API を使用すると、新しいパラメーターとパラメーター グループを作成したり、デフォルト値、条件値、および説明を変更したりできます。いずれの場合も、変更後にテンプレートを明示的に公開する必要があります。

Remote Config の条件を変更する

Remote Config の条件と条件値をプログラムで変更および追加できます。たとえば、新しい条件を追加するには:

Node.js

function addNewCondition(template) {
  template.conditions.push({
    name: 'android_en',
    expression: 'device.os == \'android\' && device.country in [\'us\', \'uk\']',
    tagColor: 'BLUE',
  });
}

ジャワ

template.getConditions().add(new Condition("android_en",
        "device.os == 'android' && device.country in ['us', 'uk']", TagColor.BLUE));

いずれの場合も、変更後にテンプレートを明示的に公開する必要があります。

Remote Config バックエンド API は、アプリの動作と外観を変更するために使用できるいくつかの条件と比較演算子を提供します。条件とこれらの条件でサポートされている演算子の詳細については、条件式のリファレンスを参照してください。

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

必要に応じて、次に示すように、公開する前に更新を検証できます。

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);
      });
}

ジャワ

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());
  }
}

この検証プロセスでは、パラメーターと条件の重複キー、無効な条件名または存在しない条件、または不正な形式の etag などのエラーをチェックします。たとえば、許可された数 (2000) を超えるキーを含むリクエストは、エラー メッセージParam count too largeを返します。

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

テンプレートを取得し、必要な更新で修正したら、公開できます。このセクションで説明されているようにテンプレートを公開すると、既存の構成テンプレート全体が更新されたファイルに置き換えられ、新しいアクティブなテンプレートには、置き換えられたテンプレートよりも 1 つ大きいバージョン番号が割り当てられます。

必要に応じて、REST API を使用して以前のバージョンにロールバックできます。更新時のエラーのリスクを軽減するために、公開前に検証できます。

ダウンロードしたテンプレートには Remote Config のパーソナライズと条件が含まれているため、別のプロジェクトに公開しようとする場合は、次の制限に注意することが重要です。

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

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

  • 条件はプロジェクトからプロジェクトにインポートできますが、特定の条件値 (アプリ ID や対象ユーザーなど) は公開前にターゲット プロジェクトに存在する必要があることに注意してください。

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

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

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);
      });
}

ジャワ

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 API を使用して Remote Config を変更する

このセクションでは、 https://firebaseremoteconfig.googleapis.com //firebaseremoteconfig.googleapis.com にある Remote Config REST API の主な機能について説明します。詳細については、 API リファレンスを参照してください。

API リクエストを認証および承認するためのアクセス トークンを取得する

Firebase プロジェクトは Googleサービス アカウントをサポートしています。これを使用して、アプリサーバーまたは信頼できる環境から Firebase サーバー API を呼び出すことができます。コードをローカルで開発している場合、またはアプリケーションをオンプレミスにデプロイしている場合は、このサービス アカウントを介して取得した資格情報を使用して、サーバー リクエストを承認できます。

サービス アカウントを認証し、Firebase サービスへのアクセスを承認するには、JSON 形式で秘密鍵ファイルを生成する必要があります。

サービス アカウントの秘密鍵ファイルを生成するには:

  1. Firebase コンソールで、 [設定] > [サービス アカウント]を開きます。

  2. [ Generate New Private Key ] をクリックし、[ Generate Key ] をクリックして確認します。

  3. キーを含む JSON ファイルを安全に保管します。

サービス アカウントを介して承認する場合、資格情報をアプリケーションに提供する方法は 2 つあります。 GOOGLE_APPLICATION_CREDENTIALS環境変数を設定するか、コードでサービス アカウント キーへのパスを明示的に渡すことができます。最初のオプションはより安全であり、強くお勧めします。

環境変数を設定するには:

環境変数GOOGLE_APPLICATION_CREDENTIALSを、サービス アカウント キーを含む JSON ファイルのファイル パスに設定します。この変数は現在のシェル セッションにのみ適用されるため、新しいセッションを開く場合は、変数を再度設定してください。

Linux または macOS

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

ウィンドウズ

PowerShell の場合:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

上記の手順を完了すると、Application Default Credentials (ADC) は資格情報を暗黙的に決定できるようになり、Google 以外の環境でテストまたは実行するときにサービス アカウントの資格情報を使用できるようになります。

Firebase 認証情報を、優先言語のGoogle Auth ライブラリと一緒に使用して、有効期間が短い OAuth 2.0 アクセス トークンを取得します。

node.js

 function getAccessToken() {
  return admin.credential.applicationDefault().getAccessToken()
      .then(accessToken => {
        return accessToken.access_token;
      })
      .catch(err => {
        console.error('Unable to get access token');
        console.error(err);
      });
}

この例では、Google API クライアント ライブラリが JSON Web トークン (JWT) を使用してリクエストを認証します。詳しくは、 JSON Web トークンを参照してください。

パイソン

def _get_access_token():
  """Retrieve a valid access token that can be used to authorize requests.

  :return: Access token.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      'service-account.json', SCOPES)
  access_token_info = credentials.get_access_token()
  return access_token_info.access_token

ジャワ

private static String getAccessToken() throws IOException {
  GoogleCredentials googleCredentials = GoogleCredentials
          .fromStream(new FileInputStream("service-account.json"))
          .createScoped(Arrays.asList(SCOPES));
  googleCredentials.refreshAccessToken();
  return googleCredentials.getAccessToken().getTokenValue();
}

アクセス トークンの有効期限が切れると、トークンの更新メソッドが自動的に呼び出され、更新されたアクセス トークンが取得されます。

Remote Config へのアクセスを承認するには、スコープhttps://www.googleapis.com/auth/firebase.remoteconfigをリクエストします。

Remote Config テンプレートを変更する

Remote Config テンプレートを使用する場合は、それらがバージョン管理されていること、および各バージョンの作成時から更新で置き換えるまでの有効期間が制限されていることに注意してください: 90 日間、保存されたバージョンの合計制限は 300 です。詳細については、テンプレートとバージョン管理を参照してください。

現在の Remote Config テンプレートを取得する

バックエンド API を使用して、Remote Config テンプレートの現在アクティブなバージョンを JSON 形式で取得できます。

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

次のコマンドを使用します。

カール

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 を含む) を別のファイルに出力します。

生の HTTP リクエスト

Host: firebaseremoteconfig.googleapis.com

GET /v1/projects/my-project-id/remoteConfig HTTP/1.1
Authorization: Bearer token
Accept-Encoding: gzip

この API 呼び出しは、後続の要求に使用するETagを含む別のヘッダーと共に、次の JSON を返します。

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

必要に応じて、公開する前に更新を検証できます。パブリッシュ リクエストに URL パラメーター?validate_only=trueを追加して、テンプレートの更新を検証します。応答で、ステータス コード 200 とサフィックス-0が付いた更新された etag は、更新が正常に検証されたことを意味します。 200 以外の応答は、公開する前に修正する必要があるエラーが JSON データに含まれていることを示します。

Remote Config テンプレートを更新する

テンプレートを取得し、必要な更新で JSON コンテンツを修正したら、公開できます。このセクションで説明されているようにテンプレートを公開すると、既存の構成テンプレート全体が更新されたファイルに置き換えられ、新しいアクティブなテンプレートには、置き換えられたテンプレートよりも 1 つ大きいバージョン番号が割り当てられます。

必要に応じて、REST API を使用して以前のバージョンにロールバックできます。更新時のエラーのリスクを軽減するために、公開前に検証できます。

ダウンロードしたテンプレートには Remote Config のパーソナライズと条件が含まれているため、別のプロジェクトに公開しようとする場合は、次の制限に注意することが重要です。

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

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

  • 条件はプロジェクトからプロジェクトにインポートできますが、特定の条件値 (アプリ ID や対象ユーザーなど) は公開前にターゲット プロジェクトに存在する必要があることに注意してください。

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

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

カール

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コマンドでは、「@」文字とそれに続くファイル名を使用してコンテンツを指定できます。

生の HTTP リクエスト

Host: firebaseremoteconfig.googleapis.com
PUT /v1/projects/my-project-id/remoteConfig HTTP/1.1
Content-Length: size
Content-Type: application/json; UTF8
Authorization: Bearer token
If-Match: expected ETag
Accept-Encoding: gzip
JSON_HERE

これは書き込み要求であるため、 ETagはこのコマンドによって変更され、更新された ETag が次のPUTコマンドの応答ヘッダーで提供されます。

Remote Config の条件を変更する

Remote Config の条件と条件値をプログラムで変更できます。 REST API では、テンプレートを公開する前に、テンプレートを直接編集して条件を変更する必要があります。

{
  "conditions": [{
    "name": "android_english",
    "expression": "device.os == 'android' && device.country in ['us', 'uk']",
    "tagColor": "BLUE"
  }, {
    "name": "tenPercent",
    "expression": "percent <= 10",
    "tagColor": "BROWN"
  }],
  "parameters": {
    "welcome_message": {
      "defaultValue": {
        "value": "Welcome to this sample app"
      },
      "conditionalValues": {
        "tenPercent": {
          "value": "Welcome to this new sample app"
        }
      },
      "description": "The sample app's welcome message"
    },
    "welcome_message_caps": {
      "defaultValue": {
        "value": "false"
      },
      "conditionalValues": {
        "android_english": {
          "value": "true"
        }
      },
      "description": "Whether the welcome message should be displayed in all capital letters."
    }
  }
}

上記の変更では、最初に一連の条件を定義してから、各パラメーターのデフォルト値と条件ベースのパラメーター ( conditional values ) 値を定義します。また、各要素のオプションの説明も追加します。コード コメントと同様に、これらは開発者が使用するためのものであり、アプリには表示されません。バージョン管理の目的でETagも提供されます。

Remote Config バックエンド API は、アプリの動作と外観を変更するために使用できるいくつかの条件と比較演算子を提供します。条件とこれらの条件でサポートされている演算子の詳細については、条件式のリファレンスを参照してください。

HTTP エラー コード

ステータス コード意味
200正常に更新されました
400検証エラーが発生しました。たとえば、許可された数 (2000) を超えるキーを含むリクエストは、エラー メッセージParam count too largeで 400 (Bad Request) を返します。また、この HTTPS ステータス コードは、次の 2 つの状況で発生する可能性があります。
  • 最後に ETag 値を取得してから一連の値と条件が更新されたため、バージョンの不一致エラーが発生しました。これを解決するには、 GETコマンドを使用して新しいテンプレートと ETag 値を取得し、テンプレートを更新してから、そのテンプレートと新しい ETag 値を使用して送信する必要があります。
  • If-Matchヘッダーを指定せずにPUTコマンド (Update Remote Config テンプレート要求) が行われました。
401認証エラーが発生しました (アクセス トークンが提供されていないか、Cloud Developer Console で Firebase Remote Config REST API がプロジェクトに追加されていません)
403認証エラーが発生しました (間違ったアクセス トークンが提供されました)
500内部エラーが発生しました。このエラーが発生した場合は、Firebase サポート チケットを提出してください

ステータス コード 200 は、Remote Config テンプレート (プロジェクトのパラメーター、値、および条件) が更新され、このプロジェクトを使用するアプリで使用できるようになったことを意味します。他のステータス コードは、以前に存在した Remote Config テンプレートがまだ有効であることを示します。

テンプレートの更新を送信したら、Firebase コンソールに移動して、変更が期待どおりに表示されることを確認します。条件の順序が条件の評価方法に影響するため、これは重要です ( trueと評価された最初の条件が有効になります)。

ETag の使用と強制更新

Remote Config REST API は、エンティティ タグ (ETag) を使用して、競合状態やリソースの更新の重複を防ぎます。 ETag の詳細については、 ETag - HTTPを参照してください。

REST API の場合、Google は、最新のGETコマンドによって提供された ETag をキャッシュし、 PUTコマンドを発行するときにIf-Matchリクエスト ヘッダーでその ETag 値を使用することをお勧めします。 PUTコマンドの結果が HTTPS ステータス コード 409 になった場合は、新しいGETコマンドを発行して、次のPUTコマンドで使用する新しい ETag とテンプレートを取得する必要があります。

次のように Remote Config テンプレートを強制的に更新することで、ETag とそれによる保護を回避できIf-Match: * 。複数のクライアントが Remote Config テンプレートを更新している場合。この種の競合は、API を使用する複数のクライアント、または API クライアントと Firebase コンソール ユーザーからの競合する更新で発生する可能性があります。

Remote Config テンプレートのバージョン管理のガイダンスについては、「 Remote Config テンプレートとバージョン管理」を参照してください。