terraform으로 aws 인프라 구축하기 (3) (상태 관리)

2024. 12. 4. 23:08·Infra

Terraform이 인프라 상태를 추적하는 방법과 Terraform 프로젝트의 파일 레이아웃, 격리 및 잠금에 미치는 영향을 살펴보겠습니다.

Terraform의 상태 추적

  • Terraform은 인프라의 현재 상태를 파일(일반적으로 terraform.tfstate 파일)에 저장합니다.
  • 이 파일에는 프로비저닝한 리소스 정보가 담겨 있으며, Terraform이 인프라의 변경 사항을 추적하고 관리하는 데 사용됩니다.

terraform을 팀에서 사용한다면 상태 파일을 관리할 수 있는 공유 저장소가 필요합니다.
가장 좋은 방법은 Terraform의 기본 기능인 원격 백엔드 지원을 사용하는 것입니다.

 

 

Terraform의 상태 파일을 공유 저장소에 저장할 때, 버전 제어 시스템(Git 등)을 사용하는 것은 다음과 같은 문제를 일으킬 수 있습니다.

  1. 수동 오류: 상태 파일을 최신으로 유지하는 것을 잊을 경우, 오래된 상태로 인해 인프라가 의도치 않게 변경될 수 있습니다.
  2. 잠금 부족: 버전 제어 시스템은 동시에 여러 사용자가 상태 파일을 수정하는 것을 방지하는 잠금 기능을 제공하지 않습니다.
  3. 비밀 데이터 노출: 상태 파일에 민감한 정보(예: 데이터베이스 비밀번호)가 일반 텍스트로 저장되므로 보안 위험이 있습니다.

 

AWS에서 제공하는 원격 백엔드
S3: 상태 파일을 안전하게 저장하며, 암호화 및 버전 관리를 지원합니다.
DynamoDB: 상태 파일에 대한 잠금 기능을 제공하여 동시 작업을 방지합니다.

 

s3 버킷 생성

prevent_destroy = true 매개변수를 이용해 실수로 삭제 되는 것을 방지할 수 있습니다.

//s3.tf

resource "aws_s3_bucket" "terraform_state" {
 bucket = "terraform-state-joon"
 lifecycle {
 prevent_destroy = true
 }
}

 

aws_s3_bucket_versioning를 이용해서 언제든지 파일의 이전 버전을 확인하고 이전 버전으로 되돌릴 수 있습니다.

resource "aws_s3_bucket_versioning" "enabled" {
  bucket = aws_s3_bucket.terraform_state.id
  versioning_configuration {
    status = "Enabled"
  }
}

 

aws_s3_bucket_server_side_encryption_configuration 리소스를 사용하여 이 S3 버킷에 기록된 모든 데이터에 대해 기본적으로 서버 측 암호화를 활성화합니다.

resource "aws_s3_bucket_server_side_encryption_configuration" "default" {
  bucket = aws_s3_bucket.terraform_state.id
  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

 

aws_s3_bucket_public_access_block 리소스를 사용하여 S3 버킷에 대한 모든 퍼블릭 액세스를 차단합니다.

resource "aws_s3_bucket_public_access_block" "public_access" {
  bucket = aws_s3_bucket.terraform_state.id
  block_public_acls = true
  block_public_policy = true
  ignore_public_acls = true
  restrict_public_buckets = true
}

 

DynamoDB 테이블을 생성

resource "aws_dynamodb_table" "terraform_locks" {
  name = "terraform-locks"
  billing_mode = "PAY_PER_REQUEST"
  hash_key = "LockID"
  attribute {
    name = "LockID"
    type = "S"
  }
}

 

terraform init , apply를 통해 dynamoDB와 S3를 생성해줍니다.

S3 버킷과 DynamoDB 테이블이 생성되지만 Terraform 상태는 여전히 로컬에 저장됩니다. S3 버킷에 상태를 저장하도록 Terraform을 구성하려면 코드에 백엔드 구성을 추가해야 합니다.

terraform {
 backend "s3" {
   bucket = "terraform-state-joon"
   key = "global/s3/terraform.tfstate"
   region = "ap-northeast-2"
   dynamodb_table = "terraform-locks"
   encrypt = true
 }
}

 

state가 s3에 잘 저장된 것을 확인할 수 있습니다.

 

작업 공간 설정

Terraform 상태를 별도의 이름이 지정된 여러 작업공간에 저장할 수 있습니다. 

//새로운 작업 공간 생성
$ terraform workspace new test

//작업 공간 확인
$ terraform workspace list

//작업 공간 선택
$ terraform workspace select test

 

key는 workspaces-test/terraform.tfstate로 작업 공간 별로 다르게 설정해줍니다.

terraform {
 backend "s3" {
 # Replace this with your bucket name!
 bucket = "terraform-state"
 key = "workspaces-test/terraform.tfstate"
 region = "us-east-2"
 # Replace this with your DynamoDB table name!
 dynamodb_table = "terraform-locks"
 encrypt = true
 }
}

'Infra' 카테고리의 다른 글

LVM 다뤄보기  (0) 2025.02.16
terraform으로 aws 인프라 구축하기 (2) (Auto Scaling)  (0) 2024.12.04
terraform으로 aws 인프라 구축하기 (1)  (0) 2024.12.04
EKS 클러스터 구축  (0) 2024.12.04
UTM 이용해서 쿠버네티스 환경 구성하기  (0) 2024.12.04
'Infra' 카테고리의 다른 글
  • LVM 다뤄보기
  • terraform으로 aws 인프라 구축하기 (2) (Auto Scaling)
  • terraform으로 aws 인프라 구축하기 (1)
  • EKS 클러스터 구축
khjoon
khjoon
  • khjoon
    기록기록
    khjoon
  • 전체
    오늘
    어제
    • 분류 전체보기 (37)
      • Security (2)
      • Dev (14)
      • Infra (12)
      • Ops (9)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
khjoon
terraform으로 aws 인프라 구축하기 (3) (상태 관리)
상단으로

티스토리툴바