Terraform Reference
Terraform IaC 레퍼런스
Terraform Reference 소개
Terraform 레퍼런스는 코드형 인프라(Infrastructure as Code)를 위한 HashiCorp Configuration Language(HCL) 구문을 검색할 수 있는 치트 시트입니다. 리소스 블록, 프로바이더 설정, 데이터 소스, 출력값, 로컬 변수 정의 등 Terraform으로 클라우드 인프라를 선언적으로 관리하는 데 필요한 핵심 구성 요소를 다룹니다.
이 레퍼런스는 기본문법, 리소스, 변수, 모듈, 상태, 프로바이더, 함수, CLI의 8개 카테고리에 걸쳐 40개 이상의 항목을 체계적으로 정리합니다. 리소스 섹션은 EC2 인스턴스, S3 버킷, 보안 그룹, VPC, Lambda 함수 등 주요 AWS 서비스를 다루며, 변수 섹션은 string, number, list, map, object 타입과 입력 제약 조건을 위한 유효성 검사 규칙을 상세히 설명합니다.
리소스 정의 외에도 S3 원격 상태 저장소와 DynamoDB 잠금, 상태 관리 명령어(list, mv, import, rm), 모듈 생성 및 레지스트리 활용, create_before_destroy와 prevent_destroy 같은 라이프사이클 메타 인자, terraform init부터 terraform destroy까지의 CLI 워크플로우를 포괄합니다. lookup(), cidrsubnet(), merge(), try(), format() 등 내장 함수도 실용적인 예제와 함께 제공됩니다.
주요 기능
- resource, provider, data source, output, locals 블록에 대한 완전한 HCL 구문 레퍼런스
- EC2, S3, 보안 그룹, VPC, Lambda 등 프로덕션 수준의 AWS 리소스 예제
- string, number, list, map, object 타입과 커스텀 유효성 검사 규칙을 포함한 변수 타입 시스템
- 로컬 모듈, Terraform Registry 모듈, for_each 반복을 포함한 모듈 패턴
- S3 백엔드 설정, DynamoDB 잠금, import, state mv 명령어를 포함한 상태 관리 가이드
- create_before_destroy, prevent_destroy, ignore_changes 라이프사이클 메타 인자 설명
- lookup(), cidrsubnet(), merge(), concat(), try(), format() 내장 함수 레퍼런스
- terraform init, plan, apply, destroy, fmt, validate까지 주요 플래그와 함께 제공하는 CLI 워크플로우
자주 묻는 질문
이 레퍼런스는 어떤 Terraform 버전을 다루나요?
Terraform 1.5 이상의 구문과 관례를 다룹니다. terraform 블록 내부의 최신 required_providers 블록 구문, HCL2 언어 기능, 리소스 반복에 count 대신 for_each를 사용하는 등 현재의 모범 사례를 반영합니다. 예제에는 hashicorp/aws 프로바이더 5.x 버전을 사용합니다.
S3로 원격 상태 백엔드를 어떻게 설정하나요?
terraform 블록 내부에 backend 블록을 구성하여 버킷 이름, 키 경로, 리전, 상태 잠금용 DynamoDB 테이블을 지정합니다. 이 레퍼런스에는 encrypt = true와 dynamodb_table을 포함한 완전한 S3 백엔드 예제가 있어, 상태 파일의 동시 수정을 방지할 수 있습니다.
count와 for_each의 차이점은 무엇인가요?
둘 다 여러 리소스 인스턴스를 생성하지만, count는 정수 인덱스(count.index)를 사용하고 for_each는 집합이나 맵을 순회하며 each.key와 each.value를 사용합니다. for_each가 일반적으로 선호되는데, 리스트 중간의 항목을 제거해도 count처럼 후속 리소스가 재인덱싱되어 재생성되지 않기 때문입니다.
기존 인프라를 Terraform으로 어떻게 가져오나요?
terraform import <리소스_주소> <리소스_ID>를 사용하여 기존 리소스를 Terraform 관리 하에 둡니다. 예를 들어 terraform import aws_instance.web i-1234567890abcdef0으로 EC2 인스턴스를 가져올 수 있습니다. 가져온 후 terraform plan을 실행하여 구성이 실제 리소스 상태와 일치하는지 확인하세요.
Terraform에서 모듈은 언제 사용해야 하나요?
재사용 가능한 인프라 패턴을 캡슐화할 때 모듈을 사용합니다. modules/ 디렉토리 아래에 자체 변수, 리소스, 출력값을 가진 로컬 모듈을 만들고 module 블록으로 호출합니다. VPC나 EKS 클러스터 같은 일반적인 패턴에는 Terraform Registry의 검증된 모듈을 버전 고정과 함께 사용하여 재현성을 보장하세요.
라이프사이클 메타 인자는 어디에 사용하나요?
lifecycle 블록은 업데이트 시 리소스 동작을 제어합니다. create_before_destroy는 기존 리소스를 삭제하기 전에 대체 리소스를 먼저 생성하여 무중단 배포에 필수적입니다. prevent_destroy는 중요 리소스의 실수 삭제를 차단하고, ignore_changes는 외부에서 관리되는 태그 등 특정 속성의 드리프트 감지를 건너뜁니다.
변수 유효성 검사 규칙은 어떻게 작동하나요?
variable 정의 내부에 condition 표현식과 error_message를 포함한 validation 블록을 추가합니다. condition이 true로 평가되어야 변수 값이 수용됩니다. 예를 들어 contains()를 사용하여 환경 변수를 "dev", "staging", "prod"로만 제한하고, 잘못된 값 입력 시 명확한 오류 메시지를 제공할 수 있습니다.
가장 자주 사용되는 내장 함수는 무엇인가요?
자주 사용되는 함수로는 기본값과 함께 맵 값을 조회하는 lookup(), 태그 맵을 결합하는 merge(), 리스트를 연결하는 concat(), VPC CIDR에서 서브넷 CIDR 블록을 계산하는 cidrsubnet(), 문자열 보간을 위한 format()/formatlist(), 복잡한 표현식에서의 에러 처리를 위한 try()/can()이 있습니다.