最近メンティーと元同僚で輪読会を週1、30分やるようになったんだけど、回し読みすると長くなるから次回までに何ページまで読んで、解説と議論したほうが早いということが分かった。継続は力なり。
— adachin👾SRE (@adachin0817) September 21, 2023
久しぶりのブログですが、今月からお友達のエンジニアと一緒に輪読会を毎週やることにしました。今は「達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践」を読んでいますが、初心者である程度サーバーの経験がある方でも学べる本となっているので、パフォーマンス/チューニングの方法を学ぶにはベスト本ですね。以下は個人的にオススメの参考書をまとめておりますので参考に。
https://adachin.kibe.la/shared/entries/5a3d446b-4751-47d3-887e-69d988c1a101
tfcmtを使ってモノレポの環境でCI/CD作れた。超便利だからあとでブログ書く。
— adachin👾SRE (@adachin0817) September 25, 2023
雑談をしていく中でTerraformで利用できるCLIツールの tfcmt
が超便利ということを知ったのでご紹介したいと思います。
tfcmtとは
https://github.com/suzuki-shunsuke/tfcmt
開発者は@szkdash氏で、tfcmtはterraform planやterraform applyの結果をGitHubのコメントとして通知するCLI ツールです。以前Terraform CI/CDをGItHub Actionsで実装しましたが、毎回ActionsからCIの結果を見に行くのが面倒で、プルリクから待っていればコメントに通知されて非常に便利で見やすく、内部監査としてもプルリクエストを見ればいつTerraformを実行しているかを証跡として管理することができます。
以下のコードを元に早速導入してみましょう。
環境
- Terraform構成
1 2 3 4 5 |
terraform ├── prd │ ├── main.tf └── stg └── main.tf |
構成としてはモノレポでstg、prdでディレクトリを分割して運用している状態です。
GitHub Actions
- .github/workflows/stg_terraform-ci.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
name: Stg Terraform CI on: pull_request: paths: - "terraform/stg/**" env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} SLACK_USERNAME: stg-terraform-ci SLACK_CHANNEL: notify_ci SLACK_ICON: https://avatars.githubusercontent.com/u/44036562?s=280&v=4 permissions: id-token: write contents: read pull-requests: write #追加 jobs: stg_terraform_ci: name: Stg Terraform CI runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@main with: role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/${{ env.AWS_ROLE_NAME }} role-session-name: ${{ env.AWS_ROLE_SESSION_NAME }} aws-region: ${{ env.AWS_REGION }} env: AWS_ROLE_NAME: githubactions-oidc AWS_ROLE_SESSION_NAME: githubactions-oidc AWS_REGION: ap-northeast-1 - name: Setup Terraform uses: hashicorp/setup-terraform@v2 with: terraform_version: 1.5.7 - name: Setup tfcmt #追加 uses: shmokmt/actions-setup-tfcmt@v2 with: version: v4.6.0 - name: Terraform init id: init working-directory: ./terraform/stg run: terraform init - name: Terraform fmt id: fmt working-directory: ./terraform/stg run: terraform fmt -check - name: Terraform validate id: validate working-directory: ./terraform/stg run: terraform validate -no-color - name: Terraform plan id: plan working-directory: ./terraform/stg run: tfcmt -var "target:stg" plan -patch -- terraform plan -no-color -input=false #変更 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Slack Success if: ${{ success() }} uses: rtCamp/action-slack-notify@v2 env: SLACK_TITLE: stg terraform plan Success SLACK_COLOR: good - name: Slack Failure if: ${{ failure() }} uses: rtCamp/action-slack-notify@v2 env: SLACK_TITLE: stg terraform plan Failure SLACK_COLOR: danger |
17行目でプルリクエストの書き込み権限を記載しましょう。43行目ではtfcmtをshmokmt/actions-setup-tfcmtを利用してインストールをします。wgetして展開するよりは可読性良くなりますね。
https://suzuki-shunsuke.github.io/tfcmt/getting-started/#monorepo-support-target-variable
66行目で実際にtfcmtコマンドを使ってterraform planしていくわけですが、今回はstgとprdが別ディレクトリで管理しているため、 varでターゲットを指定しないと片方の関係しか通知通知が来ません。そこで、 引数で対象となる特殊変数を指定することで実行されるようになります。今回はstgなので、 -var "target:stg"
を追加します。 -patch
は既存のコメントを上書きしてくれるので必須にしましょう。 GITHUB_TOKEN
はGitHub側で自動生成するので、こちら側は特に設定する必要はありません。
- .github/workflows/stg_terraform-cd.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
name: Stg Terraform CD on: push: branches: [main] paths: - "terraform/stg/**" env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} SLACK_USERNAME: stg-terraform-cd SLACK_CHANNEL: notify_ci SLACK_ICON: https://avatars.githubusercontent.com/u/44036562?s=280&v=4 permissions: id-token: write contents: read pull-requests: write #追加 jobs: stg_terraform_cd: name: Stg Terraform CD runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@main with: role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/${{ env.AWS_ROLE_NAME }} role-session-name: ${{ env.AWS_ROLE_SESSION_NAME }} aws-region: ${{ env.AWS_REGION }} env: AWS_ROLE_NAME: githubactions-oidc AWS_ROLE_SESSION_NAME: githubactions-oidc AWS_REGION: ap-northeast-1 - name: Setup Terraform uses: hashicorp/setup-terraform@v2 with: terraform_version: 1.5.7 - name: Setup tfcmt #追加 uses: shmokmt/actions-setup-tfcmt@v2 with: version: v4.6.0 - name: Terraform init id: init working-directory: ./terraform/stg run: terraform init - name: Terraform apply id: apply working-directory: ./terraform/stg run: tfcmt -var "target:stg" apply -- terraform apply --auto-approve -no-color #変更 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Slack Success if: ${{ success() }} uses: rtCamp/action-slack-notify@v2 env: SLACK_TITLE: stg terraform apply Success SLACK_COLOR: good - name: Slack Failure if: ${{ failure() }} uses: rtCamp/action-slack-notify@v2 env: SLACK_TITLE: stg terraform apply Failure SLACK_COLOR: danger |
apply用のyamlファイルも基本planと変わらずといったところですね。prdのplanやapplyは以下となります。
- .github/workflows/prd_terraform-ci.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
name: Prd Terraform CI on: pull_request: paths: - "terraform/prd/**" ~省略~ - name: Terraform plan id: plan working-directory: ./terraform/prd run: tfcmt -var "target:prd" plan -patch -- terraform plan -no-color -input=false env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
- .github/workflows/prd_terraform-cd.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
name: Prd Terraform CD on: push: branches: [main] paths: - "terraform/prd/**" ~省略~ - name: Terraform apply id: apply working-directory: ./terraform/prd run: tfcmt -var "target:prd" apply -- terraform apply --auto-approve -no-color env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
動作確認
- stg plan(適当にセキュリティグループの差分を作ります)
- prd apply
環境ごとに通知が来ているので完璧です!
まとめ
モノレポでもtfcmtを利用してコメントを通知できました。超便利なので皆さんも利用してみてください!個人のCircleCIも導入しなければ..思ったのはModule化している場合だとプルリクエストにむちゃくちゃコメントされそうな予感。昔はtfnotifyがあったけどバージョンアップされてるのかな!?
0件のコメント