Terraform은 infrastructure를 코드로 관리하기 위한 도구다. 예전 Velog 노트에서는 Terraform 기본 개념과 AWS provider 예제가 섞여 있었는데, 여기서는 처음 보는 사람이 따라가기 쉽게 다시 정리했다.
Provisioning
Provisioning은 어떤 service나 process를 실행하기 위한 준비 단계다.
Infrastructure 관점에서는 크게 두 가지로 나눌 수 있다.
- Network, compute, storage 같은 resource를 준비한다.
- 준비된 compute resource 위에 package, runtime, application dependency를 올린다.
Terraform은 주로 첫 번째 영역, 즉 cloud resource를 선언하고 생성하는 데 많이 사용한다.
Provider
Provider는 Terraform과 외부 service를 연결하는 module이다.
AWS resource를 만들고 싶으면 AWS provider를 설정해야 한다. Terraform은 provider를 통해 EC2, VPC, S3, IAM 같은 resource를 생성하거나 수정한다.
provider "aws" {
region = var.region
}
실제 운영에서는 access key와 secret key를 코드에 직접 넣지 않는 것이 좋다. 환경 변수, IAM role, profile 같은 방식을 사용한다.
Resource
Resource는 provider가 제공하는 조작 가능한 최소 단위다.
예를 들어 AWS provider는 aws_instance resource를 제공한다. 이 resource를 사용하면 EC2 instance를 선언할 수 있다.
resource "aws_instance" "web" {
ami = var.ami_id
instance_type = "t3.micro"
}
Terraform의 핵심은 무엇을 만들지를 코드로 선언하고, Terraform이 현재 상태와 비교해서 필요한 변경을 계산한다는 점이다.
HCL
Terraform 설정은 HCL, HashiCorp Configuration Language를 사용한다. 확장자는 보통 .tf다.
HCL은 JSON보다 사람이 읽기 쉽고, infrastructure 선언에 맞게 설계되어 있다.
Terraform workflow
Terraform을 사용할 때 기본 흐름은 거의 항상 같다.
terraform init
terraform validate
terraform plan
terraform apply
init은 작업 directory를 초기화하고 provider plugin을 내려받는다. validate는 설정 파일이 유효한지 확인한다. plan은 어떤 resource가 생성, 수정, 삭제될지 미리 보여준다. apply는 실제 cloud 환경에 변경을 적용한다.
운영에서는 apply 전에 plan을 확인하는 습관이 중요하다.
Variables
반복되는 값이나 환경별로 달라지는 값은 variable로 분리할 수 있다.
variable "region" {
type = string
default = "us-east-1"
}
환경별로 dev.tfvars, prod.tfvars를 나누면 같은 module을 다른 환경에 재사용하기 좋다.
Launch configuration 예시
예전 AWS Auto Scaling 구성에서는 launch configuration을 사용했다.
resource "aws_launch_configuration" "web_lc" {
image_id = var.ami_id
instance_type = "t3.micro"
lifecycle {
create_before_destroy = true
}
}
요즘은 launch template을 더 많이 쓰지만, 개념은 비슷하다. Auto Scaling Group이 instance를 만들 때 사용할 기본 설정을 코드로 선언하는 것이다.
Terraform을 쓸 때 주의할 점
Terraform은 편하지만 위험할 수도 있다.
- state file을 안전하게 관리해야 한다.
- secret을
.tf파일에 직접 쓰면 안 된다. plan없이apply하는 습관은 위험하다.- production과 dev state는 분리하는 것이 좋다.
- 수동으로 cloud console에서 바꾼 내용은 drift가 될 수 있다.
정리
Terraform 기본은 다음 키워드로 정리할 수 있다.
- Provider: AWS 같은 외부 service와 연결한다.
- Resource: 생성하고 관리할 cloud object다.
- HCL: Terraform 설정 언어다.
- init: 작업 directory 초기화
- validate: 설정 검증
- plan: 변경 예정 사항 확인
- apply: 실제 적용
- state: Terraform이 현재 resource 상태를 추적하는 파일
Terraform은 단순 자동화 도구라기보다 infrastructure 변경을 코드 리뷰 가능한 형태로 만드는 도구다.