🐷

【CI/CD】tfcmtを導入してterraformのCI/CDを改善する

2023/08/09に公開

tfcmtとは

Plan/Apply結果をPR等に通知してくれる
おかげでいちいちCI/CDツールを見に行かなくて済

やる事

以前CodeBuildでCI/CDを組んだaws-terraform
tfcmtを組んでPRに通知される様にします。

パラメータストアに環境変数の設定

Githubにアクセスする際に認証が必要なのでGITHUB_TOKENが必要になる。
今回はGithubで作成しAWSのパラメータストアに保存する。

  1. AWS にログイン → システムマネージャー → パラメータストア → パラメータの作成
  2. "名前"を入力
    "安全な文字列"にチェック
    "値"を入力
  3. パラメータを作成

参考資料:
https://suzuki-shunsuke.github.io/tfcmt/getting-started/
https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens

コードの編集

パラメータストアの値をCodebuildから取得し、scriptsで使う

codebuild/buildspec-dryrun.yml

version: 0.2

env:
  parameter-store:
    GITHUB_TOKEN: "codebuild-github-token"

phases:
  install:
    commands:
      - chmod +x ${CODEBUILD_SRC_DIR}/scripts/install.sh
      - ${CODEBUILD_SRC_DIR}/scripts/install.sh

  build:
    commands:
      - chmod +x ${CODEBUILD_SRC_DIR}/scripts/dryrun.sh
      - ${CODEBUILD_SRC_DIR}/scripts/dryrun.sh

codebuild/buildspec-apply.yml

version: 0.2

env:
  parameter-store:
    GITHUB_TOKEN: "codebuild-github-token"

phases:
  install:
    commands:
      - chmod +x ${CODEBUILD_SRC_DIR}/scripts/install.sh
      - ${CODEBUILD_SRC_DIR}/scripts/install.sh

  build:
    commands:
      - chmod +x ${CODEBUILD_SRC_DIR}/scripts/apply.sh
      - ${CODEBUILD_SRC_DIR}/scripts/apply.sh

scripts/install.sh

#!/bin/sh

set -ex

TERRAFORM_VERSION="1.5.4"
TFCMT_VERSION="v4.4.3"

wget -q "https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip"
unzip -d /usr/local/bin "terraform_${TERRAFORM_VERSION}_linux_amd64.zip"

wget "https://github.com/suzuki-shunsuke/tfcmt/releases/download/${TFCMT_VERSION}/tfcmt_linux_amd64.tar.gz" -P /tmp
tar zxvf /tmp/tfcmt_linux_amd64.tar.gz -C /tmp
mv /tmp/tfcmt /usr/local/bin/tfcmt

scripts/dryrun.sh

#!/bin/sh
set -ex
terraform init -var USERID=${userID} -input=false -no-color -backend-config="key=terraform.tfstate" -backend-config="bucket=zukkie-terraform-state"
terraform validate -no-color
tfcmt plan -- terraform plan -no-color -var USERID=${userID}

scripts/apply.sh

#!/bin/sh
set -ex
terraform init -var USERID=${userID} -input=false -no-color -backend-config="key=terraform.tfstate" -backend-config="bucket=zukkie-terraform-state"
terraform validate -no-color
tfcmt apply -- terraform apply -auto-approve -no-color -var USERID=${userID}

Plan/Apply通して問題なければ結果がPRに通知される

最終的なコード

https://github.com/zukizukizuki/aws-terraform/tree/12fd6e0d108de1ad46aedb006138ad9dfd8ee84c

GitHubで編集を提案

Discussion