참고

테라폼을 활용한 S3 버킷 저장소 생성 (lock)

Backend Type: s3 | Terraform | HashiCorp Developer

tfstate 파일 저장용 s3 버킷 생성

아래 코드를 이용하여 s3 버킷을 생성하고 암호화까지 해준다.

resource "aws_s3_bucket" "example" {
  bucket = "terraform-backend"

	# S3 object lock 걸어서 삭제 방지
	object_lock_enabled = var.object_lock_enabled
}

resource "aws_s3_bucket_object_lock_configuration" "example" {
  bucket = aws_s3_bucket.example.bucket

  rule {
    default_retention {
      mode = "COMPLIANCE"
      days = 5
    }
  }
}

# S3 버킷에 파일이 업로드 될때마다 새 버전을 만들도록 설정, 이를 통해 언제든지 이전버전으로 되돌릴수 있다.
resource "aws_s3_bucket_versioning" "example" {
  bucket = aws_s3_bucket.example.id
  versioning_configuration {
    status = "Enabled"
  }
}

resource "aws_kms_key" "example" {
  description             = "This key is used to encrypt bucket objects"
  deletion_window_in_days = var.kms_key_delete_window_in_days
}

# S3 버킷에 기록된 모든 데이터를 서버측에서 암호화
resource "aws_s3_bucket_server_side_encryption_configuration" "example" {
  bucket = aws_s3_bucket.example.id

  rule {
    apply_server_side_encryption_by_default {
      kms_master_key_id = aws_kms_key.example.arn
      sse_algorithm     = "aws:kms"
    }
  }
}

DynamoDB 생성

DynamoDB는 terraform state들을 locking해주며 roll back하기 위함이다.

module "dynamodb_table" {
  source  = "terraform-aws-modules/dynamodb-table/aws"
  version = "3.1.2"

  name     = var.dynamodb_table
  hash_key = "id"

  attributes = [
    {
      name = "id"
      type = "N"
    }
  ]

  tags = {
    Terraform   = "true"
    Environment = "staging"
  }
}

terraform.tfstate s3에 업로드

terraform.tfstate 파일이 있는 versions.tf 파일 내에 아래와 같이 써준 후

terraform {
  required_version = "1.3.7"
  backend "s3" {
    bucket         = "aimmo-mlops-terraform-backend"
    key            = "global/terraform.tfstate"
    region         = "ap-northeast-2"
    dynamodb_table = "terraform-backend-lock"
    encrypt        = true
  }
}

명령어 실행하면 자동으로 s3에 terraform.tfstate 파일이 업로드된다.

terraform init