이 문서에서는 Azure Terraform을 사용할 때 발생하는 일반적인 문제 및 가능한 해결 방법에 대해 설명합니다.
Terraform과 관련된 문제가 발생하는 경우 HashiCorp의 커뮤니티 지원 채널 중 하나를 사용합니다.
HashiCorp Terraform 특정 지원 채널
- 질문, 사용 사례 및 유용한 패턴: HashiCorp 커뮤니티 포털의 Terraform 섹션
- 질문, 사용 사례 및 유용한 패턴: HashiCorp 커뮤니티 포털의 Terraform 섹션
공급자 등록 상태를 나열할 수 없음
오류 메시지:
오류: 공급자 등록 상태를 나열할 수 없습니다. 이 오류는 잘못된 자격 증명 또는 서비스 주체가 Resource Manager API를 사용할 수 있는 권한이 없기 때문에 발생할 수 있습니다. Azure 오류: 리소스입니다. ProvidersClient#List: 요청에 응답하지 못했습니다. StatusCode=403 -- 원래 오류: autorest/azure: 서비스에서 오류를 반환했습니다. Status=403 Code="AuthorizationFailed" Message="개체 ID가 '00000000-0000-0000-0000-000000000000'인 클라이언트 '00000000-0000-0000-0000-000000000000'에는 범위 '/subscriptions/00000000-0000-0000-0000-000000000000'에 대해 작업 'Microsoft.Resources/subscriptions/providers/read'을(를) 수행할 권한이 없거나, 범위가 잘못되었습니다. 액세스 권한이 최근에 부여된 경우 자격 증명을 새로 고치세요."
배경: Cloud Shell Terraform 명령을 실행하고 특정 Terraform/Azure 환경 변수를 정의하는 경우 충돌이 발생할 수 있습니다. 다음 표에서는 환경 변수와 환경 변수가 나타내는 Azure 값을 나열합니다.
| 환경 변수 | Azure 값 |
|---|---|
| ARM_SUBSCRIPTION_ID | Azure 구독 ID |
| ARM_TENANT_ID | Microsoft 계정 테넌트 ID |
| ARM_CLIENT_ID | Azure 서비스 주체 앱 ID |
| ARM_CLIENT_SECRET | Azure 서비스 주체 암호 |
원인: 이 문서 작성 시점 기준으로 Cloud Shell에서 실행되는 Terraform 스크립트는 현재 Azure 구독의 값을 사용하여 ARM_SUBSCRIPTION_ID 및 ARM_TENANT_ID 환경 변수를 덮어씁니다. 따라서 환경 변수가 참조하는 서비스 주체에 현재 Azure 구독에 대한 권한이 없으면 Terraform 작업이 실패합니다.
상태 잠금을 획득하는 동안 오류가 발생했습니다.
오류 메시지:
오류: 상태 잠금을 획득하는 동안 오류가 발생했습니다. 오류 메시지: 2개 오류가 발생했습니다.
* 상태 Blob이 이미 잠겨 있습니다.
* Blob 메타데이터 "terraformlockid"가 비어 있음
Terraform은 여러 사용자가 동시에 작성하지 않도록 상태를 보호하기 위해 상태 잠금을 획득합니다. 위의 문제를 해결하고 다시 시도하세요. 대부분의 명령에서는 "-lock=false" 플래그를 사용하여 잠금을 사용하지 않도록 설정할 수 있지만 권장되지는 않습니다.
배경: Terraform 상태 파일에 대해 Terraform 명령을 실행하고 이 오류가 표시되는 유일한 메시지인 경우 다음 원인이 적용될 수 있습니다. 이 오류는 로컬 및 원격 상태 파일에 적용됩니다.
원인: 이 오류에는 두 가지 잠재적인 원인이 있습니다. 첫 번째 원인은 Terraform 명령이 이미 상태 파일을 대상으로 실행 중이어서, 문제 발생을 방지하기 위해 해당 파일에 잠금을 걸었기 때문입니다. 두 번째 잠재적인 원인은 명령이 실행 중일 때 상태 파일과 CLI 간에 연결 중단이 발생했기 때문에 발생합니다. 이 중단은 원격 상태 파일을 사용할 때 가장 일반적으로 발생합니다.
해결 방법: 먼저 상태 파일에 대한 명령을 아직 실행하지 않았는지 확인합니다. 로컬 상태 파일로 작업하는 경우 명령을 실행하는 터미널이 있는지 확인합니다. 또는 배포 파이프라인을 확인하여 실행 중인 항목이 상태 파일을 사용하고 있는지 확인합니다. 이 조건이 문제를 해결하지 못하면 두 번째 원인으로 인해 오류가 트리거되었을 수 있습니다. Azure Storage 계정 컨테이너에 저장된 원격 상태 파일의 경우 파일을 찾고 임대 중단 단추를 사용할 수 있습니다.
다른 백 엔드를 사용하여 상태 파일을 저장하는 경우 권장 사항은 HashiCorp 설명서를 참조하세요.
VPN 오류
VPN 오류 해결에 대한 자세한 내용은 하이브리드 VPN 연결 문제 해결 문서를 참조하세요.
Terraform은 스토리지 계정을 삭제하고 다시 만들 계획입니다.
Terraform은 Terraform 외부에서 Azure Storage 계정이 변경된 후 해당 계정을 삭제한 다음 다시 생성하도록 계획할 수 있습니다. 이 동작은 비 영역 집합(LRS, GRS, RA-GRS)과 영역 집합(ZRS, GZRS, RA-GZRS) 간의 경계를 교차하는 지원되는 Azure Storage 계정 중복 변환 account_replication_type 중에 발생할 수 있습니다.
계획을 적용하기 전에 제안된 변경 내용을 검토하고 Terraform에서 스토리지 계정 교체가 필요한 이유를 확인합니다. 스토리지 계정을 다시 만들면 애플리케이션 가동 중지 시간 또는 데이터 손실이 발생할 수 있습니다.
이 위험을 줄이려면 다음을 수행합니다.
- 스토리지 계정을 관리하는 배포의 자동 승인을 비활성화하고 모든
terraform plan를 검토하세요. - 스토리지 계정 리소스의
prevent_destroy = true블록에서lifecycle를 구성합니다. - 변환을 시작하기 전에
ignore_changes에account_replication_type를 일시적으로 추가합니다. - 변환 후에 실행
terraform apply -refresh-only하여 Terraform 상태를 업데이트한 다음, 배포된 스토리지 계정과 일치하도록 Terraform 구성을 업데이트합니다. -
ignore_changes를 실행하여 예기치 않은 변경 사항이 보고되지 않는지 확인한 후에만terraform plan를 제거하세요.
자세한 변환 지침은 상태 저장 Azure 리소스에 대한 Terraform 드리프트 방지를 참조하세요.