LoginSignup
14
6

More than 3 years have passed since last update.

Terraform RegistryにModuleを公開した

Last updated at Posted at 2020-04-16

概要

Terraform公式の Terraform Registryに Moduleを公開しました。その手順を解説します。

Terraform Registry とは

Terraformのモジュールを公開できるサービスです。
スクリーンショット 2020-04-15 1.05.49.png

登録されているモジュールは利用することができ、自分でモジュールを用意しなくてもいいので便利です。
Terraformの開発元であるHashiCorp社が作成したモジュール等も公開されており、自分でモジュールを作成する際にも参考になります。

公開したModule

AWS VPCを構築するモジュールです。
https://registry.terraform.io/modules/nekochans/vpc/aws/1.0.1

nekochansというGitHub Organizationで@keitaknと個人開発を進めています。新しくAWS環境を構築することが多く、毎回モジュールを作成することが手間となっていました。
開発効率をあげるために、AWS環境構築には必須となるリソースをモジュールとして公開ししました。
また少しでも料金を下げるためにNAT GatewayではなくNAT Instanceを利用しています。

GitHubのソースコードはこちらです。
https://github.com/nekochans/terraform-aws-vpc

必須条件

モジュールを公開するためには、いくつかの条件があります。
詳細はこちらをご確認ください。
https://www.terraform.io/docs/registry/modules/publish.html

  • GitHubの公開リポジトリで管理されていること
  • リポジトリ名がterraform-<PROVIDER>-<NAME>という形式で命名されていること
  • GitHubリポジトリのdescriptionが設定されていること
  • 構成がStandard Module Structureに従っていること
  • セマンティックバージョンに従ったタグがついていること

公開手順

GitHubリポジトリを作成

リポジトリの命名規則に従って公開リポジトリを作成します。

命名規則: terraform-<PROVIDER>-<NAME>

PROVIDERはリソースを構築する対象のプロバイダーを指定します。(aws,googleなど)
NAMEはモジュールで管理する対象を指定します。

今回はAWSにVPCを構築するモジュールを作成するので、 terraform-aws-vpcとします。

リポジトリのdescriptionにはモジュールの説明を記載します。
Terraform module to create VPC resource with Nat Instance on AWS.

Moduleの作成

Standard Module Structureに従いモジュールを作成します。

今回は下記のディレクトリ構成にしました。

├── examples
│   └── complete
│       ├── README.md
│       ├── main.tf
│       └── outputs.tf
├── LICENSE
├── README.md
├── main.tf
├── outputs.tf
├── variables.tf
├── versions.tf
└── vpc_flow_log.tf

main.tf, variables.tf, outputs.tf

最低限、下記のファイルが必要です。

main.tf: エントリポイント
variables.tf: 入力値を定義
outputs.tf: 出力値を定義

variables.tf, outputs.tfではdescriptionを定義する必要があります。

variables.tf
variable "name" {
  description = "Name to be used on all the resources as identifier"
  type        = string
  default     = ""
}
outputs.tf
output "vpc_id" {
  value       = aws_vpc.this.id
  description = "The ID of the VPC"
}

ネストしたモジュールを定義する場合はmodulesディレクトリに配置する必要があります。
今回は複雑ではないモジュールのためmodulesディレクトリは利用していません。

README.md

こちらの内容がTerraform Registryのreadmeとして公開されます。

READMEまたはREADME.mdという名前で作成します。
モジュールでどのようなリソースが作成されるか、使用例などを記載します。

READMEの下記についてはterraform-docs
を利用して自動生成しました。簡単にREADMEを生成できるのでおすすめです。

  • Requirements
  • Providers
  • Inputs
  • Outputs

examples

モジュールの利用例を作成します。こちらで作成した内容もTerraform Registryにも表示されます。

スクリーンショット 2020-04-15 0.41.12.png

LICENSE

ライセンスファイルを作成します。

タグの追加

セマンティックバージョンに従ったリリースタグをつけます。
prefixにvをつけることも可能です。1.0.0v1.0.0の形式でタグを追加します。

git tag -a v1.0.0 -m "release version v1.0.0"
git push origin tags/v1.0.0

Terraform Registryへの公開

GitHubアカウントでSign-inします。Organizationのリポジトリを公開する場合は、「Grant」を選択して権限を追加する必要があります。
Publishから対象のリポジトリを選択することでモジュールの公開が完了します。
スクリーンショット 2020-04-15 0.48.07.png

Moduleの利用

公開されたモジュールは、<NAMESPACE>/<NAME>/<PROVIDER>の形式で指定することによって利用できます。
今回作成したモジュールの利用例です。

module "vpc" {
  source = "nekochans/vpc/aws"

  name = "my-vpc"
  cidr = "10.0.0.0/16"

  nat_instance_ami         = "ami-0af1df87db7b650f4"
  nat_instance_type        = "t2.micro"
  nat_instance_volume_type = "gp2"
  nat_instance_volume_size = "30"

  azs             = ["ap-northeast-1a", "ap-northeast-1c", "ap-northeast-1d"]
  private_subnets = ["10.10.0.0/24", "10.10.1.0/24", "10.10.2.0/24"]
  public_subnets  = ["10.10.10.0/24", "10.10.11.0/24", "10.10.12.0/24"]
}

最後に

思ったよりも簡単にTerraform Registryへ公開できました。
これで今後の個人開発もスムーズに進められそうです。

最後まで読んで頂きありがとうございました。

14
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
6