0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

②S3 ⇨ Lambda ⇨ S3でテキストを大文字変換する構成を作ってみた(リモートステートへ移行)

0
Last updated at Posted at 2025-06-29

terraform.tfstateをローカルからリモートへ移行してみた

前回の記事「①S3 ⇨ Lambda ⇨ S3でテキストを大文字変換する構成を作ってみた」の続き

目的

以降GitHub Actionsを実行させるため、ローカルからリモートへステート管理を移行したいと思ったため

全体の流れ

  1. bootstrap/state_backend.tfでs3とDynamoDBの作成
  2. ルートにbackend.tfを作成
  3. ローカルに残っている.terraformを削除する
  4. terraform init -reconfigureを実行
  5. 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上のステートが自動的に使われるため、ローカルには不要です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?