[2] 250909~ 클라우드/[b] 12월 : Terraform + Ansible

[27] backend 실제 구현

서버관리자 페페 2026. 1. 9. 13:57

[0]

infra/
├── .gitignore
├── README.md

├── bootstrap/
│   ├── main.tf
│   ├── .terraform/
│   └── .terraform.lock.hcl

├── main/
│   ├── backend.tf
│   ├── main.tf
│   ├── variables.tf
│   ├── terraform.tfvars
│   ├── outputs.tf
│   ├── .terraform/
│   └── .terraform.lock.hcl

개요

boostrap에서는 BE를 s3로 걸어버리면 terraform init 단계에서 Bucket이 없어서 막힘

 

1. bootstrap (로컬 state) 로 실행

-> S3 + DDB 생성

-> tfstate가 로컬에 한번 생김

 

2. main (S3 be) 실행

-> 실제 인프라 생성 + 상태 S3저장 + DDB락

 

* main은 Bootstrap 리소스를 인프라 리소스로 관리x

-> 단순히 저장소 / 락 서비스로만 사용

 

실무

: Terraform이 자기 상태를 관리하는 저장소는 그 Terraform이 관리하지 않는다

 

 

[1]

bootstrap

# backend없이 local로 한번 apply

# [0] provider

terraform {
  required_version = ">= 1.5.6"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }

    random = {
      source  = "hashicorp/random"
      version = "~> 3.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-2"
}

# [1] s3 bucket
resource "random_id" "suffix" {
  byte_length = 4
}

resource "aws_s3_bucket" "tf-state" {
  bucket        = "my-tf-state-bucket-${random_id.suffix.hex}"
  force_destroy = false
  tags          = { Name = "tf-state" }
}

resource "aws_s3_bucket_versioning" "versioning" {
  bucket = aws_s3_bucket.tf-state.id
  versioning_configuration {
    status = "Enabled"
  }
}

resource "aws_s3_bucket_server_side_encryption_configuration" "enc" {
  bucket = aws_s3_bucket.tf-state.id
  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

resource "aws_s3_bucket_public_access_block" "block" {
  bucket                  = aws_s3_bucket.tf-state.id
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

# [2] DynamoDB
resource "aws_dynamodb_table" "tf-lock" {
  name         = "my-tf-lock"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"
  attribute {
    name = "LockID"
    type = "S"
  }
  tags = { Name = "tf-lock" }
}

 

 

-

 

[2]

main + backend

terraform {
	backend "s3" {
    	bucket = "my-tf-state-bucket"
        key = "envs/prod/terraform.tfstate"
        region = "ap-northeast-2"
        dynamodb_table = "my-tf-lock"
        encrypt = true
    }
}



[3]

생성 확인

 

버킷

 

버저닝

 

enc

 

block (ACL)

 

 

 

-

 

Amazon S3 버킷에 대한 기본 암호화를 구성하려는 경우 다음 암호화 유형 중 하나를 사용할 수 있습니다.

  • Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)(기본값)
  • AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS)
  • AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)

기본 옵션(SSE-S3)의 경우 Amazon S3는 가장 강력한 블록 암호 중 하나인 256비트 Advanced Encryption Standard(AES-256)를 사용하여 버킷에 업로드되는 각 객체를 암호화합니다. SSE-KMS를 사용하면 키를 더 효과적으로 제어할 수 있습니다. SSE-KMS를 사용하는 경우 AWS KMS 고객 관리형 키를 선택하거나 기본 AWS 관리형 키(aws/s3)를 사용할 수 있습니다. SSE-KMS도 KMS 키가 사용된 때와 사용 주체를 표시하는 감사 추적 기능을 제공합니다. DSSE-KMS를 통해 Amazon S3는 두 개의 개별 객체 수준 암호화 계층을 적용하여 규제가 엄격한 고객의 규정 준수 요구 사항을 충족합니다.

'[2] 250909~ 클라우드 > [b] 12월 : Terraform + Ansible' 카테고리의 다른 글

[29] Ansible  (0) 2026.01.12
[28] 리소스 참조  (0) 2026.01.09
[26] tfstate 개념  (0) 2026.01.07
[25] variables 분리  (0) 2026.01.07
[24] IAMROLE 추가  (0) 2025.12.29