🍌

Terraform RegistryにAWSのNetwork周り(VPC/Subnetなど)を簡単に構築できるModuleを公開してみた

2022/10/07に公開約4,700字

背景

ゴリゴリ系エンジニアのパイオニア、pageoです。
これまでに10近いPJの新規開発に携わってきたのですが、「VPC/SubnetとかNetowork周りってどのPJもほぼ同じやん」と感じることが多くなってきました。
Serverlessオンリーとか尖ってない限り、大体以下のような三層SubnetなNetowork構成になるのではないでしょうか?
(Public SubnetにLoad Balance/Bastion Server/NAT Gateway, Private Subnet1にAPI Server/Web Server, Private Subnet2にDB Serverを想定)

このNetwork周りをTerraformで実装するのが意外と面倒ですよね、、、
そこで、上記のNetwork周りを一括で構築してくれる有能なModuleをTerraform Registryに公開しました。
https://registry.terraform.io/modules/page-o/network/aws/latest

Github Repositoryは以下です

https://github.com/page-o/terraform-aws-network

Terraform Registryとはなんぞや?な方は以下の記事を参考ください
https://dev.classmethod.jp/articles/terraform_registry_module/

構築内容

このmoduleで作成されるAWS Resourceは以下です

  • VPC
  • Public Subnet
  • Private Subnet
  • Internet Gateway
  • NAT Gateway
  • Route table

Subnet/NAT Gateway/Route TableはMulti AZ構成が可能です。

使い方

※Terraform Registryへの公開方法だけが知りたい方は"Terraform Registryへの公開手順"まで読み飛ばしてください

Github/Terraform RegistryにExamplesを載せているので詳細はそちらを参照ください

以下はmoduleの使用例です

hoge.tf
module "hoge" {
  source = "page-o/network/aws"

  vpc = {
    cidr_block = "172.16.0.0/16"
    name       = "vpc"
  }
  public_subnets = [
    {
      cidr = "172.16.0.0/24"
      az   = "ap-northeast-1a"
      name = "public-1a"
    },
    {
      cidr = "172.16.4.0/24"
      az   = "ap-northeast-1c"
      name = "public-1c"
    }
  ]
  public_subnets_route_table_name = "public-route-table"
  private_subnets = [
    {
      cidr             = "172.16.32.0/24"
      az               = "ap-northeast-1a"
      name             = "private-1a"
      route_table_name = "private-route-table-1a"
    },
    {
      cidr             ="172.16.36.0/24"
      az               = "ap-northeast-1c"
      name             = "private-1c"
      route_table_name = "private-route-table-1c"
    }
  ]
  private_secondary_subnets = [
    {
      cidr = "172.16.64.0/24"
      az   = "ap-northeast-1a"
      name = "private-db-1a"
    },
    {
      cidr = "172.16.68.0/24"
      az   = "ap-northeast-1c"
      name = "private-db-1c"
    }
  ]
  private_secondary_subnets_route_table_name = "private-db-route-table"
  gateway = {
    igw_name = "internet-gateway"
    ngw_names = [
      "nat-gateway-1a",
      "nat-gateway-1c"
    ]
  }
}

Terraform Registryへの公開手順

いよいよ本題です。
以下にTerraform Registryへの公開手順を記載します

実装

Github Repositoryの作成

以下のように設定していきます

  • Repository Name
    • 以下の命名規則通りに記載します
      • terraform-{provider}-{name}
      • provider: aws, googleなど
      • name: 作成するmodule名
  • Description
    • 適当に説明文を書きます
  • Public/Private
    • Terraform Registryに公開すること前提なのでPublicにします
  • Add a README file
    • Terraform RegistryのREADMEとなるのでtrueを選択します(Optionalです)
  • Choose a license
    • MIT LICENSEを選択します(Optionalです)

コーディング

以下に必須条件の記載があるのでそれに準じてコーディングしていきます
https://www.terraform.io/registry/modules/publish#requirements

tag付け

以下コマンドでrelease用のtag付けをします
versionSemantic Versionにする必要があります

git tag -a {version} -m "{comment}"

tagをremoteにpushします

git push origin tags/{version}

Publish

Sign Up

Terraform RegistryへのPublishにはSign Upが必須なので以下画像の通りにSign Upしていきます
画面右上部のModuleを押下

Github連携

Grant

Publish

Sign In後、再度画面右上部のModuleを押下します

Publish Module!!

無事公開されました!!

確認

Exampleもちゃんと表示されています

READMEも標示されていますね

まとめ

かなり簡単にTerraform RegistryへのPublishができました。(記事執筆と並行してなければ1時間ほど)
PJごとに実装が似寄るAWS ResourceはECS/RDSとか結構あると思うので、network以外にも随時追加していきたいと思います

今回自分が作成したnetwork moduleは結構便利だと思うので、是非使用してみてくださいmm
https://registry.terraform.io/modules/page-o/network/aws/latest

Discussion

ログインするとコメントできます