OpenTofuでセルフビルドしたterraform-provider-awsを使う

OpenTofuでセルフビルドしたterraform-provider-awsを使う

Terraformを本格的に使っているとProviderに手を入れたくなることがある.久しぶりに,手を入れてセルフビルドしたProviderを使う必要に迫られたのだが,ローカルにあるProviderを直接使う方法を完全に失念していた.最近,TerraformからOpenTofuに移行したこともあり,折角なのでOpenTofuでセルフビルドしたProviderを使う方法を調査した.

Tags: terraform aws go opentofu
Takafumi Asano · 7 minute read

導入

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-provider-awsのビルド

さて,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]

OpenTofuでローカルにだけ存在するProviderを使用する

Terraform/OpenTofuでセルフビルドしたProviderを使う方法はいくつか存在する.

このあたりの詳細はCLI Configuration Fileに関するドキュメントに記載が有る.

私は現在OpenTofuを使用しているので,ここではOpenTofuのドキュメントを参照していく.

どちらのドキュメントにもProviderのインストールに関する項目があり,それを読むことでプロバイダの解決がどのように行われ,それをどのように制御できるかが書かれているのだが,その中にProvider開発者向けの開発用オーバーライドに関する解説がある.

チームや社内に展開する前に,まずは当然自分で試す必要が有るので,今の私にとって必要かつ妥当な手段はこれだろう.

オーバーライドはCLI Configuration Fileに定義する必要がある.

CLI Configuration File

これはドキュメントに有る通り,Windows以外では以下のパスに有ることが期待される.

  • ~/.tofurc
  • $XDG_CONFIG_HOME/opentofu/tofurc

~/.terraformrcが存在する場合,後方互換性のために参照されるが,~/.tofurcまたは$XDG_CONFIG_HOME/opentofuが存在する場合は無視される.

これらのファイルはデフォルトでは作られないので,自分で配備する必要がある.

私はHOMEにあまり設定ファイルを増やしたくないので,デフォルトのHOMEにあまり設定ファイルを増やしたくないので,デフォルトの`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/awsProbiderのバージョンとチェックサムの検証を無効化するとともに,当該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を使うことに成功した.