Terraform Plugin Framework で Custom Provider を作ってみました。 チュートリアルを進めてハマったところをメモに残します。
※雑記です。不正確な箇所があるかもしれません。ご容赦ください
SDK と Framework
SDK と Framework がありますが Framework が推奨されてます。
Terraform Plugin SDK
Terraform Plugin Framework
- hashicorp/terraform-plugin-framework
- hashicorp/terraform-provider-scaffolding-framework (クイックスタート)
- ドキュメント
- チュートリアル
私は Framework のチュートリアルを進めました。
クイックスタートも公開されておりスムーズに実装できます。
hashicorp/local などシンプルな Provider もあるので、そのソースコードも参考になると思います。
以降、Provider を作るにあたってハマったエラーを残します。
Invalid provider registry host というエラー
Provider を作成し終えたので使ってみようとした時でした。
まず依存に入れて、、
terraform { required_providers { sample = { source = "example.com/me/sample" } } }
Provider はローカルにしか無いので dev_overrides を設定し、、
provider_installation { dev_overrides { "example.com/me/sample" = "/Users/me/go/1.20.4/bin" } direct {} }
この状態で terraform init
を実行するとエラーになりました。
$ terraform init ╷ │ Warning: Provider development overrides are in effect │ │ The following provider development overrides are set in the CLI configuration: │ - example.com/me/sample in /Users/me/go/1.20.4/bin │ │ Skip terraform init when using provider development overrides. It is not necessary and may │ error unexpectedly. ╵ │ Error: Invalid provider registry host │ │ The host "example.com" given in in provider source address "example.com/me/sample" does │ not offer a Terraform provider registry. ╵
「example.com は Terraform Provider Registry ではない」と言われました。
... ええ、正しいです。
まだ Publish してないので適当なURLを入れたのですが、エラーになってしまいました。
解決方法
そもそも dev_overrides
している時は terraform init
を実行する必要がないようです。
Warning メッセージにあります。
Skip terraform init when using provider development overrides. It is not necessary and may error unexpectedly.
あるいは terraform init
で -plugin-dir
を指定する手もあります。
作成した Provider のバイナリを置いて -plugin-dir
を付けると、エラーメッセージが消えます。
詳しくは plugin-dir で調べてみてください。
Failed to load plugin schemas というエラー
続いて terraform plan を実行するとエラーが発生しました。
$ terraform plan Error: Failed to load plugin schemas │ │ Error while loading schemas for plugin components: Failed to obtain provider schema: Could not │ load the schema for provider example.com/me/sample: failed to instantiate provider │ "example.com/me/sample" to obtain schema: could not find executable file starting with │ terraform-provider-sample..
terraform-provider-<name>
という名前のファイルが見つからないと言われてます。
解決方法
terraform plan
で Provider のバイナリを探すらしく、名前のフォーマットは terraform-provider-<name>
である必要があるそうです。
Writing Custom Terraform Providers より。
The output name (-o) is very important. Terraform searches for plugins in the format of:
terraform-<TYPE>-<NAME>
In the case above, the plugin is of type "provider" and of name "example".
go build -o でも良いですが、
Git のリポジトリ名を terraform-provider-<name>
にするのが自然かと思います。