terraform.tfstateをローカルからリモートへ移行してみた
前回の記事「①S3 ⇨ Lambda ⇨ S3でテキストを大文字変換する構成を作ってみた」の続き
目的
以降GitHub Actionsを実行させるため、ローカルからリモートへステート管理を移行したいと思ったため
全体の流れ
- bootstrap/state_backend.tfでs3とDynamoDBの作成
- ルートにbackend.tfを作成
- ローカルに残っている.terraformを削除する
- terraform init -reconfigureを実行
- terraform state pushを実行
追加するファイル
/s3⇨lambda⇨s3
├── backend.tf #追加
├── bootstrap #追加
│ ├── state_backend.tf #追加
│ └── terraform.tfstate #追加
├── main.tf
├── modules
│ ├── lambda
│ │ ├── function.zip
│ │ ├── lambda_function.py
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ └── variables.tf
│ └── s3
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── outputs.tf
├── text.txt
└── variables.tf
1. bootstrap/state_backend.tfでs3とDynamoDBの作成
provider "aws" {
region = "ap-northeast-1"
}
resource "random_id" "suffix" {
byte_length = 4
}
resource "aws_s3_bucket" "terraform_state" {
bucket = "terraform-state-${random_id.suffix.hex}"
}
resource "aws_dynamodb_table" "terraform_lock" {
name = "terraform-lock-${random_id.suffix.hex}"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
output "s3_state_bucket_id" {
value = aws_s3_bucket.terraform_state.id
}
output "dynamodb_lock_table_id" {
value = aws_dynamodb_table.terraform_lock.id
}
※Terraform v1.11 以降は dynamodb_table が deprecated という警告が出ますが、現時点では問題なく動作します。
bootstrapへ移動してリソースの作成
cd bootstrap
terraform init
terraform plan
terraform apply
マネジメントコンソールでS3バケットとDynamoDBのテーブルが作成されているか確認
2. ルートにbackend.tfを作成
terraform {
backend "s3" {
bucket = "terraform-state-〇〇〇〇" # terraform applyしたときのoutputで確認
key = "global/s3/terraform.tfstate"
region = "ap-northeast-1"
dynamodb_table = "terraform-lock-〇〇〇〇" # 同様にoutputで確認
encrypt = true
}
}
3. ローカルに残っている.terraformを削除する
/s3⇨lambda⇨s3
rm -rf .terraform
4. terraform init -reconfigureを実行
# 〇〇〇〇はterraform applyしたときの output で確認
terraform init \
-reconfigure \
-backend-config="bucket=terraform-state-〇〇〇〇" \
-backend-config="key=global/s3/terraform.tfstate" \
-backend-config="region=ap-northeast-1" \
-backend-config="dynamodb_table=terraform-lock-〇〇〇〇"
5. terraform state pushを実行
/s3⇨lambda⇨s3
terraform state push ./terraform.tfstate
このコマンドでローカルステートファイルをS3にアップロードします。
これを行うことで、以降の plan/apply はリモートステートを使って管理されます。
自分自身かなりここまでに調べたりして時間がかかったので初めからリモートで管理する方が良さそうです。
これでローカルのterraform.tfstateを削除しても特に問題ありませんでした。
以降はS3上のステートが自動的に使われるため、ローカルには不要です。