Terraform Plan/Apply結果の自動通知
バックエンドエンジニアのYです。株式会社ラクス様が主催された自動化大好きエンジニアLT会 - vol.7にて発表した内容をまとめます。発表資料はSpeaker Deckにて公開しています。
所属している株式会社SprocketではTerraformを用いてインフラリソースをIaC管理しています。TerraformのPlanおよびApplyはGitHubへのPushをトリガーとしてAWS CodeBuild上で実行されるよう構築しています。LT会ではタイトル通り、PlanとApplyの結果をどのように通知しているかを発表しました。
実際の通知
まず、実際にどのような通知を受け取っているのかを紹介します。Plan結果はGitHubのコメントとして投稿しています。コミットにリンクして投稿されているため、Pull Request画面ではコミットに対応するPlan結果を見ることができます。これにより、レビュー時にストレスなくコードと合わせてPlan結果までチェックできます。
Apply結果はSlackへの投稿として通知しています。成否が一目でわかるように成功と失敗を色によって分けています。Slackへ投稿することにより、結果確認を失念し、Applyが失敗していることに気づかず放置してしまうといったことが防げます。
結果通知を導入したことによる変化
結果通知を導入したことにより開発体験がどのように変化したのかを紹介します。結果通知を導入する前は以下のようなフローでTerraformコードを開発していました。
- ベースとなるブランチから作業ブランチを作成し、開発する。
- 目的の機能追加が完了するとPull Requestを作成する。
- 作業ブランチのプッシュをトリガーとしてCodeBuild上でTerraform Planが実行される。
- GitHubのPull Request画面に成否が反映される。
- アサインされたレビュアーはコードとPlan結果をレビューする。Plan内容の確認はAWSコンソールへログインし、行う。
- レビューの内容を受けてコードを修正する。
- レビュアーのApproveをもらったのち作業ブランチをベースのブランチへマージ
- GitHubのCIステータスをチェックし、Applyが成功したことを確認
以上の開発フローでは次のような問題点がありました。
- Plan結果の確認にはAWSコンソールへのログインが都度必要で、画面の行き来に時間がかかる。
- Applyの失敗を見逃したまま放置してしまう危険性がある。
結果通知を導入することにより、開発フローのうちAWSコンソール上でのPlan結果の確認とGitHub上でのApplyの結果確認が省略されました。それにより、これらの問題が解消され、開発効率も向上しています。
Plan結果の通知の実現方法
Plan結果の通知はtfnotifyというOSSツールを使用しています。今回はGitHubのコメントへPlan結果を投稿しましたが、tfnotifyは他にもGitLabにおけるコメントやSlack投稿にも対応しています。また、サポートされているCI環境を見ると、ほとんどのもので利用可能であることがわかります。
使用方法としては次のように、Planの実行をパイプで繋ぐだけです。
terraform plan | tfnotify plan
設定ファイルによる挙動の制御も可能です。投稿内容のテンプレートなども設定ファイルへ指定できます。
Apply通知の実現方法
Apply結果の通知はEventBridgeとLambdaにより実装しています。CodeBuildの実行結果イベントをトリガーとしてLambdaを発火します。Lambdaは結果を加工し、SlackのWebhook URLへポストしています。
Lambda関数自体はGoで書かれています。
まとめ・所感
Terraformのコードを開発する際、PlanおよびApplyの実行はGitHubへのPushをトリガーにCodeBuild上で実行しています。Plan、Applyそれぞれの実行結果の通知をどのように行なっているかを紹介しました。Plan結果をGitHubへコメントとして通知することにより、AWSコンソールへの行き来を無くすことができました。これにより、開発効率が大きく向上する結果となりました。
Sprocketで働きませんか?
弊社ではカジュアル面談を実施しております。
ご興味を持たれましたら、こちらからご応募お待ちしております。
Discussion