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

f:id:febc_yamamoto:20180201085942p:plain

TerraformにはTerraform Registryという公式のモジュールレジストリが用意されています。 今日はTerraform Registryでモジュールを公開する方法について紹介します。

Terraform Registryでモジュールを公開するまで

Terraform RegistryはGitHubのパブリックなリポジトリに一定のルールに従ったTerraformモジュールを置けば公開できるようになっています。

モジュール公開までの手順

手順としては以下の通りです。

リポジトリ/モジュール作成時のルール

リポジトリ/モジュール作成の際は以下のルールに従う必要があります。

順番に見ていきましょう。

モジュール用の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しておいてください。

f:id:febc_yamamoto:20180315220842g:plain

引用元: 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を実行後にplanapplyを実行するだけです。

おわりに

Terraformモジュールを作ったことがある方であれば非常に簡単に公開できますね!
ちなみに、Terraform Enterpriseを利用すればプライベートなレジストリも利用できるとのことです。
興味がある方はHashiCorp Japanに問い合わせしてみると良さそうです。

ということでガンガンモジュール作成しましょうー!

以上です。