💻

【Terraform】tfcmtを使用してGitHubのPRにplanの結果をコメントする

2025/01/10に公開

terraform plan の結果を GitHub の PR にコメントしてくれる便利なツールを見つけました

その名もtfcmt!!

GitHub Actions に導入するのも簡単なので、皆さんもぜひ本記事を参考にしてみてください

tfcmt とは?

tfcmtを使うとterraform plan や apply の結果を GitHub の PullRequest にコメントしてくれます。

ソースコード

https://github.com/suzuki-shunsuke/tfcmt

公式ドキュメント

https://suzuki-shunsuke.github.io/tfcmt/

Zenn の記事

https://zenn.dev/shunsuke_suzuki/articles/improve-terraform-cicd-with-tfcmt

tfactionなるものもあるのでご興味がある方はぜひ!

tfcmt を使わないと.....

tfcmt を使用しなくてもActions のログから plan や apply の結果を見れますが、面倒。。。

また、今まではgithub-script で JavaScript を使って plan の結果を PR にコメントしてました

https://zenn.dev/kuuki/articles/terraform-github-actions-auto-plan-apply/

ただ、この方法だと Refreshing state などのログもコメントに含まれ見にくい。

何が作成?変更?削除?されるのかもわかりづらい。

tfcmt を使うと、

  • いくつリソースが作成、変更、削除されるかがパッとわかる
  • リソース削除されるときに警告される
  • plan の詳細も関係あるリソースのみ表示される

ので、とても見やすいコメントをしてくれます!

レビューする側からすると負荷がとても減りますよね

GitHubActions に組み込む

ここからはtfmct を GitHubActions に組み込んでいきます!

↓ のようにワークフローを定義しました(ポイントはハイライト部)

plan.yml
name: TerraformPlan

on:
  pull_request:
    branches:
      - main

env:
  TF_VERSION: 1.8.5
  AWS_DEFAULT_REGION: ap-northeast-1

permissions:
  id-token: write
  contents: read
  pull-requests: write

jobs:
  plan:
    runs-on: ubuntu-latest
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-region: ${{ env.AWS_DEFAULT_REGION }}
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v2
        with:
          terraform_version: ${{ env.TF_VERSION }}

      - name: Setup tfcmt
        uses: shmokmt/actions-setup-tfcmt@v2
        with:
          version: v4.6.0

      - name: Terraform init
        id: init
        run: terraform init

      - name: Terraform fmt
        id: fmt
        run: terraform fmt -check

      - name: Terraform validate
        id: validate
        run: terraform validate

      - name: Terraform plan
        id: plan
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: tfcmt plan -patch -- terraform plan -input=false

ワークフローについて

まずは、tfcmt のセットアップをします
wget して targz を解凍して...としてもいいのですが、actions-setup-tfcmtを利用します。

インストールする tfcmt のバージョンを 4.6.0と指定しています

      - name: Setup tfcmt
        uses: shmokmt/actions-setup-tfcmt@v2
        with:
          version: v4.6.0

そして、terraform plan を実行するパート。

      - name: Terraform plan
        id: plan
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: tfcmt plan -patch -- terraform plan -input=false

tfcmt planコマンドを実行すると、plan とその結果をコメントしてくれます。

使用するには GitHub のトークンを渡す必要があるので環境変数に定義しておきます。
GITHUB_TOKENは自動で生成され、シークレットに格納されるので指定するだけで OK!

patchオプション:すでにコメントがあり CI が再実行された場合それが更新されます

--(ダブルダッシュ)の後に terraform plan を指定します。

ここでは、-input=falseといったterraform plan のオプションを指定できます

動作確認

動作確認のため、↓ のように S3 を作成するコードを用意しました。

main.tf
terraform {
  required_version = "~> 1.8.0"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.16"
    }
  }

  # tfstateの保存先
  backend "s3" {
    bucket  = "terraform-test-state-hisui"
    region  = "ap-northeast-1"
    key     = "test/terraform.tfstate"
    encrypt = true
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

# S3バケットの定義
resource "aws_s3_bucket" "example" {
  bucket        = "example-bucket-hisui"
  force_destroy = true
}

# バージョニング設定
resource "aws_s3_bucket_versioning" "example" {
  bucket = aws_s3_bucket.example.id

  versioning_configuration {
    status = "Enabled"
  }
}

これをもとに PR を作成すると....

Plan の結果をコメントしてくれました!

今回の場合だと何が作成されるかがぱっと見でわかるのでありがたい!!

CI link を押すと GitHub Actions のログに飛べるのも便利

Plan の結果に応じて PR にラベルもつけてくれます

  • :リソースの変更なし
  • :リソースの作成または更新
  • :リソースの削除

今回は S3 を作成するので青色のラベルがついてます

ラベルは PR 一覧にも表示されます

コードを変更して push すると再度 CI がはしりコメントが更新されます

参考記事

https://zenn.dev/kou_pg_0131/articles/tfcmt-on-gh-actions

https://blog.adachin.me/archives/52364

Discussion