【Terraform】tfcmtを使用してGitHubのPRにplanの結果をコメントする
terraform plan の結果を GitHub の PR にコメントしてくれる便利なツールを見つけました
その名もtfcmt!!
GitHub Actions に導入するのも簡単なので、皆さんもぜひ本記事を参考にしてみてください
tfcmt とは?
tfcmtを使うとterraform plan や apply の結果を GitHub の PullRequest にコメントしてくれます。
ソースコード
公式ドキュメント
Zenn の記事
tfactionなるものもあるのでご興味がある方はぜひ!
tfcmt を使わないと.....
tfcmt を使用しなくてもActions のログから plan や apply の結果を見れますが、面倒。。。
また、今まではgithub-script で JavaScript を使って plan の結果を PR にコメントしてました
ただ、この方法だと Refreshing state などのログもコメントに含まれ見にくい。
何が作成?変更?削除?されるのかもわかりづらい。
tfcmt を使うと、
- いくつリソースが作成、変更、削除されるかがパッとわかる
- リソース削除されるときに警告される
- plan の詳細も関係あるリソースのみ表示される
ので、とても見やすいコメントをしてくれます!
レビューする側からすると負荷がとても減りますよね
GitHubActions に組み込む
ここからはtfmct を GitHubActions に組み込んでいきます!
↓ のようにワークフローを定義しました(ポイントはハイライト部)
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 を作成するコードを用意しました。
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 がはしりコメントが更新されます
参考記事
Discussion