Posted at

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


概要

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を指定します。

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
}
}
}

...(続く)



実行


初期化

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

$ terraform init

途中で聞かれることにはyesと答えます。

すでにtfstateファイルがローカルにある場合はこれだけでtfstateファイルがGCSにアップロードされます。

今後はapplyやdestroyするたびにGCS上のtfstateファイルが変更されます。

以上