tfstateをS3で管理・共有する

はじめに

こんにちは。今回はtfstateをS3で管理・共有するための構成について書きたいと思います。

今回はBackend機能を使用します。

実行環境

この記事は以下の動作環境で動作確認しています。

$ terraform --version
Terraform v0.12.28
+ provider.aws v2.70.0

tfstateを保存するS3バケットを作成する

まずはtfstateを保存するためのS3バケットを作成しましょう。

この中でtfstateを管理していきます。

resource "aws_s3_bucket" "tfstate-storage" {
  bucket = "tfstate-${var.app_name}"
  acl    = "private"
  region = "ap-northeast-1"

  versioning {
    enabled = true
  }
}

DynamoDBを用いてstate lockを有効化する

S3で管理する事によって複数人でtfstateを扱うことが出来るようになりましたが、データがコンフリクトする可能性が出てきました。
そこで、tfstateの一貫性を保つことができるstate lock機能を使用してコンフリクトを防ぎましょう。

ここではDynamoDBを使用します。

resource "aws_dynamodb_table" "terraform-state-lock" {
  name           = "tfstate-lock-${var.app_name}"
  read_capacity  = 1
  write_capacity = 1
  hash_key       = "LockID"

  attribute {
    name = "LockID"
    type = "S"
  }
}

リソースを作成する

次の章でBackend設定をするのですが、その前にリソースを作成しておかないとエラーが発生します。

このタイミングでS3バケットとDynamoDBは作成しておきましょう。

$ terraform init
$ terraform apply

Backend機能を使用してtfstateを管理する

ここで先ほど作成したS3バケットとDynamoDBを実際にBackendに設定しましょう。

terraform {
  backend "s3" {
    bucket         = "tfstate-${var.app_name}"
    key            = "terraform.tfstate"
    region         = "ap-northeast-1"
    dynamodb_table = "tfstate-lock-${var.app_name}"
  }
}

おわりに

terraformをチーム開発で使用する際には必須の知識になると思いますので、整理と共有をしました。

命名を変更することで環境ごとに対応することも可能です。

それでは良いterraform lifeを🎉

参考: https://blog.gruntwork.io/how-to-manage-terraform-state-28f5697e68fa