🚄

Terraform moduleを管理する専用リポジトリを作成する為に対応したこと

2023/03/26に公開

はじめに

monorepoでterraformを管理しており、moduleも同一リポジトリ内で管理していたのですが、汎用的なmoduleを作成してバージョン管理したい機運がでてきました。
module管理用のリポジトリを作成した時にいくつか調べならが対応したメモになります。

リポジトリを横断したアクセスの対応

moduleを利用するリポジトリとmoduleを管理するリポジトリが分かれている為、terraform init時にリポジトリを横断してアクセスできる必要があります。

moduleを管理しているリポジトリがpublicであれば、認証を気にする必要はないですが、自前のmoduleを活用する場合はprivateリポジトリでの利用がほとんどだと思うので、アクセスの際に認証が必要になります。

GitHubAppの作成

以前はPersonal Access Tokenを利用する方法が多かったかと思いますが、現在はGitHubAppを活用する方法がベストプラクティスだと思うので、GitHubAppの認証を利用して、module管理用のリポジトリにアクセスさせます。

GitHubAppを作成する手順は巷にあふれているので割愛します。

https://zenn.dev/suzutan/articles/how-to-use-github-apps-token-in-github-actions

GitHubActionsでの実装

GitHubActionsでTerraformの実行を自動化しているので、既存のジョブに上記で作成したGitHubAppのtokenを利用するステップを追加する必要があります。

上記のGitHubAppを作成する記事を参考にした場合、terraform initを実行する前に以下のステップを追加します。

	## 認証情報の取得
	- name: Generate github token
	id: generate_token
	uses: tibdex/github-app-token@v1
	with:
	  app_id: ${{ secrets.APP_ID }}
	  private_key: ${{ secrets.PRIVATE_KEY }}
	  
	## GitHubのアクセス時に認証情報を使用するように設定
	- name: Set token
	run: git config --global url."https://x-access-token:$GITHUB_TOKEN@github.com/".insteadOf "https://github.com/"
	env:
	  GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}

GitHubAppをTerraform moduleを管理するリポジトリにインストールしておけば、GitHubAppの認証情報を利用して、アクセスができるようになります。

terraform-docsの導入

moduleを作成する場合、READMEも合わせて作る方がいいのですが、作成者によって記述がばらけたり、変数の記載漏れなどが発生することもあるので、なるだけ自動化したいものです。

terraform-docsを使うとREADMEを自動で作成することができます。
https://terraform-docs.io/

こちらは公式のGitHubActionsが提供されているので、そちらを活用します。

.github/workflows/documentation.yml
name: Generate terraform docs
on:
  - pull_request

jobs:
  docs:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        ref: ${{ github.event.pull_request.head.ref }}

    - name: Render terraform docs and push changes back to PR
      uses: terraform-docs/gh-actions@main
      with:
        working-dir: .
        output-file: README.md
        output-method: inject
        git-push: "true"

上記のGitHubActionsを設定すれば、プルリク作成時に自動でREADMEを作成し、変更があった場合はcommitが追加されるので、作成漏れや変数の記載漏れなどを防ぐことができます。

リリースタグの作成

初めの要件としてバージョン管理があるので、リリースの管理を行う必要があります。
GitHubではリリースノートを自動作成する機能があるので、そちらのをのまま活用します。

https://docs.github.com/ja/repositories/releasing-projects-on-github/automatically-generated-release-notes

ブランチの運用や、プルリクの単位などの細かな部分はとりあえず決めきれないので、一旦手動でリリースは作成する前提で、リリースノートをテンプレートを使用します。

.github/release.yml
changelog:
  exclude:
    labels:
      - ignore-for-release
    authors:
      - octocat
  categories:
    - title: Breaking Changes 🛠
      labels:
        - Semver-Major
        - breaking-change
    - title: Exciting New Features 🎉
      labels:
        - Semver-Minor
        - enhancement
    - title: Other Changes
      labels:
        - "*"

上記の場合、タグによりリリースノートへの記載有無や、タイトルが変わるので、タグについては事前に作成し、プルリクにて適切なタグを設定するようにします。

まとめ

Terraform moduleのリポジトリ管理するために、最低限やったことをまとめて紹介しました。
静的解析など、Terraformとして必要なことは他にもありますが、Terraform module管理用リポジトリの観点だと、紹介したことができればまずはいいかなと思います。

Discussion