문제 상황
Terraform에서 S3 + DynamoDB를 이용한 원격 백엔드(Remote Backend) 구성을 시도하던 중
다음과 같은 오류가 지속적으로 발생했습니다.
Error: Failed to load plugin schemas
Failed to obtain provider schema:
Could not load the schema for provider registry.terraform.io/hashicorp/aws:
failed to instantiate provider "registry.terraform.io/hashicorp/aws" to obtain schema:
timeout while waiting for plugin to start..
Bash
복사
실행 환경
•
실행 명령:
terraform init -backend-config=env/backend.hcl -reconfigure
Bash
복사
•
Terraform 버전: v1.5.7
•
AWS Provider 버전: v6.20.0
•
로컬 환경: macOS (arm64)
원인 분석
S3 Backend에는 State 파일이 존재하지 않았음
•
bootstrap 단계를 통해 S3 버킷(come2us-dev-tfstate) 과
DynamoDB 테이블(come2us-dev-tflock) 은 정상 생성되었지만,
bootstrap 자체는 로컬 state 로만 관리되고 있었음.
즉, S3 버킷은 만들어졌지만 terraform.tfstate 객체는 업로드되지 않은 상태였습니다.
s3://come2us-dev-tfstate/
└── (비어 있음)
Plain Text
복사
Terraform은 init 시 원격 backend와 provider schema를 동기화하려 하지만,
S3에 state가 없으므로 backend schema를 로드할 참조 데이터가 없어 deadlock 상태에 빠지게 됩니다.
로컬에 잔존하던 provider 메타데이터(캐시, lock 파일)
•
main 디렉토리에는 이전 terraform init 시점에 생성된 .terraform/ 폴더와 .terraform.lock.hcl 파일이 남아 있었습니다.
•
이 두 파일에는 과거 provider 버전 해시 및 schema 정보가 저장되어 있으며,
backend 연결 시 Terraform은 이 정보를 우선적으로 참조합니다.
결과적으로 Terraform은
“S3에는 state 없음 + 로컬에는 오래된 provider 메타데이터 존재”
상태에서 backend 초기화를 시도했고, provider schema 로딩 단계에서 충돌 및 timeout 이 발생했습니다.
단계 | 동작 | 상태 |
① bootstrap 실행 | S3, DynamoDB, IAM 리소스 생성 (로컬 state 사용) | |
② main에서 backend 연결 시도 | S3 비어 있음 → backend schema 참조 실패 | |
③ 캐시 및 lock 파일 존재 | 과거 provider schema 참조 시도 | |
④ provider 명시 + 캐시/lock 삭제 | 새 provider 재설치 및 backend 재초기화 |
해결 과정
1. 기존 캐시 및 잠금 파일 제거
이전 init 시 남아 있던 provider binary 및 schema 메타데이터를 삭제했습니다.
rm -rf .terraform/ .terraform.lock.hcl
Bash
복사
2. provider 버전 명시
main.tf에 명시적으로 provider 버전을 6.x 대 범위로 제한하여 지정했습니다.
이 설정은 Terraform이 동일 major 버전 내에서만 최신 provider를 자동으로 설치하도록 보장합니다.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 6.0"
}
}
}
HCL
복사
3. backend 재초기화
정상화된 provider schema 기반으로 backend를 다시 연결했습니다.
terraform init -backend-config=env/backend.hcl -reconfigure
terraform plan
terraform apply
Bash
복사
이후 S3 버킷 내부에 infra/dev/terraform.tfstate 객체가 생성되며 백엔드 초기화가 정상적으로 완료되었습니다.
결과
항목 | 수정 전 | 수정 후 |
provider schema 로딩 | timeout (handshake 실패) | |
backend 연결 | 실패 | |
plan/apply 실행 | 불가능 |
인사이트
•
S3에 버킷만 존재하고 state 파일이 없을 경우, Terraform은 backend schema 초기화 시 timeout이 발생할 수 있다.
•
.terraform/과 .terraform.lock.hcl은 provider binary와 버전 해시 정보를 포함하고 있으므로,
이전 init 결과가 남아 있으면 backend handshake 단계에서 충돌할 수 있다.
•
provider 버전 명시(required_providers)는 Terraform이 명확한 binary를 재설치하도록 유도해 안정적인 init을 보장한다.
•
신규 backend 연결 전에는 이전 캐시를 제거하는 것이 안전하다.:
rm -rf .terraform/ .terraform.lock.hcl
terraform init -backend-config=env/backend.hcl -reconfigure
Bash
복사
