Terraform と Firebase を使ってみる

Firebase で Terraform のサポートを開始しました。特定のリソースがプロビジョニングされ、サービスが有効になっている Firebase プロジェクトの作成を自動化し、標準化したいチームの場合は、Firebase で Terraform を使用することをおすすめします。

Firebase で Terraform を使用するための基本的なワークフローは次のとおりです。

  • Terraform 構成ファイル(.tf ファイル)を作成してカスタマイズする。このファイルに、プロビジョニングしたいインフラストラクチャ(プロビジョニングするリソースと有効にするサービス)を指定します。

  • Terraform とやり取りする gCloud CLI コマンドを使用して、.tf ファイルに指定したインフラストラクチャをプロビジョニングする。

Terraform と Firebase でできること

このガイドで説明する一般的なワークフローの例は、Android アプリを含む新しい Firebase プロジェクトを作成するものですが、Terraform を使用すると次のようなこともできます。

  • Terraform を使用して、既存のインフラストラクチャの削除と変更を行う。

  • Terraform を使用して、次のようなプロダクト固有の構成とタスクを管理する。

    • Firebase Authentication ログイン プロバイダを有効にする。
    • Cloud Storage バケットまたはデータベース インスタンスを作成して、Firebase セキュリティ ルールをデプロイする。

これらのタスクはすべて、標準の Terraform 構成ファイルとコマンドで行うことができます。このような作業に役立つように、一般的なユースケースに対応したサンプルの Terraform 構成ファイルが用意されています。



Firebase で Terraform を使用するための一般的なワークフロー

前提条件

このガイドでは、Firebase で Terraform を使用する方法について説明します。そのため、Terraform に関する基本的なスキルがあることを前提としています。このワークフローを始める前に、次の前提条件を満たしていることを確認してください。

  • Terraform をインストールし、公式のチュートリアルで Terraform について学習している。

  • Google Cloud CLI をインストールしている(gCloud CLI)。ユーザー アカウントまたはサービス アカウントを使用してログインしている。


ステップ 1: Terraform 構成ファイルを作成してカスタマイズする

Terraform 構成ファイルには次の 2 つのメイン セクションが必要です(このガイドの後半で詳しく説明します)。

provider を設定する

provider は、使用する Firebase プロダクトまたはサービスに関係なく設定する必要があります。

  1. ローカル ディレクトリに Terraform 構成ファイル(main.tf ファイルなど)を作成します。

    このガイドでは、この構成ファイルを使用して、provider の設定と、Terraform で作成するすべてのインフラストラクチャを指定します。ただし、別の方法でプロバイダの設定を追加することもできます。

  2. main.tf ファイルの先頭に、次の provider 設定を記述します。

    これは Terraform で Firebase を使用する機能のベータ版であるため、google-beta プロバイダを使用する必要があります。本番環境で使用する場合は注意してください。

    # Terraform configuration to set up providers by version.
    terraform {
      required_providers {
        google-beta = {
          source  = "hashicorp/google-beta"
          version = "~> 4.0"
        }
      }
    }
    
    # Configures the provider to use the resource block's specified project for quota checks.
    provider "google-beta" {
      user_project_override = true
    }
    
    # Configures the provider to not use the resource block's specified project for quota checks.
    # This provider should only be used during project creation and initializing services.
    provider "google-beta" {
      alias = "no_user_project_override"
      user_project_override = false
    }
    

    Firebase で Terraform を使用する場合は、さまざまな種類のプロジェクト関連の属性(このガイドの「割り当てチェック用プロジェクト」も含む)をご覧ください。

  3. 次のセクションに進んで構成ファイルを作成し、作成するインフラストラクチャを指定します。

resource ブロックを使用して、作成するインフラストラクチャを指定する

Terraform で作成するすべてのインフラストラクチャ(プロビジョニングするすべてのリソースと有効にするすべてのサービス)を Terraform 構成ファイル(このガイドでは main.tf ファイル)に指定する必要があります。このガイドの Terraform をサポートする Firebase リソースを確認してください。

  1. main.tf ファイルを開きます。

  2. provider の設定で、次の resource ブロックの構成を追加します。

    この基本的な例では、新しい Firebase プロジェクトを作成し、そのプロジェクトに Firebase Android アプリを作成します。

    # Terraform configuration to set up providers by version.
    ...
    
    # Configures the provider to use the resource block's specified project for quota checks.
    ...
    
    # Configures the provider to not use the resource block's specified project for quota checks.
    ...
    
    # Creates a new Google Cloud project.
    resource "google_project" "default" {
      provider   = google-beta.no_user_project_override
    
      name       = "Project Display Name"
      project_id = "project-id-for-new-project"
      # Required for any service that requires the Blaze pricing plan
      # (like Firebase Authentication with GCIP)
      billing_account = "000000-000000-000000"
    
      # Required for the project to display in any list of Firebase projects.
      labels = {
        "firebase" = "enabled"
      }
    }
    
    # Enables required APIs.
    resource "google_project_service" "default" {
      provider = google-beta.no_user_project_override
      project  = google_project.default.project_id
      for_each = toset([
        "cloudbilling.googleapis.com",
        "cloudresourcemanager.googleapis.com",
        "firebase.googleapis.com",
        # Enabling the ServiceUsage API allows the new project to be quota checked from now on.
        "serviceusage.googleapis.com",
      ])
      service = each.key
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enables Firebase services for the new project created above.
    resource "google_firebase_project" "default" {
      provider = google-beta
      project  = google_project.default.project_id
    
      # Waits for the required APIs to be enabled.
      depends_on = [
        google_project_service.default
      ]
    }
    
    # Creates a Firebase Android App in the new project created above.
    resource "google_firebase_android_app" "default" {
      provider = google-beta
    
      project      = google_project.default.project_id
      display_name = "My Awesome Android app"
      package_name = "awesome.package.name"
    
      # Wait for Firebase to be enabled in the Google Cloud project before creating this App.
      depends_on = [
        google_firebase_project.default,
      ]
    }
    


ステップ 2: Terraform コマンドを実行して、指定したインフラストラクチャを作成する

main.tf ファイルで指定されたリソースをプロビジョニングしてサービスを有効にするには、main.tf ファイルと同じディレクトリから次のコマンドを実行します。これらのコマンドの詳細については、Terraform のドキュメントをご覧ください。

  1. このディレクトリで Terraform コマンドを初めて実行する場合は、構成ディレクトリを初期化し、Google Terraform プロバイダをインストールする必要があります。この作業を行うには、次のコマンドを実行します。

    terraform init
  2. 次のコマンドを実行して、main.tf ファイルに指定されているインフラストラクチャを作成します。

    terraform apply
  3. すべてが想定どおりプロビジョニングまたは有効化されていることを確認します。

    • オプション 1: 次のコマンドを実行して、ターミナルに出力された構成を確認します。

      terraform show
    • オプション 2: Firebase コンソールで Firebase プロジェクトを表示します。



Terraform をサポートする Firebase リソース

次の Firebase と Google のリソースは Terraform に対応しています。Google では随時リソースを追加しています。Terraform で管理したいリソースが表示されない場合は、しばらくしてからもう一度ご確認いただくか、GitHub リポジトリで問題を報告してください。


Firebase プロジェクトとアプリの管理

  • google_firebase_project - 既存の Google Cloud プロジェクトで Firebase サービスを有効にする

  • google_firebase_project_location - プロジェクトのデフォルトの Google Cloud リソースのロケーションを設定する

  • Firebase アプリ


Firebase Authentication

現時点でサポートされていない機能:

  • Terraform を使用した多要素認証(MFA)の構成
  • Terraform を使用したブロッキング関数の設定

Firebase Realtime Database

現時点でサポートされていない機能:

  • Terraform を使用した Firebase Realtime Database セキュリティ ルールのデプロイ(プログラムを使用する方法など、他のツールを使用してこれらのルールをデプロイする方法を確認してください)

Cloud Firestore

  • google_firestore_database - Cloud Firestore インスタンスを作成する

  • google_firestore_index - Cloud Firestore の効率的なクエリを有効にする

  • google_firestore_document - コレクション内の特定のドキュメントを含む Cloud Firestore インスタンスをシードする

    重要: このシード ドキュメントでは、実際のエンドユーザーのデータや本番環境のデータを使用しないでください。


Cloud Storage for Firebase


Firebase セキュリティ ルール(Cloud Firestore と Cloud Storage の場合)

Firebase Realtime Database では、Firebase セキュリティ ルールに別のプロビジョニング システムが使用されています。

  • google_firebaserules_ruleset - Cloud Firestore インスタンスまたは Cloud Storage バケットに適用される Firebase セキュリティ ルールを定義する

  • google_firebaserules_release - 特定のルールセットを Cloud Firestore インスタンスまたは Cloud Storage バケットにデプロイする



一般的なユースケースの Terraform 構成ファイルの例



トラブルシューティングとよくある質問