Terraform公式のモジュールレジストリ「Terraform Registry」でモジュールを公開する方法

TerraformにはTerraform Registryという公式のモジュールレジストリが用意されています。 今日はTerraform Registryでモジュールを公開する方法について紹介します。
Terraform Registryでモジュールを公開するまで
Terraform RegistryはGitHubのパブリックなリポジトリに一定のルールに従ったTerraformモジュールを置けば公開できるようになっています。
モジュール公開までの手順
手順としては以下の通りです。
リポジトリ/モジュール作成時のルール
リポジトリ/モジュール作成の際は以下のルールに従う必要があります。
- GitHubのパブリックなリポジトリでモジュールのソースを公開する
- リポジトリ名は
terraform-<PROVIDER>-<NAME>という形式にする - モジュールのファイル構成はStandard module structureに従う
0.0.0またはv0.0.0のようなセマンティックバージョンに従った名前のタグをつける
順番に見ていきましょう。
モジュール用のGitHubリポジトリ作成
まずGitHubでパブリックなリポジトリを作成しましょう。
リポジトリ名はterraform-<PROVIDER>-<NAME>という形式にする必要があります。
例えばAWS向けにconsulクラスタをセットアップするようなモジュールであればterraform-aws-consulという名前にします。
<PROVIDER>の部分はモジュールが操作する対象のプロバイダーの名前を指定します。
複数のプロバイダーを利用することもあると思いますが、その場合はメインとなるプロバイダーの名前を指定すればOKです。
<NAME>の部分はモジュールの名前を指定します。
ハイフンを含む名前も指定できます。
モジュールの作成
リポジトリを作成したらモジュールの作成を行います。
ファイル構成はStandard module structureに従う必要があります。
Standard module structureって?
モジュール作成の際のファイル構成の作法です。
- [必須]ルートモジュールであること
- READMEファイルを持つこと
- ライセンスファイルを持つこと
main.tf/variables.tf/outputs.tfを持つこと- 変数(Input Variables)とアウトプット(Output)はそれぞれ説明(Description)を指定すること
- ネストしたモジュールがある場合は
modulesディレクトリ配下に置くこと - 利用例は
examplesディレクトリ配下に置くこと
ルートモジュールとは、モジュールのルートディレクトリ直下にtfファイルの存在するモジュールのとこです。
大抵のモジュールは問題なくルートモジュールと言えるでしょう。
READMEファイルはREADMEまたはREADME.mdというファイル名である必要があります。
ライセンスは任意のライセンスが利用できるようですが、Apacheライセンス 2.0が多い印象です。
ファイル配置としてはmain.tf/variables.tf/outputs.tfを少なくとも作成します。
もちろんこれ以外の任意の名前のtfファイルやテンプレートなどを含んで構いません。
ただし、ネストしたモジュールを含む場合はmodulesディレクトリに配置します。
READMEファイル作成時の注意点
Terraform Registryで公開する際はもちろんレジストリのURLで公開されます。
このため、READMEに画像ファイルやリンクを含める場合は絶対パスとしなければなりません。
モジュールにタグをつける
モジュールを作成したらセマンティックバージョンに従った名前のタグをつけます。
0.0.0または頭にvをつけたv0.0.0形式とします。
忘れずにGitHubにpushしておきましょう。
# タグの作成 $ git tag v0.0.1 # GitHubにpush $ git push origin v0.0.1
モジュールの公開
後はTerraform Registryで公開作業をするだけです。
公式ドキュメントに動画がありますのでこちらを参照してください。
ほぼ迷うことはないと思いますが、個人リポジトリではなくオーガニゼーション配下のリポジトリを指定したい場合はOAuth時に忘れずにGrantしておいてください。

引用元: https://www.terraform.io/docs/registry/modules/publish.html
以上でモジュールが公開できました。
公開されたモジュールを利用する
公開されたモジュールは<GitHubのアカウント or オーガニゼーション>/<モジュール名>/<プロバイダー名>という形式で利用することになります。
例えば、以下の場合だとfoo/bar/awsということになります。
- GitHubのアカウントは
foo - モジュール名は
bar - プロバイダーは
aws
tfファイルにはこんな感じで記載します。
module "your_module_name" { source = "foo/bar/aws" version = "0.0.1" }
後は通常のTerraformを利用する流れと同じでterraform initを実行後にplanやapplyを実行するだけです。
おわりに
Terraformモジュールを作ったことがある方であれば非常に簡単に公開できますね!
ちなみに、Terraform Enterpriseを利用すればプライベートなレジストリも利用できるとのことです。
興味がある方はHashiCorp Japanに問い合わせしてみると良さそうです。
ということでガンガンモジュール作成しましょうー!
以上です。