back

s3 native locking

개요

Terraform 1.10.0 버전부터는 백엔드 저장소로 DynamoDB 없이 S3 버킷만 사용해서 리소스 상태 파일 .tfstate의 Lock을 관리할 수 있습니다.

Architecture for S3 Native State Locking

이 기능이 출시되기 전에는 상태파일의 잠금 설정을 위해 DynamoDB 테이블을 구성하고 접근해야 했지만 이제는 완전히 불필요해졌습니다. DynamoDB가 완전히 삭제되므로 인프라 운영 오버헤드를 많이 줄일 수 있고 더 직관적입니다.

Release note for terraform 1.10.0

기존에 DynamoDB에서 Lock 파일을 관리하던 테라폼 코드를 S3에서 Lock 파일을 관리하도록 구성을 변경하는 방법을 알아봅니다.

 

환경

 

주의사항

terraform 버전 제약조건

S3 Native State Locking 기능은 Terraform v1.10.0 버전부터 사용할 수 있습니다. 이전 버전의 Terraform CLI를 사용하는 경우 S3 Native State Locking 기능을 사용할 수 없으므로 주의해야 합니다.

 

설정 방법

tfenv 명령어가 설치되어 있지 않은 경우 패키지 관리자인 brew를 사용해서 설치합니다.

which tfenv || brew install tfenv

 

tfenv에서 현재 사용중인 Terraform 버전을 조회합니다.

tfenv list
* 1.6.0 (set by /Users/younsung.lee/.terraform-version)
  1.3.2

 

tfenv를 사용해서 다운로드 가능한 terraform 버전 전체 목록을 조회할 수 있습니다.

tfenv list-remote

 

Terraform v1.10.4를 다운로드 받고 로컬 환경에 세팅합니다.

tfenv install 1.10.4
tfenv use 1.10.4
No installed versions of terraform matched '1.10.4:^1.10.4$'. Trying to install a matching version since TFENV_AUTO_INSTALL=true
Installing Terraform v1.10.4
Downloading release tarball from https://releases.hashicorp.com/terraform/1.10.4/terraform_1.10.4_darwin_arm64.zip
######################################################################################################################## 100.0%
Downloading SHA hash file from https://releases.hashicorp.com/terraform/1.10.4/terraform_1.10.4_SHA256SUMS
Not instructed to use Local PGP (/opt/homebrew/Cellar/tfenv/3.0.0/use-{gpgv,gnupg}) & No keybase install found, skipping OpenPGP signature verification
Archive:  /var/folders/6c/wglxkxkd5vqgn319s185kwjr0000gn/T/tfenv_download.XXXXXX.rcPvvZaFbA/terraform_1.10.4_darwin_arm64.zip
  inflating: /opt/homebrew/Cellar/tfenv/3.0.0/versions/1.10.4/LICENSE.txt
  inflating: /opt/homebrew/Cellar/tfenv/3.0.0/versions/1.10.4/terraform
Installation of terraform v1.10.4 successful. To make this your default version, run 'tfenv use 1.10.4'
Switching default version to v1.10.4
Default version file overridden by /Users/younsung.lee/.terraform-version, changing the default version has no effect
Default version (when not overridden by .terraform-version or TFENV_TERRAFORM_VERSION) is now: 1.10.4

 

terraform version 명령어를 통해 현재 사용중인 Terraform 버전을 조회합니다.

terraform version
Terraform v1.10.4
on darwin_arm64
+ provider registry.terraform.io/hashicorp/aws v5.84.0
+ provider registry.terraform.io/hashicorp/cloudinit v2.3.5
+ provider registry.terraform.io/hashicorp/kubernetes v2.35.1
+ provider registry.terraform.io/hashicorp/null v3.2.3
+ provider registry.terraform.io/hashicorp/time v0.12.1
+ provider registry.terraform.io/hashicorp/tls v4.0.6

v1.10.4 버전을 사용하고 있는 것을 확인할 수 있습니다.

 

backend.tf 파일에서 dynamodb_table 설정을 삭제하고 이를 대체하기 위해 backend 설정에 use_lockfile 값을 추가합니다. use_lockfile의 기본값은 false이므로 명시적으로 true로 설정해야 합니다.

주의사항: use_lockfile 옵션은 2025년 1월 22일 기준으로 실험 단계(Experimental)이므로 추후 큰 변경사항이 있을 수 있습니다.

# backend.tf
terraform {
  backend "s3" {
    encrypt = true
    region  = "ap-northeast-2"
    acl     = "bucket-owner-full-control"
    bucket  = "<REDACTED-BUCKET-NAME>"
    key     = "dev/ap-northeast-2/eks/<REDACTED-CLUSTER-NAME>/terraform.tfstate"

    # S3 state lock feature is only available in Terraform CLI version 1.10.0 and above.
    use_lockfile = true
  }
}

테라폼의 use_lockfile을 사용하기 위해 S3 버킷에 객체 잠금(Object Lock) 기능을 활성화할 필요는 없습니다. 이 새로운 기능은 상태 파일과 같은 이름을 사용하여 만든 파일(예: terraform.tfstate.tflock)에 의존하여 해당 테라폼 리소스가 잠겨 있는지 확인합니다. 따라서 Amazon S3의 최근 도입된 조건부 쓰기 기능(Conditional Writes)을 사용하여 잠금 메커니즘을 구현합니다.

 

backend 설정이 변경되었기 때문에 재설정 옵션인 -reconfigure 옵션을 추가하여 초기화합니다.

terraform init -reconfigure
terraform plan

 

terraform apply를 실행해 인프라를 반영해봅니다.

terraform apply

 

Plan: 0 to add, 3 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:

 

Enter a value: 메세지가 출력되고 작업이 진행되기 전에 해당 리소스의 backend 경로의 상태 파일을 조회해봅니다.

aws s3 ls s3://<REDACTED-BUCKET-NAME>/dev/ap-northeast-2/eks/<REDACTED-CLUSTER-NAME>/

 

2024-10-22 12:06:19          0
2025-01-13 17:49:35     364547 terraform.tfstate
2025-01-22 15:39:27        258 terraform.tfstate.tflock

S3 내부에 terraform.tfstate.tflock 파일이 새로 생성된 걸 확인할 수 있습니다.

 

작업이 완료된 이후에는 상태파일의 잠금(Lock)이 해제되고 Lock 파일이 버킷 내부에서 자동으로 삭제됩니다.

aws s3 ls s3://<REDACTED-BUCKET-NAME>/dev/ap-northeast-2/eks/<REDACTED-CLUSTER-NAME>/
2024-10-22 12:06:19          0
2025-01-22 15:46:04     364882 terraform.tfstate

terraform.tfstate.tflock 파일이 버킷 내부에서 자동으로 삭제된 것을 확인할 수 있습니다.

 

관련자료

Terraform:

AWS: