Closed6
TerraformのstateをS3に格納する
そもそもStateってなんやねん
terraform管理対象の状態のことをStateと呼ぶ。
terraform実行時に生成、編集されるjsonファイルで管理される。(tfstate)
メタデータを追跡したり、大規模なインフラストラクチャのパフォーマンスを向上させるために使用される
推奨管理方法
tfstateはデフォルトでローカルで生成されるが、複数人が使用する場合共有する仕組みが必要となる。
ドキュメントではterraform cloudを勧めている
つまりどれ?
これ
$ ls -1
main.tf
terraform.tfstate # これ
terraform.tfstate.backup
参考
もっと詳しいのはこっち
参考にさせていただきました
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のアクセス制御機能を使うため
- バケットポリシーで柔軟なアクセス制御が可能であるため
やってみる
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"
}
続き
こんな感じの文言が追加されます
$ 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
tfファイル確認
$ aws s3 cp s3://tfstate-s3-test-20230527/dev/terraform.tfstate .
$ cat terraform.tfstate
...
中身があることを確認できればOK
後片付け
- バージョニングを無効化
- 全ファイル削除
- バケット削除
$ aws s3 rb s3://tfstate-s3-test-20230527
多分やり方間違えているので、次調査
このスクラップは2023/05/27にクローズされました