Terraform の状態を Cloud Storage バケットに保存する

このチュートリアルでは、Terraform の状態を Cloud Storage バケットに保存する方法について説明します。

デフォルトでは、Terraform はローカルの terraform.tfstate という名前のファイルに状態を保存します。複数のユーザーが Terraform を同時に実行していて、各マシンが現在のインフラストラクチャを独自に認識している場合は、このデフォルト構成が原因でチームでの Terraform の使用が難しくなる場合があります。

このページでは、このような問題を回避するために、Cloud Storage バケットを参照するリモート状態を構成する方法について説明します。リモート状態は Terraform バックエンドの機能です。

費用

Cloud Storage では、ストレージ、読み取り / 書き込みオペレーション、下り(外向き)ネットワーク、レプリケーションで費用が発生します。

このチュートリアルの Cloud Storage バケットでは、オブジェクトのバージョニングを有効にして、デプロイの履歴を保持しています。オブジェクトのバージョニングを有効にすると、ストレージ費用が増加します。これは、古い状態のバージョンを削除するようにオブジェクトのライフサイクル管理を構成することで軽減できます。

始める前に

  1. ユーザー アカウントに必要な Cloud Storage 権限があることを確認します。
    • storage.buckets.create
    • storage.buckets.list
    • storage.objects.get
    • storage.objects.create
    • storage.objects.delete
    • storage.objects.update

    IAM ページに移動

    ロールと権限について詳細を確認します

    バケットとバケットに保存されている状態ファイルへのアクセスを制御することをおすすめします。バケットに対する管理者権限は、少数のユーザー(メインのクラウド管理者と、代替またはバックアップ管理者として機能するユーザーなど)にのみ付与する必要があります。他のデベロッパーには、バケット内のオブジェクトへの書き込みと読み取りのみを許可する権限が必要です。

  2. Cloud Shell を起動します

    Cloud Shell は Compute Engine 仮想マシンです。この仮想マシンに関連付けられているサービス認証情報は自動的に設定されるため、サービス アカウント キーを設定またはダウンロードする必要はありません。

  3. Cloud Storage API を有効にします。

    gcloud services enable storage.googleapis.com
    

Cloud Storage バケットに状態を保存するように Terraform を構成する

次の手順では、Cloud Storage バケットを作成し、バックエンド構成を新しいバケットと Google Cloud プロジェクトに変更します。

バケットを作成する

  1. 次の google_storage_bucket Terraform リソースを Terraform 構成ファイル(main.tf など)に追加します。

    resource "random_id" "bucket_prefix" {
      byte_length = 8
    }
    
    resource "google_storage_bucket" "default" {
      name          = "${random_id.bucket_prefix.hex}-bucket-tfstate"
      force_destroy = false
      location      = "US"
      storage_class = "STANDARD"
      versioning {
        enabled = true
      }
      encryption {
        default_kms_key_name = google_kms_crypto_key.terraform_state_bucket.id
      }
      depends_on = [
        google_project_iam_member.default
      ]
    }

    コード スニペットでは、location フィールドが US にハードコードされています(つまり、米国のマルチリージョン バケットが作成されます)。このフィールドは、任意のロケーションに変更できます。

  2. terraform apply を実行してストレージ バケットを作成します。

バックエンド構成を変更する

  1. 次のテキストを backend.tf という新しい Terraform 構成ファイルに追加します。

    terraform {
     backend "gcs" {
       bucket  = "BUCKET_NAME"
       prefix  = "terraform/state"
     }
    }
    

    新しい Cloud Storage バケットの名前と一致するように BUCKET_NAME を必ず更新してください。

  2. terraform init を実行して Terraform バックエンドを構成します。

    ローカルに状態ファイルが存在すると、プロンプトが表示され、新しい Cloud Storage バケットにコピーするように求められます。「yes」と入力します。

このコマンドを実行すると、Terraform の状態が Cloud Storage バケットに保存されます。Terraform は、コマンドを実行する前にこのバケットから最新の状態を pull し、コマンドを実行した後に最新の状態をバケットに push します。

次のステップ