IT

Terraform S3 Backend 사용하기

hexcode 2022. 4. 8. 17:09

Terraform 에서 여러 사람이 작업을 할때 state file 을 공유하고 동시 작업시 원자성 일관성 작업을 위해서 Lock 을 제공하기 위해선 원격 공유 저장소 와 Lock 을 구현할 수 있는 Backend 가 필요하다.

AWS 에선 S3 를 이용하고 작업 상태를 공유하고 변경 작업중 원자성을 Lock 제공하기 위해 DynamoDB Table Lock 을 손쉽게 사용할수 있다.

mkdir backend
cat main.tf
# terrafrom state lock 테이블
resource "aws_dynamodb_table" "terraform_state_lock" {
  name         = "terraform-state-lock"
  hash_key     = "LockID"
  billing_mode = "PAY_PER_REQUEST"

  attribute {
    name = "LockID"
    type = "S"
  }
}

# Terraform state 저장용 S3 버킷
resource "aws_s3_bucket" "terraform_state" {
  bucket = "infra-terraform-states"
  tags = {
    Name = "terraform state"
  }
  lifecycle {
    prevent_destroy = true
  }
}


# Terraform state 저장용 S3 버킷 ACL 
resource "aws_s3_bucket_acl" "terraform_state_acl" {
  bucket = aws_s3_bucket.terraform_state.id
  acl    = "private"
}

# Terraform state 저장용 S3 버킷 버저닝
resource "aws_s3_bucket_versioning" "terraform_state_versioning" {
  bucket = aws_s3_bucket.terraform_state.id
  versioning_configuration {
    status = "Enabled"
  }
}

# 보안을 위해 S3 버켓을 Block all public access 로 만든다
resource "aws_s3_bucket_public_access_block" "terraform_state_public" {
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
  bucket = aws_s3_bucket.terraform_state.id
}

위에 적용후 실제로 S3 Backend 는 아래와 같이 정의하여 활용 할수 있다.

mkdir workdir
cat backend.tf

terraform {
  backend "s3" {
    # 위에 지정한 backend 버켓명
    bucket = "infra-terraform-states"
    # 아래 파일명이 키가 되고 아래 디렉토리로 파일이 남게 된다 
    key = "infra/vpc/terraform.tfstate"
    region = "ap-northeast-2"
    # 위에 지정한 DynamoDB Table 
    dynamodb_table = "terraform-state-lock"
    acl = "bucket-owner-full-control"
    encrypt = true
    skip_credentials_validation = true
    skip_metadata_api_check = true
    profile  = "ops-admin"
  }
}

'IT' 카테고리의 다른 글

사용중인 인프라를 Terraform 코드화 하기  (0) 2022.04.08
volumio 를 VMware 에 설치  (0) 2020.04.08