Firebase のキャッシュ

Looker Studio にはレポート用の独自のキャッシュ システムがあります。コネクタの作成時にカスタム キャッシュを実装すると、レポートの作成時間を短縮し、API レート制限を回避することができます。

たとえば、過去の気象データを提供するコネクタを作成しているとします。 過去 7 日間のデータを表示したとしますコネクタの使い勝手がよくなりました 人気がありますが、データの取得元の外部 API のレートは できます。API がデータを更新するのは 1 日 1 回なので、郵便番号によっては、 同じデータを 1 日に何度も取得する必要はありません。こちらの 郵便番号ごとに日次キャッシュを実装できます。

要件

  • Firebase Realtime Database。このデータベースへのアクセス権限がない場合は、Google Cloud Platform(GCP)プロジェクトを作成し、スタートガイドの手順に沿って、ご自身の Firebase Realtime Database インスタンスを作成してください。
  • Firebase リアルタイムからのデータの読み取りと書き込みを行うための GCP サービス アカウント データベース。
  • ソースからデータを取得するコミュニティ コネクタ。

制限事項

  • このソリューションは、Looker Studio の高度なサービスでは使用できません。日時 Looker Studio Advanced Services(アプリのコネクタコード)を使用します。 スクリプトはデータにアクセスできません。したがって、データをキャッシュに保存することは 作成できます
  • レポートの編集者と閲覧者は、このキャッシュをリセットすることはできません。

解決方法

サービス アカウントを実装する

  1. Google Cloud プロジェクトでサービス アカウントを作成します。
  2. このサービス アカウントには、Cloud プロジェクトでの BigQuery へのアクセス権限が必要です。
    • 必要な Identity and Access Management(IAM)の役割: Firebase Admin
  3. JSON ファイルをダウンロードして、サービス アカウント キーを取得します。ファイルに含まれるキーを、コネクタ プロジェクトのスクリプト プロパティに保存します。追加すると、 Apps Script UI では
    のようになります。 スクリプト プロパティに保存されたサービス アカウントのキー
  4. Apps Script プロジェクトに Apps Script 向け OAuth2 ライブラリを含めます。
  5. サービス アカウントに必要な OAuth2 コードを実装します。
firestore-cache/src/firebase.js
var SERVICE_ACCOUNT_CREDS = 'SERVICE_ACCOUNT_CREDS';
var SERVICE_ACCOUNT_KEY = 'private_key';
var SERVICE_ACCOUNT_EMAIL = 'client_email';
var BILLING_PROJECT_ID = 'project_id';

var scriptProperties = PropertiesService.getScriptProperties();

/**
 * Copy the entire credentials JSON file from creating a service account in GCP.
 * Service account should have `Firebase Admin` IAM role.
 */
function getServiceAccountCreds() {
  return JSON.parse(scriptProperties.getProperty(SERVICE_ACCOUNT_CREDS));
}

function getOauthService() {
  var serviceAccountCreds = getServiceAccountCreds();
  var serviceAccountKey = serviceAccountCreds[SERVICE_ACCOUNT_KEY];
  var serviceAccountEmail = serviceAccountCreds[SERVICE_ACCOUNT_EMAIL];

  return OAuth2.createService('FirebaseCache')
    .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
    .setTokenUrl('https://accounts.google.com/o/oauth2/token')
    .setPrivateKey(serviceAccountKey)
    .setIssuer(serviceAccountEmail)
    .setPropertyStore(scriptProperties)
    .setCache(CacheService.getScriptCache())
    .setScope([
      'https://www.googleapis.com/auth/userinfo.email',
      'https://www.googleapis.com/auth/firebase.database'
    ]);
}

Firebase からデータを読み書きするためのコードを実装する

Firebase Realtime Database からデータを読み書きするには、Firebase Database REST API を使用します。以下のコードで、この API にアクセスするために必要なメソッドを実装します。

getData() を実装する

キャッシュを使用しない既存の getData() コードの構造は、次のようになっています。

firestore-cache/src/without-caching.js
/*
 * This file is only to demonstrate how the `getData()` fucntion would look
 * like without the Firebase Realtime Database caching. It is not a part of
 * the connector code and should not be included in Apps Script / Clasp.
 */

function getData(request) {
  var requestedFields = getFields().forIds(
    request.fields.map(function(field) {
      return field.name;
    })
  );

  var fetchedData = fetchAndParseData(request);
  var data = getFormattedData(fetchedData, requestedFields);

  return {
    schema: requestedFields.build(),
    rows: data
  };
}

getData() コードでキャッシュを使用するには、次の手順を行います。

  1. キャッシュするデータの「チャンク」、すなわち「単位」を決定します。
  2. キャッシュにデータの最小単位を保存する一意のキーを作成します。
    実装例では、configparamszipcode が使用されています。 使用します。
    (省略可)ユーザーごとにキャッシュを作成する場合は、基本キーとユーザー ID を組み合わせた複合キーを作成します。実装例:
    js var baseKey = getBaseKey(request); var userEmail = Session.getEffectiveUser().getEmail(); var hasheduserEmail = getHashedValue(userEmail); var compositeKey = baseKey + hasheduserEmail;

  3. キャッシュされたデータが存在する場合は、キャッシュが最新かどうかを確認します。
    この例では、指定された郵便番号のキャッシュ データは、そのキャッシュ時の日付で保存されます。データがキャッシュから取得されると、キャッシュの日付は チェックされます

    var cacheForZipcode = {
      data: <data being cached>,
      ymd: <current date in YYYYMMDD format>
    }
    
  4. キャッシュに保存されたデータが存在しない場合、またはキャッシュに保存されたデータが最新でない場合は、データを取得します。 キャッシュに保存することもできます

次の例では、main.js にキャッシュ保存のある getData() コードが含まれています 確認します。

コード例

補足資料

Chrome UX コネクタは、20 GB 以下の BigQuery テーブルに基づくダッシュボードを、数千人のユーザーに提供しています。このコネクタでは、Firebase Realtime Database と Apps Script キャッシュ サービスを使用する 2 層キャッシュ方式が採用されています。実装方法について詳しくは、コードをご覧ください。