Terraform을 공부하면서 리소스 상태의 흐름을 이해하고 관리하는 방법의 중요성을 느꼈다. 이번 글에서는 Terraform이 리소스를 어떻게 적용하는지,
.tfstate
는 어떤 역할을 하는지, 그리고 협업을 위한 위한 백엔드 구성까지 실습과 함께 정리해볼 것이다.
우선 Terraform 사용 환경을 aws와 연동하기 위해서는
AdministratorAccess
권한이 있는 IAM 사용자에게서 액세스 키를 생성 후,aws configure
AWS Access Key ID [None or 기존 설정 정보]: <액세스 키>
AWS Secret Access Key [None or 기존 설정 정보]: <시크릿 키>
Default region name [region]: 리전 영문명 # (예 : us-east-1)
Default output format [format]: json
# 설정이 제대로 되었는지 확인
cat ~/.aws/credentials
tf
파일에 AWS에 프로비저닝하고 싶은 리소스 코드을 끝냈다면 이제 아래 명령어를 차례로 입력하면 된다.
terraform init
terraform plan
terraform apply
.tfstate
파일을 업데이트한다.terraform destroy
이는 현재 워크스페이스 내 모든 .tf
파일을 기반으로 실행된다.
여기서 terraform apply
가 어떤 방식으로 동작하는지를 자세히 살펴보겠다.
이는 다음 세 가지를 비교한다.
.tf
파일) -> 원하는 최종 결과.tfstate
) -> 내가 이전에 만든 것의 정보그 후 다음과 같이 판단한다.
.tfstate
에 있는데 실제 API엔 없다 -> 누가 삭제했네? -> 재생성.tfstate
엔 없는데 실제 API에 있다 -> 내가 만든 게 아니네? -> 무시.tf
와 .tfstate
가 다르다 -> 설정 변경 요청이네 -> 업데이트테라폼은 현재 인프라 상태를 .tfstate
에 저장해두고 그걸 기준으로 변경 사항을 계획(plan)하고 실행(apply)한다. 기본적으로 이 파일은 워크스페이스의 ./state/terraform.tfstate
위치에 저장되지만, 기본 위치와 다르게 지정하고 싶은 경우 테라폼의 backend
블록에서 지정할 수 있다.
이는 협업 시 중요한데 동시에 동일한 state에 접근이 발생하면 잠금 파일의 내용이 표기되면서 에러가 발생할 수 있다.
그래서 보통 이를 해결하기 위해 AWS의 경우는 S3를 사용한다. 상태 파일을 S3에 저장하고, 동시에 작업할 수 없도록 DynamoDB로 락을 걸면 상태 파일은 암호화되어 안전하게 보관된다.
plan
/apply
실행LockID
라는 항목을 PutItem
으로 삽입해 잠금을 건다.main.tf
에 backend
블록을 아래와 같이 작성한다.# main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
backend "s3" {
bucket = "tf-backend-bucket-0w0"
key = "study/terraform.tfstate"
region = "ap-northeast-2"
dynamodb_table = "tf-lock-table"
encrypt = true
}
}
terraform init
을 실행하면 백엔드가 S3로 설정된다.간단하게 백엔드 블록 아래에 다음과 같이 프로비저닝할 EC2 리소스 코드를 작성 후, apply
한다.
# EC2
resource "aws_instance" "tf-instance" {
ami = "ami-0077297a838d6761d"
instance_type = "t2.micro"
key_name = "my-keypair"
associate_public_ip_address = true
subnet_id = "subnet-xxxxxx"
private_ip = "172.31.40.10"
tags = {
"Name" = "tf-instance"
}
}
EC2도 잘 프로비저닝되었고, S3에 terraform.tfstate
파일이 잘 생성된 것을 확인할 수 있다.
그럼 이제 락이 잘 걸리는지 실험을 해보자.
태그를 살짝 바꿔주고 terraform apply
입력 후, enter a value
상태에서 스탑한다.
다른 터미널에서 변경 사항을 만든 후 apply
를 실행하자 에러가 발생한다.
이 상태에서 DynamoDB 콘솔 항목을 보면, 이렇게 Info 값이 있는 잠금 레코드가 생성된 것을 확인할 수 있다.
이 레코드는 락이 해제되면 다시 사라진다.
‼️ 주의할점 : 이때 백엔드 리소스 (S3, DynamoDB)는 반드시 테라폼으로 생성한 모든 리소스를 다 destroy
한 뒤, 가장 마지막에 삭제해야 한다.
이상으로 글을 마치겠다!