terraform init이 Registry와 provider mirror를 오가면 .terraform.lock.hcl이 흔들리고 큐가 막힙니다. 평가 임계·환경 변수·명령·비교 매트릭스·FAQ로 한 페이지에 모았습니다. 링크(로그인 불필요): 홈, 블로그 목록, sccache·ccache 매트릭스.
왜 원격 Mac에서 Terraform 풀이 자주 깨지나
- 공용 플러그인 캐시:
TF_PLUGIN_CACHE_DIR공유 시 권한·부분 쓰기 경합. - 국경 지연·429: Registry 직통 + 무한 대기는 러너 고갈.
- 락 드리프트: 플랫폼·Terraform 패치 불일치 시
providers lock결과 상이.
평가 차원과 임계값
공유 Apple Silicon 러너 기준 출발점입니다. p95 측정 후 팀만 조정하세요. 레지스트리 직통은 HashiCorp 공식 엔드포인트와 사내 프록시의 DNS·TLS 체인이 다르면 동일 버전이라도 핸드셰이크 시간이 갈립니다. 미러를 쓸 때는 include에 조직이 실제로 쓰는 네임스페이스만 넣어 불필요한 폴백을 줄입니다.
| 차원 | 시작값 | 지표 | 게이트 |
|---|---|---|---|
| Registry 타임아웃 | TF_REGISTRY_CLIENT_TIMEOUT 30s→60s | init p95 | 초과 시 mirror |
| init 재시도 | 2·4·8초, 최대 3~4회 | 5xx·리셋 | 뮤텍스 |
| 캐시 디스크 | 82·87·92% 경고·유예·스윕 | df | 92%↑ 잡 보류 |
| 동시 init | 잡 수 ≤ 물리 코어 | APFS 대기 | 세마포 |
복붙 명령·환경 변수 목록
잡 시작 시 한 번에 export하면 셸 하위 프로세스까지 동일하게 물려갑니다. GitLab·GitHub Actions 모두에서 CI_PROJECT_DIR 또는 GITHUB_WORKSPACE를 우선 쓰고 없으면 $PWD로 떨어지게 두면 경로 표기가 짧아집니다.
export TF_CLI_CONFIG_FILE="${CI_PROJECT_DIR:-$PWD}/.terraformrc"
export TF_PLUGIN_CACHE_DIR="${CI_PROJECT_DIR:-$PWD}/.terraform-plugin-cache"
export TF_REGISTRY_CLIENT_TIMEOUT="${TF_REGISTRY_CLIENT_TIMEOUT:-30s}"
export TF_INPUT=0
export TF_IN_AUTOMATION=1
mkdir -p "$TF_PLUGIN_CACHE_DIR"
cat > "$TF_CLI_CONFIG_FILE" <<EOF
plugin_cache_dir = "$TF_PLUGIN_CACHE_DIR"
disable_checkpoint = true
provider_installation {
network_mirror {
url = "https://terraform-mirror.example.com/providers/"
include = ["registry.terraform.io/hashicorp/*"]
}
direct {
exclude = ["registry.terraform.io/hashicorp/*"]
}
}
EOF
terraform providers lock -platform=darwin_arm64 -platform=linux_amd64 terraform init -input=false -no-color -upgrade n=0; until terraform init -input=false -no-color; do n=$((n+1)); [ "$n" -le 4 ] || exit 1; sleep $((2**n)) done terraform validate -no-color
비교표·의사결정 매트릭스
| 경로 | 장점 | 주의 | 언제 |
|---|---|---|---|
direct | 설정 최소 | 지연·감사 | 소규모 |
network_mirror | egress 통제 | 스키마·인증서 | 사내 허브 |
filesystem_mirror | 에어갭 | zip 동기화 | 규제 |
원격 Mac CI 게이트 다섯 단계
플랜 단계는 PR과 메인을 나눠도 되지만 providers lock을 갱신하는 주체는 보통 메인 전용 봇 한 대로 고정하는 편이 머지 큐에서 덜 싸웁니다.
- Terraform CLI 버전을 이미지 태그로 고정.
TF_CLI_CONFIG_FILE·TF_PLUGIN_CACHE_DIR잡별 경로..terraform.lock.hcldiff +terraform fmt -check.validate와plan단계 분리.- 실패 로그에 호스트·HTTP코드·경과시간 기록.
인용 포인트:
terraform providers schema -json스냅샷.TF_LOG=INFO는 재현 구간만.providers lock -fs-mirror=./mirror오프라인 번들.
FAQ
Q. plugin_cache_dir vs TF_PLUGIN_CACHE_DIR?
A. 같은 절대경로로 통일하거나 한쪽만.
Q. mirror+direct 동시?
A. 블록 순서·include exclude로 우선순위 명시, 패턴 중복 금지.
Q. Mac CI만 lock 변동?
A. Terraform 빌드·플랫폼 목록·미러 URL을 노트북과 동일화.
요약
Registry·mirror·캐시·락·재시도를 한 문서로 묶어야 재현됩니다. 전용 노드는 MacPull 원격 Mac에서 선택하세요.