lhywk 님의 블로그

Terraform Advanced 본문

AWS

Terraform Advanced

lhywk 2026. 3. 10. 22:05

참고자료 : https://terraform101.inflearn.devopsart.dev/advanced/backend/

 

Backend 활용하기 :: Terraform & AWS 101

Backend 활용하기 Terraform Backend 란? Terraform “Backend” 는 Terraform의 state file을 어디에 저장을 하고, 가져올지에 대한 설정입니다. 기본적으로는는 로컬 스토리지에 저장을 하지만, 설정에 따라서 s3,

terraform101.inflearn.devopsart.dev

Terraform Backend

Terraform "Backend"는 Terraform의 state file을 어디에 저장을 하고 가져올지에 대한 설정이다. 기본적으로는 로컬 스토리지에 저장을 하지만 설정에 따라서 s3, consul, etcd 등 다양한 Backend type을 사용할 수 있다.

 

Terraform Backend를 사용하는 이유

  • Locking: 보통 Terraform 코드를 혼자 작성하지 않는다. 인프라를 변경한다는 것은 굉장히 민감한 작업이 될 수 있다. 원격 저장소를 사용함으로써 동시에 같은 state를 접근하는 것을 막아 의도치 않은 변경을 방지할 수 있다.
  • Backup: 로컬 스토리지에 저장한다는 건 유실할 수 있다는 가능성을 내포한다. S3와 같은 원격저장소를 사용함으로써 state 파일의 유실을 방지한다.

 

Terraform Backend 실습

  • S3 bucket as backend: 테라폼의 상태를 저장하기 위해 S3 버킷을 생성한다. AWS S3는 쉽게 구축할 수 있으며 versioning을 지원하는 안전하는 저장소다. 
  • DynamoDB Table for Lock: 동시에 같은 파일을 수정하지 못하도록 하기 위해 DynamoDB에 작업에 대한 Lock을 생성한다.

Terraform code init.tf 파일을 작성한다.

Terraform Backend 설정을 위한 s3와 DynamoDB를 생성하는 코드이다.

 

init.tf

1. S3 버킷: 상태 파일의 저장소 (aws_s3_bucket)

  • 테라폼이 만든 인프라의 현재 상태를 기록한 terraform.tfstate 파일을 내 컴퓨터가 아닌 AWS 클라우드에 저장한다.
  • versioning { enabled = true }: 실수로 설정 파일을 날리거나 잘못 수정해서 덮어쓰더라도, 이전 버전으로 되돌릴 수 있게 해주는 최소한의 안전장치.

2. DynamoDB: 동시 수정 방지용 자물쇠 (aws_dynamodb_table)

  • 협업 환경에서 두 명 이상이 동시에 apply를 눌러 인프라가 꼬이는 것을 막는 'State Locking' 역할
  • hash_key = "LockID": 테라폼 공식 문서에서 정해준 규칙. 이 이름으로 키를 만들어야 테라폼이 "누가 지금 쓰고 있네?" 하고 인식할 수 있다.
  • billing_mode = "PAY_PER_REQUEST": 고정비 없이 쓴 만큼만 나오니까 아주 경제적....

 

Terraform variables

Terraform은 HCL Syntax를 가진 언어이다. 언어적 특성을 가지고 있기 때문에 당연히 변수를 정의하고 주입해서 사용할 수 있다.

Variable Types

  • string
  • number
  • bool

Complex variable types

  • list()
  • set()
  • map()
  • object({ = , … })
  • tuple([, …])

 

변수를 정의하기 variables.tf

변수의 정의는 .tf 파일 어느 곳에서나 정의는 가능하다. 보통 variables.tf 파일을 만들어 해당 파일에 정의한다.

변수명 타입 (Type) 기본값 (Default) 특징 및 용도
image_id string 없음 단일 문자열을 받는다. 기본값이 없으므로 실행 시 사용자가 직접 입력해야 한다.
availability_zone_names list(string) ["us-west-1a"] 여러 문자열을 순서대로 담는 목록이다. 입력이 없으면 미국 서부 구역을 사용한다.
ami_id_maps map {} 키-값(Key-Value) 쌍으로 이루어진 구조다. 리전별 AMI ID 등을 관리할 때 유용하다.

 

terraform.rfvars

정의한 변수에 값을 주입하기 위해 가장 일반적인 방법은 terraform.tfvars 파일을 생성하는 것이다. 

Variable = Value 형태로 정의한다.

 

 

Terraform function

Terraform 을 프로그래밍 언어라 볼 수는 없지만 그래도 언어적 특성과 장점을 가지고 있다. 그렇기 때문에 프로그래밍처럼 기본 내장된 다양한 function 사용할 수 있다.

Functions

  • Numeric functions
  • String functions
  • Collection functions
  • Encoding functions
  • Filesystem functions
  • Date and Time functions
  • Hash and Crypto functions
  • IP Network functions
  • Type Conversion Functions

1. length() :

가장 많이 쓰이는 함수로 리스트나 맵 안에 요소가 몇 개 들어있는지 숫자로 반환.

  • 코드 예시: count = length(var.availability_zones)
  • 설명: availability_zones 변수에 리전 내 가용 영역이 2개(a, c) 정의되어 있다면 count는 자동으로 2. 가용 영역을 3개로 늘리면 코드 수정 없이 리소스도 3개로 늘어남.

2. count.index :

count를 사용해 여러 리소스를 생성할 때 현재 생성 중인 리소스의 순서(0부터 시작)를 알려주는 내장 변수.

  • 코드 예시: Name = "public${count.index}-${var.vpc_name}"
  • 반복문이 돌아가면서 public0, public1 처럼 고유한 이름을 자동으로 붙여줌. 인프라 식별자를 관리할 때 필수적.

3. element() :

리스트에서 특정 인덱스의 값을 안전하게 가져오는 함수.

  • 코드 예시: availability_zone = element(var.availability_zones, count.index)
  • 리스트의 길이를 넘어가면 다시 처음(0번)으로 돌아가 순환하는 특징이 있어 에러 방지에 효과적.