TL;DR
Terraformがプロバイダーレジストリに接続できないか、バージョン制約に合うバージョンが見つからない状態です。まずterraform init -upgradeを実行してネットワーク接続を確認しましょう。企業のプロキシがレジストリへのHTTPS通信をブロックしているケースが9割を占めます。カスタムまたはプライベートレジストリを使用している場合は、required_providersのソースアドレスを再確認してください。
エラーの全文
Error: Failed to query available provider packages
│ Could not retrieve the list of available versions for provider
│ hashicorp/aws: could not connect to registry.terraform.io: Failed to
│ request discovery document: Get
│ "https://registry.terraform.io/.well-known/terraform.json": dial tcp:
│ lookup registry.terraform.io: no such host
またはバージョン制約に関するエラー:
Error: Failed to query available provider packages
│ Could not retrieve the list of available versions for provider
│ hashicorp/azurerm: no available releases match the given constraints
│ >= 3.0.0, 3.114
原因
- インターネット接続なし — Terraformが
registry.terraform.ioに到達できない - 企業プロキシ/ファイアウォール — レジストリへのHTTPS通信がブロックされている
- バージョン制約の競合 —
required_providersブロックに矛盾するバージョンや存在しないバージョンが指定されている - プロバイダーソースアドレスの誤り — タイポ、またはTerraform 0.12時代の暗黙的なプロバイダー参照が残っている
- ロックファイルが古い —
.terraform.lock.hclが存在しないバージョンや変更されたハッシュを参照している - プライベート/カスタムレジストリに到達不可 — 内部レジストリのURLが間違っているか、認証情報が不足している
修正1:レジストリへのネットワーク接続を確認する
まずここから始めます。設定を変更する前に、マシンがレジストリに実際にアクセスできるか確認してください:
curl -I https://registry.terraform.io/.well-known/terraform.json
タイムアウトや接続エラーが出る場合はネットワークの問題です。Terraformの設定の問題ではありません。
企業プロキシ環境の場合
terraform initを実行する前にプロキシの環境変数を設定します:
# Linux/macOS
export HTTPS_PROXY=https://your-proxy.company.com:8080
export HTTP_PROXY=http://your-proxy.company.com:8080
export NO_PROXY="localhost,127.0.0.1"
terraform init
# Windows (PowerShell)
$env:HTTPS_PROXY = "https://your-proxy.company.com:8080"
$env:HTTP_PROXY = "http://your-proxy.company.com:8080"
terraform init
修正2:terraform init -upgrade を実行する
ロックファイルが古い、またはキャッシュされたメタデータが古い場合は、強制的に全体を再取得します:
terraform init -upgrade
プロバイダーのメタデータを再取得し、.terraform.lock.hclに新しいチェックサムを書き込みます。ステートファイルには影響しません。
修正3:required_providers ブロックを確認する
versions.tf(またはterraformブロックを記述しているファイル)を開き、ソースアドレスとバージョン制約を確認します:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0" # このバージョンがレジストリに存在することを確認
}
}
required_version = ">= 1.3.0"
}
よくある間違い:
source = "hashicorp/aws"の代わりにsource = "aws"を使用している — Terraform 0.12では動作しましたが、0.13以降では機能しません- 存在しないパッチバージョン(例:
= 3.114.0)に固定している — 代わりに~> 3.114を使用してください - モジュール間でバージョン制約が競合している — ルートモジュールが
>= 4.0を要求し、子モジュールが< 4.0を要求している場合など
プロバイダーの実際に存在するバージョンを確認するには:
curl -s https://registry.terraform.io/v1/providers/hashicorp/aws/versions | python3 -m json.tool | grep '"version"' | head -20
修正4:ロックファイルを削除して再初期化する
ロックファイルが破損している、またはハッシュが一致しない場合は、削除してゼロから始めます:
rm .terraform.lock.hcl
rm -rf .terraform/
terraform init
Terraformがプロバイダーをゼロから解決します。完了後、再生成されたロックファイルをコミットしてください。
修正5:ファイルシステムミラーを使用する(エアギャップ/オフライン環境)
対象マシンにインターネット接続がない場合、CIランナーやエアギャップサーバーでよく直面する問題です。解決策はローカルのプロバイダーミラーを使用することです。
インターネットに接続できるマシンでプロバイダーをダウンロードします:
terraform providers mirror /tmp/tf-mirror
/tmp/tf-mirrorディレクトリを対象環境に転送します。次に~/.terraformrc(Linux/macOS)または%APPDATA%/terraform.rc(Windows)でTerraformにミラーを使用するよう設定します:
provider_installation {
filesystem_mirror {
path = "/opt/terraform-providers"
include = ["registry.terraform.io/*/*"]
}
direct {
exclude = ["registry.terraform.io/*/*"]
}
}
修正6:プライベートレジストリの認証情報
プライベートレジストリには認証情報が必要です。~/.terraformrcに追加します:
credentials "app.terraform.io" {
token = "your-token-here"
}
またはTerraform Cloud用の環境変数を使用します:
export TF_TOKEN_app_terraform_io="your-token-here"
修正の確認
terraform initが正常に完了すると以下が表示されます:
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure.
プロバイダーが実際にダウンロードされたことを確認します:
ls .terraform/providers/registry.terraform.io/hashicorp/aws/
プロバイダーのバージョンとプラットフォーム名のディレクトリ(例:5.40.0/linux_amd64/)が表示されれば成功です。
クイックリファレンス:どの修正から試すべきか
- DNSエラー/ホストが見つからない → 修正1(ネットワーク/プロキシ)
- ハッシュ不一致/チェックサムエラー → 修正2(
-upgrade)または修正4(ロックファイルの削除) - 制約に一致するリリースが見つからない → 修正3(バージョン制約の確認)
- エアギャップ/インターネット接続なし → 修正5(ファイルシステムミラー)
- プライベートレジストリから401 Unauthorized → 修正6(認証情報)

