🤖

Terraform Module を PR ベースで自動更新してバージョンを管理する

に公開

この記事は、 MIXI DEVELOPERS Advent Calendar 2025 の 5 日目の記事です。


みなさん、Terraform Module を使ってますか?Module、いいですよね。複雑怪奇な Terraform コードを隠蔽してくれる、とても便利なやつです(ぇ

ところで、作成した Terraform Module、どう管理していますか?Module のバージョンをちゃんと管理している人……意外と少ないんじゃないでしょうか。

少し前に、Terraform Module のバージョン管理について、AWS と Google Cloud の公式 Module を調べてみたことがあります。どちらも「PR をマージするたびに自動でバージョンが更新される」という仕組みが整っていて、非常に便利そうでした。

これ、導入できたら嬉しくないですか?嬉しいですよね。そう、嬉しいんです。

というわけで今回は、AWS の公式 Module を例に、バージョン管理を自動化する仕組みを解説していきます。

バージョン管理における基本的な考え方

AWS の公式 Terraform Module は、以下のようなシンプルな仕組みで更新されています。

  • PR をマージすると自動でバージョンが上がる
  • バージョン番号は 0.0.0 の形式で、どの数字を上げるかは PR のタイトルにつくプレフィックスで決まる

これは Conventional Commits と Semantic Versioning という2つの考え方に基づいています。

Conventional Commits

Conventional Commits とは大まかに以下のような考え方です。
https://www.conventionalcommits.org/ja/v1.0.0/#summary

  • コミットメッセージに「どんな変更か」を体系的に書くルール
  • 基本形式は以下
    <type>[optional scope]: <description>
    
  • type には fixfeat などがある
  • 破壊的変更がある場合は fix! のように ! を付ける

Semantic Versioning

Semantic Versioning は、大まかに以下のような考え方です。
https://semver.org/

  • バージョン番号の付け方を決めるルール
  • 0.0.0 形式で、左から major、minor、patch
  • 変更内容に応じて番号を increment する
    • major … 後方互換性のない変更
    • minor … 後方互換性のある新機能
    • patch … 後方互換性のあるバグ修正

これらを組み合わせ、AWS の Terraform Module では以下のように自動バージョンアップを行っています。

  • PR タイトルが fix: などの type の場合 → patch を上げる
  • PR タイトルが feat: の場合 → minor を上げる
  • PR タイトルに feat!: など破壊的変更を示す ! がついている場合 → major を上げる

AWS の Module はこれらのルールを GitHub Actions で実装し、バージョン管理を極限まで省力化しています。

AWS の Terraform Module の GitHub Actions

実際の GitHub Actions を見てみましょう。一例として AWS VPC Module を取り上げます。
https://github.com/terraform-aws-modules/terraform-aws-vpc

こちらの .github/workflows には、バージョン管理に関わるファイルがいくつかあります。
https://github.com/terraform-aws-modules/terraform-aws-vpc/tree/master/.github/workflows

それぞれの役割は以下のとおりです。

  • pr-title.yml
    • PR タイトルに Conventional Commits に基づいたプレフィックスがついているかをチェックするもの
  • pre-commit.yml
    • 不要ファイル削除や互換性チェックなど、PR 作成時の前処理
  • release.yml
    • PR マージ時に release を作成し、バージョン番号や CHANGELOG を自動生成

ここからはそれぞれ詳しく見ていきます。

pr-title.yml

中身は以下のようになっています。
https://github.com/terraform-aws-modules/terraform-aws-vpc/blob/master/.github/workflows/pr-title.yml

使用しているのは以下の Action です。
https://github.com/amannn/action-semantic-pull-request

これは PR タイトルが Conventional Commits に従っているかをチェックするものです。Conventional Commits のルールでは、以下のような書き方でした。(再掲)

<type>[optional scope]: <description>

AWS の Module では scope はほぼ使われておらず、以下の type を基本的に使用しているようです。

  • fix
  • feat
  • docs
  • ci
  • chore

この GitHub Actions により、AWS の Terraform Module の PR のタイトルは、全てこの Type のプレフィックスがついています。

pre-commit.yml

こちらの中身は以下のようになっています。
https://github.com/terraform-aws-modules/terraform-aws-vpc/blob/master/.github/workflows/pre-commit.yml

主に以下を行っています。

ここで活躍しているのが pre-commmit というツールです。
https://github.com/pre-commit/pre-commit

pre-commit は、 .pre-commit-config.yaml に書いてある設定に基づいて、様々なチェック・整形処理を自動化できます。プラグインという形で、様々な処理を簡単に追加することができます。

AWS の Module では、以下のような処理を行っていることが分かります。
https://github.com/terraform-aws-modules/terraform-aws-vpc/blob/master/.pre-commit-config.yaml

この設定により、Terraform のバージョン互換チェックから細かい修正まで、全て自動で完結します。

release.yml

こちらの中身は以下のようになっています。
https://github.com/terraform-aws-modules/terraform-aws-vpc/blob/master/.github/workflows/release.yml

ここはとてもシンプルで、以下の Action を使っています。
https://github.com/cycjimmy/semantic-release-action

これは Node 製ツール semantic-release によって動作します。
https://github.com/semantic-release/semantic-release

このツールは、.releaserc.json に書いてある設定に基づいて、リリースに関連する様々な処理を実行してくれます。このツールも、プラグインという形で、必要な処理を簡単に追加することができます。

AWS の Terraform Module では、以下のようなプラグインが設定されていました。
https://github.com/terraform-aws-modules/terraform-aws-vpc/blob/master/.releaserc.json

  • semantic-release/commit-analyzer
    • こちらはコミット内容を確認し、次のバージョン番号を決定するもの
    • type や破壊的変更の有無に応じて、major、minor、patch バージョンのどれかを上げてくれる
  • semantic-release/release-notes-generator
    • こちらは書いてあるPR の内容から、リリースノートを自動で生成してくれる
  • semantic-release/github
    • こちらは、GitHub の release を作成してくれる。また関連する PR や issue にコメントをしてくれる
  • semantic-release/changelog
    • こちらは CHANGELOG.md を生成してくれる
  • semantic-release/git
    • こちらは生成した CHANGELOG などのファイルをコミットしてくれる

これらにより、PR タイトル → バージョン判定 → リリース作成 → CHANGELOG 更新という一連の流れが完全自動化されます。

マージコミットの設定

最後に、これらの GitHub Actions を正しく動かすための重要なポイントがあります。それがマージコミットの設定です。

semantic-release の commit-analyzer は、マージコミットを読みません。なぜなら、マージコミットは Merge pull request ... の形式で Conventional Commits に従っていないからです。

そのため AWS のリポジトリでは、
デフォルトのマージ方法を squash にし、コミットメッセージを PR タイトルにする
という設定がされています。

Squash Merge なら、複数コミットを1つにまとめ、そのコミットメッセージに PR タイトル(= Conventional Commit 形式) を使用できます。

設定箇所は、リポジトリの settings > General の Pull Requests の項目にあります。

この設定により、semantic-release が問題なく PR タイトルからバージョンを判定できるようになります。

まとめ

AWS の Terraform Module では、以下のファイルによって、バージョン管理が完全自動化されていることがわかりました。

├── .pre-commit-config.yaml
├── .releaserc.json
└── .github
    └── workflows
        ├── pr-title.yml
        ├── pre-commit.yml
        └── release.yml

これらのツールを利用して、みなさまも Terraform Module のバージョン管理をしてみてはいかがでしょうか?

MIXI DEVELOPERS Tech Blog

Discussion