본문 바로가기
DevOps/Terraform

local에서 terraform lock 걸기

by Rainbound-IT 2025. 6. 15.
반응형

 

테라폼에서 외부 환경을 사용하지 못할경우 terraform lock 구성하기 어려울수 있다.

그래서 local에 비슷하게 구성하는 방법이 있는데 그중에서 lock 서버를 따로 구성하는 방법을 사용해보기로 했다.

(git을 사용하는방법 등이 있다.)

 

 

Terraform을 로컬에서 실행할 때도,

  • 동일 환경에서 두 명 이상이 동시에 terraform apply 하지 못하도록
  • 간단한 중앙 서버(예: Redis, 파일서버 등)를 이용해 Lock을 걸고 해제하는 구조를 만든다.

⚙️ 구성 아키텍처

┌────────────┐     ┌──────────────┐       ┌────────────┐ 
│ User A     │───▶│ Lock Server  │◀─────│ User B     │
│ Terraform  │     │ (Redis/File) │       │ Terraform  │ 
└────────────┘     └──────────────┘       └────────────┘
      ▲                     ▲                    ▲ 
      │ wrapper             │       wrapper      │ 
      └───── lock.py ◀─────┘─────▶ lock.py ────┘
 

🧩 구성 단계별 상세 설명

✅ 1. Lock Server 준비

옵션 1: Redis 기반 (가장 추천)

  • 설치: 로컬 혹은 사내 개발망에 Redis 설치 (apt install redis-server)
  • 키 관리 방식: SETNX 명령을 활용하여 단일 환경 당 하나의 락 키 사용
 
# 예: prod 환경 락 키
SETNX terraform:lock:prod <username>
 
  • TTL 설정 (예: 1시간): 락이 영구적으로 걸리지 않도록 자동 해제

✅ 2. Wrapper 스크립트 (terraform-lock.py)

Terraform 실행 전후에 락을 체크하고, 해제하는 Python 스크립트를 구성합니다.

🔐 acquire_lock() 예시

import redis, sys, time

r = redis.Redis(host='localhost', port=6379, db=0)
env = sys.argv[1]  # ex: prod

if r.setnx(f"lock:{env}", "locked-by-user"):
    r.expire(f"lock:{env}", 3600)
    print(f"[LOCK] Lock acquired for {env}")
else:
    holder = r.get(f"lock:{env}").decode()
    print(f"[LOCK] Already locked by {holder}")
    sys.exit(1)
 
 
 

🔓 release_lock() 예시

r.delete(f"lock:{env}")
print(f"[LOCK] Lock released for {env}")

✅ 3. Terraform Wrapper Bash Script

#!/bin/bash

ENV=$1

python3 terraform-lock.py $ENV acquire || exit 1

terraform init
terraform plan
terraform apply

python3 terraform-lock.py $ENV release
 
 

terraform.sh prod 로 실행하면 자동으로 락이 걸리고 해제됩니다.


✅ 4. 고급 확장

기능설명

 

기능 설명
TTL 적용 expire로 락 유실 방지
사용자명 저장 락에 사용자명 포함하여 누가 락 걸었는지 명시
로그 남기기 락 획득/해제 시 로그 파일 남기기
pre-commit hook 실수로 terraform 실행하지 않도록 사전 체크
GUI 간단한 Web UI로 현재 락 상태 확인 가능하게 구성 가능
 

✅ 대체 옵션: 파일 서버 기반

  • 중앙 공유 디렉터리(/nfs/terraform-lock/)
  • lock/prod.lock 파일 생성 → 다른 사용자는 존재 여부로 체크
  • flock 시스템 콜을 활용해 락 걸기

📌 단점: 분산 환경에선 NFS 필요, 성능/신뢰성 낮음 → Redis 추천

반응형

댓글