LoginSignup
26
13

More than 3 years have passed since last update.

TerraformのtfstateファイルをGCSで管理する

Last updated at Posted at 2019-05-06

概要

Terraformによって作成される、環境情報を管理するstate(tfstateファイル)をクラウドストレージであるGCSで管理するまでのお話です。

前提

OS: macOS 10.14.4
Terraformバージョン: v0.11.13

stateをクラウドストレージで管理するメリット

以下のようなメリットが考えられます。

  • stateをリモートで一元管理できる
  • チーム単位で管理する場合は現在のインフラ情報をチーム内で同期できる
  • stateをバージョン管理できる
  • 同時更新によるstateの競合を防げる

参考

事前準備

サービスアカウントの作成

TerraformがGCP APIを叩く用のサービスアカウントをこちらから作成し、JSONファイルをダウンロードします。

パス設定

Terraformに認証情報を渡すためにダウンロードしたJSONファイルパスをGOOGLE_CLOUD_KEYFILE_JSONにセットします。
同様に、TerraformからGCSにアップロードできるようにするためにアプリケーションのデフォルト認証情報として、1と同じJSONファイルパスをGOOGLE_APPLICATION_CREDENTIALSにセットします。

.zshrc
export GOOGLE_CLOUD_KEYFILE_JSON={{path}}
export GOOGLE_APPLICATION_CREDENTIALS=$GOOGLE_CLOUD_KEYFILE_JSON

tfファイル作成

バケット作成

まず、tfstateファイルを管理するバケットを作成するリソース設定です。
今回はAlways free枠内でGCSを利用するため、locationやstorage_classは以下のように設定しています。
他に、過去のtfstateファイルを管理するためのバージョニングを有効にしたり、過去バージョンは5つまで管理するためのライフサイクル設定をしています。

resource "google_storage_bucket" "terraform-state-store" {
  name     = "my-terraform-bucket"
  location = "us-west1"
  storage_class = "REGIONAL"

  versioning {
    enabled = true
  }

  lifecycle_rule {
    action {
      type = "Delete"
    }
    condition {
      num_newer_versions = 5
    }
  }
}

tfstateファイルの保管先

tfstateファイルの保管先(backend)の設定です。
backendとしてGCSを指定します。

(追記)※詳しくは後述しますが、backendタイプを指定する前にバケットが作成されている必要があります。

terraform {
  backend "gcs" {
    bucket  = "my-terraform-bucket"
  }
}

最終的なtfファイル

tfstateファイルをGCSで管理するのに必要な設定だけを記述しています。

main.tf
provider "google" {
  project = "<プロジェクトID>"
  region  = "us-west1"
  zone    = "us-west1-a"
}

terraform {
  backend "gcs" {
    bucket  = "my-terraform-bucket"
  }
}

resource "google_storage_bucket" "terraform-state-store" {
  name     = "my-terraform-bucket"
  location = "us-west1"
  storage_class = "REGIONAL"

  versioning {
    enabled = true
  }

  lifecycle_rule {
    action {
      type = "Delete"
    }
    condition {
      num_newer_versions = 5
    }
  }
}

...(続く)

実行

(追記)※注意

@kodai305さんからコメントを頂き、一部説明が足りなかったので追記します。
バケットがない状態でbackendタイプを指定して初期化すると失敗します。
backendタイプの変更の前にあらかじめバケットを作成しておく必要があります。

初期化

backendをローカルからGCSに変更するために初期化をします。

$ terraform init

途中で聞かれることにはyesと答えます。
すでにtfstateファイルがローカルにある場合はこれだけでtfstateファイルがGCSにアップロードされます。
今後はapplyやdestroyするたびにGCS上のtfstateファイルが変更されます。

以上

26
13
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
13