오늘 알게 된 건데, 이거 모르는 분 꽤 많더라. Terraform 1.10부터 S3 backend에 native state locking이 들어왔다. 그동안 DynamoDB 테이블 하나 따로 만들어서 lock 걸던 그거, 이제 안 해도 된다.
우리 팀도 스테이지/프로덕션 합쳐서 DynamoDB lock 테이블 5개를 굴리고 있었는데, 최근에 신규 모듈 정리하면서 이걸 다 걷어냈다. 후기 짧게 남긴다.
뭐가 달라졌나
기존에는 backend "s3" 블록에 dynamodb_table을 반드시 지정해야 동시성 제어가 됐다. 1.10부터는 use_lockfile = true 한 줄이면 끝. S3 객체 자체에 conditional write로 lock 파일을 만들어 거는 방식이다.
terraform {
backend "s3" {
bucket = "mycompany-tfstate-prod"
key = "services/api-gateway/terraform.tfstate"
region = "ap-northeast-2"
encrypt = true
use_lockfile = true
}
}
이전 설정과 비교하면 이렇다.
# Before (1.9 이하)
backend "s3" {
bucket = "mycompany-tfstate-prod"
key = "services/api-gateway/terraform.tfstate"
region = "ap-northeast-2"
encrypt = true
dynamodb_table = "tf-lock-prod" # 이거 만들고 IAM도 따로 줘야 했다
}
DynamoDB 테이블 프로비저닝, IAM 정책 dynamodb:GetItem/PutItem/DeleteItem 추가, 비용 추적… 이 체인이 그냥 사라진다. 솔직히 속 시원하다.
마이그레이션할 때 주의할 점
그냥 use_lockfile = true 추가하고 terraform init -migrate-state 때리면 되는데, 한 가지 걸렸던 게 있다. 이미 DynamoDB로 lock 걸린 상태에서 작업 중인 브랜치가 있으면 충돌 난다. 당연한 얘기 같지만 팀 전체 합의 없이 바꾸면 누군가 옛날 바이너리로 apply 돌리다가 꼬인다.
그래서 우리는 이렇게 했다.
- Terraform 버전을 1.10 이상으로 조직 전체에서 고정 (tfenv / tfswitch)
- CI 파이프라인의 Terraform 이미지 먼저 업데이트
- 개발자 로컬 환경 공지 후 1주일 유예
- 그 다음 backend 설정 변경 PR
dynamodb_table 속성은 1.11에서 deprecated 경고가 뜨고, 향후 제거 예정이라고 하니 미리 떼는 게 낫다.
그래서 DynamoDB 테이블은 언제 지우나
자동으로 안 지워진다. state 마이그레이션이 끝났어도 테이블은 그대로 남아 있으니, 모든 워크스페이스에서 use_lockfile로 전환된 걸 확인한 뒤에 수동으로 정리해야 한다. 우리는 일단 한 달 정도 묵혀놓고 지울 계획이다. 혹시 롤백해야 할 일이 생길까 봐.
---
이거 말고도 1.10에 ephemeral values가 들어왔는데, 그건 다음 글에서 따로 다뤄보려고 한다. secret 처리 방식이 꽤 달라져서 쓸 말이 많다.
'IaC' 카테고리의 다른 글
| Terraform vs OpenTofu, 2년 써보고 내리는 조심스러운 결론 (0) | 2026.04.25 |
|---|