背景
airbyteをterraformで管理するためTerraform Airbyte Providerをしようしていたところterraform applyでエラーが発生した
調査
main.tfの内容
terraform {
required_version = ">= 0.13"
required_providers {
airbyte = {
source = "airbytehq/airbyte"
version = "0.6.1"
}
}
}
provider "airbyte" {
password = "xxxxxxx"
username = "yyyyyyy"
server_url = "http://localhost:8000/api/public/v1"
}
module "bigquery-s3 {
source = "./bigquery-s3
}
エラー内容
out: terraform.tfstate found. Running terraform apply...
out: Initializing the backend...
out: Upgrading modules...
out: - bigquery-s3 in bigquery-s3
out: Initializing provider plugins...
out: - Finding airbytehq/airbyte versions matching "0.6.1"...
out: - Finding latest version of hashicorp/airbyte...
err: ╷
out: - Using previously-installed airbytehq/airbyte v0.6.1
err: │ Error: Failed to query available provider packages
err: │
err: │ Could not retrieve the list of available versions for provider
err: │ hashicorp/airbyte: provider registry registry.terraform.io does not have a
err: │ provider named registry.terraform.io/hashicorp/airbyte
err: │
err: │ Did you intend to use airbytehq/airbyte? If so, you must specify that
err: │ source address in each module which requires that provider. To see which
err: │ modules are currently depending on hashicorp/airbyte, run the following
err: │ command:
err: │ terraform providers
err: ╵
main.tfでは正しくproviderairbytehq/airbyte
を読み込んでくれようとしている
が、moduleではhashicorp/airbyte
と呼ばれるプロバイダーを利用しようと動作する
暗黙的に子moduleでは親と同じproviderを使ってくれるはずなのに
参考: Providers Within Modules – Configuration Language | Terraform | HashiCorp Developer
(別の話になるけど)おそらくproviderのversionが違う場合はterraform init -upgrade
を実行すると解消するはず、しかし今回はprovider名自体が違うため解消できなかった
terraform providers
を実行
mainとmoduleがそれぞれどのproviderを参照しているかを表示してくれる
$ terraform providers
Providers required by configuration:
.
├── provider[registry.terraform.io/airbytehq/airbyte] 0.6.1
└── module.bigquery-s3
└── provider[registry.terraform.io/hashicorp/airbyte]
module.bigquery-s3
配下もprovider[registry.terraform.io/airbytehq/airbyte] 0.6.1
になっているべきだが、やはりズレている
ひとまず解消する方法
main.tfと同じ内容のprovider設定をprovider.tfとして作成
terraform {
required_providers {
airbyte = {
source = "airbytehq/airbyte"
version = "0.6.1"
}
}
}
それをmoduleディレクトリ配下に配置する
└── terraform
├── bigquery-s3
│ ├── connections.tf
│ ├── destinations.tf
│ ├── provider.tf <-- これを追加
│ └── sources.tf
└── main.tf
terraform providersを実行すると
$ terraform providers
Providers required by configuration:
.
├── provider[registry.terraform.io/airbytehq/airbyte] 0.6.1
└── module.bigquery-s3
└── provider[registry.terraform.io/airbytehq/airbyte] 0.6.1
最上階層(main.tf)のproviderとmoduleのproviderが一致した
ただし、同じ内容の設定を各moduleディレクトリに配置するのは気が引けるな…
今のところ他の解決方法は見つかってません
ダメだったパターン
main.tfのmodule読み込みの設定のみで対処しようとしたが、同じエラーが発生した
terraform {
required_providers {
airbyte = {
source = "airbytehq/airbyte"
version = "0.6.1"
}
}
}
provider "airbyte" {
username = "airbyte"
password = "password"
server_url = "http://localhost:8000/api/public/v1"
}
module "example" {
source = "./module"
##### ここを追加したがダメだった Start ####
providers = { <--
airbyte = airbyte
}
#### ここを追加したがダメだった End ####
}
まとめ
この記事でも同じ事象が紹介されていた(お陰で自信が持てました)
Terraformにおいてハマった話(モジュール x GitHubプロバイダー編) – NIFTY engineering
根本解決するにはどうすれば…
このあたりをイジるのかな
Terraform Airbyte Registry No compatible versions of provider registry.terraform.io/airbytehq/airbyte were found. · Issue #103 · CircleCI-Public/terraform-orb
謎は深まるばかりです…