IaC

Terraform S3 backend, 이제 DynamoDB 없이 lock 걸 수 있다

gfrog 2026. 4. 25. 02:11
반응형

오늘 알게 된 건데, 이거 모르는 분 꽤 많더라. 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 돌리다가 꼬인다.

그래서 우리는 이렇게 했다.

  1. Terraform 버전을 1.10 이상으로 조직 전체에서 고정 (tfenv / tfswitch)
  2. CI 파이프라인의 Terraform 이미지 먼저 업데이트
  3. 개발자 로컬 환경 공지 후 1주일 유예
  4. 그 다음 backend 설정 변경 PR

dynamodb_table 속성은 1.11에서 deprecated 경고가 뜨고, 향후 제거 예정이라고 하니 미리 떼는 게 낫다.

그래서 DynamoDB 테이블은 언제 지우나

자동으로 안 지워진다. state 마이그레이션이 끝났어도 테이블은 그대로 남아 있으니, 모든 워크스페이스에서 use_lockfile로 전환된 걸 확인한 뒤에 수동으로 정리해야 한다. 우리는 일단 한 달 정도 묵혀놓고 지울 계획이다. 혹시 롤백해야 할 일이 생길까 봐.

---

이거 말고도 1.10에 ephemeral values가 들어왔는데, 그건 다음 글에서 따로 다뤄보려고 한다. secret 처리 방식이 꽤 달라져서 쓸 말이 많다.

반응형