コンソールへ移動

Hosting REST API を使用してサイトにデプロイする

Firebase Hosting REST API を使用すると、Firebase によってホストされているサイトに、プログラムを使用したカスタマイズ可能な方法でデプロイできます。この REST API は、新規または更新されたホスティング構成ファイルやコンテンツ ファイルをデプロイする場合に使用します。

Firebase コマンドライン インターフェース(CLI)を使用してデプロイする代わりに、Firebase Hosting REST API を使用して、サイトのアセットの新しい version をプログラムで作成し、ファイルをこのバージョンにアップロードしてから、このバージョンをサイトにデプロイできます。

たとえば、Firebase Hosting REST API を使用すると、次のことができるようになります。

  • デプロイのスケジュール。 REST API と cron ジョブを組み合わせることにより、Firebase によってホストされたコンテンツを定期的に変更できます(たとえば、特別な休日やイベントに関連したバージョンのコンテンツをデプロイすることができます)。

  • 開発ツールとの統合。 1 回クリックするだけで(たとえば、IDE 内のデプロイボタンをクリックするだけで)Firebase Hosting にウェブアプリ プロジェクトをデプロイできるオプションを、ツール内に作成することができます。

  • 静的コンテンツを生成する場合の自動デプロイ。 静的コンテンツ(たとえば、wiki やニュース記事などのユーザー作成コンテンツ)をプログラムによって生成するプロセスの場合は、生成されたコンテンツを動的に提供するのではなく、静的ファイルとしてデプロイすることができます。このようにすると、コストのかかる計算能力を節約し、ファイルをよりスケーラブルな方法で処理できます。

このガイドではまず、API の有効化、認証、承認を行う方法について説明します。次に、Firebase Hosting バージョンを作成し、必要なファイルをこのバージョンにアップロードして、最後にこのバージョンをデプロイする例を示します。

この REST API の詳細については、完全な Hosting REST API リファレンス ドキュメントもご確認ください。

始める前に: REST API を有効にする

Google API Console で Firebase Hosting REST API を有効にする必要があります。

  1. Google API Console で Firebase Hosting API ページを開きます。

  2. プロンプトが表示されたら、Firebase プロジェクトを選択します。

  3. Firebase Hosting API ページで [有効にする] をクリックします。

ステップ 1: API リクエストを認証して承認するためのアクセス トークンを取得する

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

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

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

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

  2. [新しい秘密鍵の生成] をクリックし、[キーを生成] をクリックして確定します。

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

次に示すように、有効期間の短い OAuth 2.0 アクセス トークンを取得するために、適切な言語の Google API クライアント ライブラリと一緒に Firebase 認証情報を使用します。

node.js

const {google} = require('googleapis');
function getAccessToken() {
  return new Promise(function(resolve, reject) {
    var key = require('./service-account.json');
    var jwtClient = new google.auth.JWT(
      key.client_email,
      null,
      key.private_key,
      SCOPES,
      null
    );
    jwtClient.authorize(function(err, tokens) {
      if (err) {
        reject(err);
        return;
      }
      resolve(tokens.access_token);
    });
  });
}

Python

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

Java

private static String getAccessToken() throws IOException {
  GoogleCredential googleCredential = GoogleCredential
      .fromStream(new FileInputStream("service-account.json"))
      .createScoped(Arrays.asList(SCOPES));
  googleCredential.refreshToken();
  return googleCredential.getAccessToken();
}

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

ステップ 2: サイトの新しいバージョンを作成する

最初の API 呼び出しで行うのは、サイトの新しい Version を作成することです。このガイドの後半では、ファイルをこのバージョンにアップロードし、サイトにデプロイします。

  1. デプロイするサイトの site-name を特定します。

  2. 呼び出し内で site-name を使用して、versions.create エンドポイントを呼び出します。

    (省略可)呼び出し内で Firebase Hosting 構成オブジェクトを渡すこともできます。たとえば、指定した期間内のすべてのファイルをキャッシュするヘッダーの設定などが該当します。

    次に例を示します。

    cURL コマンド

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer access-token" \
           -d '{
                 "config": {
                   "headers": [{
                     "glob": "**",
                     "headers": {
                       "Cache-Control": "max-age=1800"
                     }
                   }]
                 }
               }' \
    https://firebasehosting.googleapis.com/v1beta1/sites/site-name/versions
    

    未加工の HTTP リクエスト

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/sites/site-name/versions HTTP/1.1
    Authorization: Bearer access-token
    Content-Type: application/json
    Content-Length: 134
    
    {
      "config": {
        "headers": [{
          "glob": "**",
          "headers": {
            "Cache-Control": "max-age=1800"
          }
        }]
      }
    }
    

versions.create に対するこの API 呼び出しは、次の JSON を返します。

{
  "name": "sites/site-name/versions/version-id",
  "status": "CREATED",
  "config": {
    "headers": [{
      "glob": "**",
      "headers": {
        "Cache-Control": "max-age=1800"
      }
    }]
  }
}

このレスポンスには、新しいバージョンの一意の識別子が sites/site-name/versions/version-id の形式で含まれています。この特定のバージョンを参照するには、このガイド全体にわたってこの一意の識別子が必要になります。

ステップ 3: デプロイするファイルのリストを指定する

新しいバージョンの識別子が設定されたので、Firebase Hosting に対して、この新しいバージョンに最終的にデプロイするファイルを指定する必要があります。

この API では、SHA256 ハッシュを使用してファイルを識別する必要があります。したがって、API 呼び出しを行う前に、まず、静的ファイルを Gzip 圧縮してから、新しく圧縮した各ファイルの SHA256 ハッシュを取り出して、各静的ファイルのハッシュを計算する必要があります。

この例では、新しいバージョンに 3 つのファイル file1file2file3 をデプロイします。

  1. ファイルを Gzip 圧縮します。

    gzip file1 && gzip file2 && gzip file3

    3 つの圧縮ファイル file1.gzfile2.gzfile3.gz が作成されます。

  2. 各圧縮ファイルの SHA256 ハッシュを取得します。

    cat file1.gz | openssl dgst -sha256
    
    66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4
    
    cat file2.gz | openssl dgst -sha256
    
    490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083
    
    cat file3.gz | openssl dgst -sha256
    
    59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315
    

    3 つの圧縮ファイルの 3 つの SHA256 ハッシュが取得されました。

  3. これらの 3 つのハッシュを API リクエストに入れて、versions.populateFiles エンドポイントに送信します。各ハッシュは、アップロードされたファイルの目的のパスを使用して指定します(この例では /file1/file2/file3)。

    次に例を示します。

    cURL コマンド

    $ curl -H "Content-Type: application/json" \
             -H "Authorization: Bearer access-token" \
             -d '{
                   "files": {
                     "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4",
                     "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
                     "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
                   }
                 }' \
    https://firebasehosting.googleapis.com/v1beta1/sites/site-name/versions/version-id:populateFiles
    

    未加工の HTTP リクエスト

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/sites/site-name/versions/version-id:populateFiles HTTP/1.1
    Authorization: Bearer access-token
    Content-Type: application/json
    Content-Length: 181
    
    {
      "files": {
        "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4",
        "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
        "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
      }
    }
    

versions.populateFiles に対するこの API 呼び出しは、次の JSON を返します。

{
  "uploadRequiredHashes": [
    "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
    "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
  ],
  "uploadUrl": "https://upload-firebasehosting.googleapis.com/upload/sites/site-name/versions/version-id/files"
}

このレスポンスの内容は、次のとおりです。

  • アップロードする必要がある各ファイルのハッシュ。たとえば、この例では、file1 は以前のバージョンですでにアップロードされているため、このハッシュは uploadRequiredHashes リストに含まれていません。

  • 新しいバージョンに固有の uploadUrl

次の手順で 2 つの新しいファイルをアップロードするには、これらのハッシュと、versions.populateFiles のレスポンス内の uploadURL を使用する必要があります。

ステップ 4: 必要なファイルをアップロードする

必要なファイル(この前の手順で versions.populateFiles レスポンスの uploadRequiredHashes で指定されたファイル)を個別にアップロードする必要があります。これらのファイルをアップロードするには、ファイルのハッシュと前の手順の uploadUrl が必要です。

  1. uploadUrl の前にスラッシュファイルのハッシュを追加して、ファイル固有の URL を次の形式で作成します。https://upload-firebasehosting.googleapis.com/upload/sites/site-name/versions/version-id/files/file-hash

  2. 一連のリクエストを使用して、ファイル固有の URL に、必要なすべてのファイルを 1 つずつアップロードします(この例では file2.gzfile3.gz のみ)。

    たとえば、圧縮された file2.gz をアップロードするには、次のようにします。

    cURL コマンド

    curl -H "Authorization: Bearer access-token" \
           -H "Content-Type: application/octet-stream" \
           --data-binary @./file2.gz \
    https://upload-firebasehosting.googleapis.com/upload/sites/site-name/versions/version-id/files/file-hash
    

    未加工の HTTP リクエスト

    Host: upload-firebasehosting.googleapis.com
    
    POST /upload/sites/site-name/versions/version-id/files/file-hash HTTP/1.1
    Authorization: Bearer access-token
    Content-Type: application/octet-stream
    Content-Length: 500
    
    content-of-file2.gz
    

アップロードに成功すると、200 OK HTTP レスポンスが返されます。

ステップ 5: バージョンのステータスを FINALIZED に更新する

versions.populateFiles のレスポンス内で指定されているすべてのファイルをアップロードしたら、バージョンのステータスを FINALIZED に更新できます。

API リクエストの status フィールドを FINALIZED に設定して、versions.patch エンドポイントを呼び出します。

次に例を示します。

cURL コマンド

curl -H "Content-Type: application/json" \
       -H "Authorization: Bearer access-token" \
       -X PATCH \
       -d '{"status": "FINALIZED"}' \
https://firebasehosting.googleapis.com/v1beta1/sites/site-name/versions/version-id?update_mask=status

未加工の HTTP リクエスト

Host: firebasehosting.googleapis.com

PATCH /v1beta1/sites/site-name/versions/version-id?update_mask=status HTTP/1.1
Authorization: Bearer access-token
Content-Type: application/json
Content-Length: 23

{"status": "FINALIZED"}

versions.patch に対するこの API 呼び出しは、次の JSON を返します。statusFINALIZED に更新されていることを確認します。

{
  "name": "sites/site-name/versions/version-id",
  "status": "FINALIZED",
  "config": {
    "headers": [{
      "glob": "**",
      "headers": {"Cache-Control": "max-age=1800"}
    }]
  },
  "createTime": "2018-12-02T13:41:56.905743Z",
  "createUser": {
    "email": "service-account-email@site-name.iam.gserviceaccount.com"
  },
  "finalizeTime": "2018-12-02T14:56:13.047423Z",
  "finalizeUser": {
    "email": "your-email@domain.tld"
  },
  "fileCount": "5",
  "versionBytes": "114951"
}

ステップ 6: デプロイ用にバージョンをリリースする

これでファイナライズ バージョンが作成されたので、デプロイ用にリリースします。この手順では、ホスティング構成と新しいバージョンのすべてのコンテンツ ファイルを含むバージョンの Release を作成する必要があります。

releases.create エンドポイントを呼び出して、リリースを作成します。

次に例を示します。

cURL コマンド

curl -H "Authorization: Bearer access-token" \
       -X POST
https://firebasehosting.googleapis.com/v1beta1/sites/site-name/releases?versionName=sites/site-name/versions/version-id

未加工の HTTP リクエスト

Host: firebasehosting.googleapis.com

POST /v1beta1/sites/site-name/releases?versionName=sites/site-name/versions/version-id HTTP/1.1
Authorization: Bearer access-token

releases.create に対するこの API 呼び出しは、次の JSON を返します。

{
  "name": "sites/site-name/releases/release-id",
  "version": {
    "name": "sites/site-name/versions/version-id",
    "status": "FINALIZED",
    "config": {
    "headers": [{
      "glob": "**",
      "headers": {"Cache-Control": "max-age=1800"}
    }]
  }
  },
  "type": "DEPLOY",
  "releaseTime": "2018-12-02T15:14:37Z"
}

これで、ホスティング構成と新しいバージョンに関するすべてのファイルがサイトにデプロイされ、URL を使用してファイルにアクセスできるようになりました。

  • https://site-name.web.app/file1
  • https://site-name.web.app/file2
  • https://site-name.web.app/file3

これらのファイルには、site-name.firebaseapp.com ドメインに関連付けられた URL からアクセスすることもできます。

Firebase コンソールの Hosting ページで、新しいリリースが表示されているのを確認することもできます。