「terraform-bundle」 Terraformとプロバイダーの実行ファイルのパッケージングツール

今日は使い道は限定されますが意外と便利なツールterraform-bundleの紹介です。

github.com

terraform-bundleって?

Terraformではコア部分とAWS/GCP/Azureといった各プラットフォーム固有の処理を担当する部分(プロバイダー)とで実行ファイルが分かれています。

通常、HashiCorp社により配布されているプロバイダーはterraform init時に必要な分だけ自動でhttps://releases.hashicorp.comからダウンロードされるようになっています。
また、サードパーティにより配布されているプロバイダーについては手動でプラグイン格納ディレクトリ(~/.terraform.d/plugins配下など)に配置する必要があります。

これらのプロバイダーをあらかじめダウンロードしておき、Terraform本体とパッケージングするためのツールがterraform-bundleです。
Terraform本体のソースに同梱されており、誰でも利用できるようになっています。

いつ使うの?

例えばオンプレミス上でTerraformやTerraform Enterpriseを利用する場合で、外部との接続が制限されている場合などに利用します。
また、カスタムプロバイダーの開発者であれば自身が開発したプロバイダーを配布するのに利用するといったこともあると思います。

使い方

インストール

現在はterraform-bundleはバイナリでの配布は行われていません。
このため、Go言語の開発環境を用意した上で自前でビルドする必要があります。

Goの開発環境を用意し、以下のコマンドを実行することでインストールできます。

$ go install github.com/hashicorp/terraform/tools/terraform-bundle

これで$GOPATH/bin配下にバイナリが作成されているはずです。適切にPATHを通す/PATHが通った場所に配置してください。

パッケージング

まず定義ファイルを用意する必要があります。
以下のような定義ファイルを作成しておきます。
ファイル名はなんでも良いですが、ここではexample.hclとしておきます。

terraform {
  version = "0.11.8"
}

providers {
  vsphere     = ["~> 1.8"]
  arukas      = ["~> 1.0"]
  sakuracloud = ["1.6"]
}

この例では、Terraform本体のバージョンが0.11.8、バンドルするプロバイダーとしてvspherearukassakuracloudを指定しています。 バンドルしたいプロバイダーはprovidersブロック内に記載していく形です。
プロバイダーにはバージョン番号を複数指定可能で、複数指定した場合は対応するバージョンそれぞれがバンドルされることとなります。

HashiCorp社により配布されていないカスタムプロバイダーもバンドルできますが、こちらはもう一つ作業が必要です。

カスタムプロバイダーをバンドルする場合

HashiCorp社が配布しているプロバイダーについてはterraform-bundleでパッケージングする際に自動でダウンロードしてくれますが、 カスタムプロバイダーの場合はカレントディレクトリにpluginsというディレクトリを作成してその配下にプロバイダーの実行ファイルを格納しておく必要があります。
(terraform-bundle実行時のオプションでディレクトリの変更も可能)

この例の場合はさくらのクラウド向けプロバイダーの実行ファイルをpluginsディレクトリに格納しておきます。

パッケージング実行

準備ができたら以下のコマンドでパッケージングします。

$ terraform-bundle package example.hcl

これでカレントディレクトリにterraform_0.11.8-bundlexxxx_darwin_amd64.zipというような名前のファイルが作成されるはずです。
このファイルをTerraformを実行したい環境に持っていって展開するだけです。

なお、デフォルトではterraform-bundleを実行した環境(OS/ARCH)向けにパッケージングされます。
変更する場合はオプションで-os-archを指定してください。

オンプレ版のTerraform Enterpriseで利用する場合は-os=linux -arch=amd64と指定します。

終わりに

ということで、terraform-bundleの紹介でした。
以上です。