Closed6

TerraformのstateをS3に格納する

not75743not75743

そもそもStateってなんやねん

terraform管理対象の状態のことをStateと呼ぶ。
terraform実行時に生成、編集されるjsonファイルで管理される。(tfstate)
メタデータを追跡したり、大規模なインフラストラクチャのパフォーマンスを向上させるために使用される

推奨管理方法

tfstateはデフォルトでローカルで生成されるが、複数人が使用する場合共有する仕組みが必要となる。
ドキュメントではterraform cloudを勧めている

つまりどれ?

これ

$ ls -1
main.tf
terraform.tfstate # これ
terraform.tfstate.backup

参考

https://developer.hashicorp.com/terraform/language/state

もっと詳しいのはこっち
https://developer.hashicorp.com/terraform/language/state/purpose

参考にさせていただきました
https://zenn.dev/sway/articles/terraform_biginner_tfstate

not75743not75743

s3に格納するメリット

  • 共有のため
  • 排他制御のため
    • DynamoDBと組み合わせる必要あり
  • バージョン管理のため
    • 状態を戻す際に便利です
    • 公式ドキュメントでも推奨されています。
      • Warning! It is highly recommended that you enable Bucket Versioning on the S3 bucket to allow for state recovery in the case of accidental deletions and human error.

  • s3のアクセス制御機能を使うため
    • バケットポリシーで柔軟なアクセス制御が可能であるため

https://developer.hashicorp.com/terraform/language/settings/backends/s3

not75743not75743

やってみる

tfstate格納用s3作成

export BUCKET_NAME=tfstate-s3-test-20230527
export BUCKET_REGION=ap-northeast-1

# バケットを作成する
aws s3api create-bucket --bucket ${BUCKET_NAME} --region ap-northeast-1 --create-bucket-configuration LocationConstraint=${BUCKET_REGION}

# バージョニングを有効化する
aws s3api put-bucket-versioning --bucket ${BUCKET_NAME} --versioning-configuration Status=Enabled

tfファイル作成

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.65.0"
    }
  }
  backend "s3" {
    bucket = "tfstate-s3-test-20230527"
    region = "ap-northeast-1"
    key    = "dev/terraform.tfstate"
  }
}

provider "aws" {
  region = "ap-northeast-1"
  default_tags {
    tags = {
      env       = "dev"
      provision = "terraform"
    }
  }
}

resource "aws_s3_bucket" "tfstate" {
  bucket = "owattarakeshimasu"
}
not75743not75743

続き

こんな感じの文言が追加されます

$ terraform init

Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.

実行

$ terraform fmt
$ terraform plan
$ terraform apply

tfstateファイルはローカルになし

$ ls -a -1 
main.tf
.terraform
.terraform.lock.hcl
not75743not75743

tfファイル確認

$ aws s3 cp s3://tfstate-s3-test-20230527/dev/terraform.tfstate .
$ cat terraform.tfstate
...

中身があることを確認できればOK

not75743not75743

後片付け

  1. バージョニングを無効化
  2. 全ファイル削除
  3. バケット削除
$ aws s3 rb s3://tfstate-s3-test-20230527

多分やり方間違えているので、次調査

このスクラップは2023/05/27にクローズされました