Terraformを本格的に使っているとProviderに手を入れたくなることがある.久しぶりに,手を入れてセルフビルドしたProviderを使う必要に迫られたのだが,ローカルにあるProviderを直接使う方法を完全に失念していた.最近,TerraformからOpenTofuに移行したこともあり,折角なのでOpenTofuでセルフビルドしたProviderを使う方法を調査した.
Terraformを使っているとProviderを修正したくなることが多々ある.事実,terraform-provider-awsなどは,割と自社でカスタマイズしたバイナリを使っている企業も多いのではないだろうか.
私は久しくAWSの構成を大きく変更するような作業をしていなかったのだが,久しぶりに大規模な構成の変更を計画したことからTerraformと向き合うことになった.
さて,新たにIPv6を基本としたVPCを展開するため,セグメントを設計し,HCLを書いていざapplyしようとしたところ,次のようなエラーに出くわした.
$ tofu plan
╷
│ Error: expected "ipv6_cidr_block" to contain a network Value with between 56 and 56
│
[...]
どうやら,56ビットより大きなCIDR値は使えないようだ.
いや,そんなことはない.事前にAWSコンソールを使用して想定構成の簡単なテストしており/60のIPv6セグメントが展開できたことを確認している.
つまり,terraform-provider-awsがこの新しい値に対応していないのだろう.
修正も簡単そうだし,久しぶりにセルフビルドしたterraform-provider-awsを使おうとしたところ,久しぶ りすぎて開発中のProviderをRerraformで試す方法を完全に失念してしまっていた.さらに,現在はTerraformではなくOpenTofuを使っているので,改めてOpenTofuで自前でビルドしたローカルにしかないプロバイダを使用する方法について確認し,備忘録として残すことにした.
さて,TerraformはGoで書かれているので,Providerも基本的にはGoで書くことが要請されている.
最近のGoはモジュールシステムが整備されており,go.modがあればGOPATHにソースコードを置かなくても,プロジェクトトップでgo build
, go install
ができるので非常に楽になった.
GitHubからコードをクローンしてgo install
を実行すれば,バイナリが$GOPATH/bin
に配備される.
$ git clone https://github.com/hashicorp/terraform-provider-aws
$ cd terraform-provider-aws
$ go install
[...]
$ ls $GOHOME/bin
[snip] terraform-provider-aws [snip]
Terraform/OpenTofuでセルフビルドしたProviderを使う方法はいくつか存在する.
このあたりの詳細はCLI Configuration Fileに関するドキュメントに記載が有る.
私は現在OpenTofuを使用しているので,ここではOpenTofuのドキュメントを参照していく.
どちらのドキュメントにもProviderのインストールに関する項目があり,それを読むことでプロバイダの解決がどのように行われ,それをどのように制御できるかが書かれているのだが,その中にProvider開発者向けの開発用オーバーライドに関する解説がある.
チームや社内に展開する前に,まずは当然自分で試す必要が有るので,今の私にとって必要かつ妥当な手段はこれだろう.
オーバーライドはCLI Configuration File
に定義する必要がある.
これはドキュメントに有る通り,Windows以外では以下のパスに有ることが期待される.
~/.tofurc
$XDG_CONFIG_HOME/opentofu/tofurc
~/.terraformrc
が存在する場合,後方互換性のために参照されるが,~/.tofurc
または$XDG_CONFIG_HOME/opentofu
が存在する場合は無視される.
これらのファイルはデフォルトでは作られないので,自分で配備する必要がある.
私はXDG_CONFIG_HOMEであるところの
~/.config`に置くことにした.
$ mkdir ~/.config/opentofu
$ touch ~/.config/opentofu/tofurc
一つ注意が必要なのは,環境変数XDG_CONFIG_HOMEが明示的に定義されていないと,この設定ファイルをOpenTofuは利用しないことである.
XDG Base Directory Specificationでは,この環境変数が設定されていない場合,デフォルト値である$HOME/.config
を使用する要請があるので,意識的にこの環境変数を設定してこなったのだが,OpenTofuはこのデフォルト値を考慮してくれないようなので,明示的に設定したところ,期待通りに動くことが確認できた.
最終的に,私は$XDG_CONFIG_HOME/opentofu/tofurc
を以下のように設定した.
cat $XDG_CONFIG_HOME/opentofu/tofurc
provider_installation {
dev_overrides {
"hashicorp/aws" = "/home/<user>/Go/bin"
}
direct {}
}
これによって,hashicorp/aws
Probiderのバージョンとチェックサムの検証を無効化するとともに,当該Providerを私の$GOHOME/bin
から検出させ,それ以外のProviderは通常通りレジストリを検索してくるようになる.
この状態でtofu plan
コマンドを実行すると以下のような警告が表示されようになる.
$ tofu plan
╷
│ Warning: Provider development overrides are in effect
│
│ The following provider development overrides are set in the CLI configuration:
│ - hashicorp/aws in /home/<user>/Go/bin
│
│ The behavior may therefore not match any released version of the provider and applying changes may cause the state to become incompatible with published releases.
╵
[...]
無事オーバーライドに成功し,セルフビルドしたProviderを使うことに成功した.