🏝️

Atlantis の Plan 結果を見やすく!ノイズ削減と AI 要約で快適レビュー

に公開

初めまして。株式会社バニッシュ・スタンダードでインフラを担当している tkonno と申します。
普段は AWS や Terraform を使ったインフラの構築や運用を行っています。
本記事では弊社でも Terraform の CI/CD ツールとして利用している Atlantis の Plan 結果のコメントを見やすくする方法についてご紹介します。

はじめに

弊社では Terraform の実行を Atlantis で管理しており、プルリクエストに対して Atlantis が自動で plan や apply の結果をコメントしてくれます。
非常に便利なツールですが、以下のような問題があり、レビューがしにくいと感じることがありました。

  • 管理対象リソースが多いディレクトリに対して変更を加える場合、Refreshing state...の出力が多くなり、差分が見づらくなる。
  • 複数のディレクトリに対して plan が実行された場合、差分がないディレクトリのコメントが表示されてしまう。
  • 同じプルリクエストで複数回 plan を実行する場合、以前の Plan 結果のコメントが表示されたままになる。
  • 差分が多い場合、複数のコメントに分割されてしまい、意図しない差分に気づきづらい。

この記事ではこれらの問題を解決し、コメントを見やすくすることでそのようなレビューのしづらさを解消する方法についてご紹介します。

この記事の対象読者

  • これから Atlantis を導入しようとしている方
  • すでに Atlantis を導入しており、Plan 結果のコメントを見やすくしたい方

環境

  • Atlantis: 0.33.0
  • Terraform: 1.11.3

Refreshing state...の出力を非表示にする

Atlantis からterraform planを実行するには以下の 2 つの方法があります。

workflows:
  # run から実行する場合
  hoge:
    plan:
      steps:
        - run: terraform init
        - run: terraform plan -out $PLANFILE
  # plan から実行する場合
  fuga:
    plan:
      steps:
        - init
        - plan

runステップを使用するとoutputの制御や他のコマンドとの組み合わせが可能になるため、より柔軟な設定が行えます。
ただし、runステップからterraform planを実行すると、デフォルトではRefreshing state...の出力が表示されてしまいます。
これを非表示にするには、runステップにoutput: strip_refreshingオプションを追加します。

repos.yaml
repos:
  - id: /.*/
    workflow: hoge

workflows:
  hoge:
    plan:
      steps:
        - run:
            command: terraform init
            output: hide
        - run:
            command: terraform plan -out $PLANFILE
            output: strip_refreshing

Plan 結果のコメントには以下のように差分だけが表示されるようになります。

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # aws_instance.hoge will be updated in-place
  ~ resource "aws_instance" "hoge" {
        # 略
    }

Plan: 0 to add, 1 to change, 0 to destroy.

差分がない場合のコメントを非表示にする

Terraform や Provider のバージョンアップなどで複数のディレクトリに対して plan が実行された場合、差分がない場合でもコメントが表示されてしまいます。
こちらもレビューのノイズになってしまいますので、差分がある場合のみコメントを表示するようにします。
環境変数ATLANTIS_HIDE_UNCHANGED_PLAN_COMMENTStrueに設定する、もしくはサーバ起動時のフラグで--hide-unchanged-plan-commentsを指定することで、差分がない場合のコメントを非表示にすることができます。

以前の Plan 結果を非表示にする

プルリクエストに何度も atlantis plan を実行すると、コメントが増えてノイズになりがちかと思います。
環境変数ATLANTIS_HIDE_PREV_PLAN_COMMENTStrueに設定する、もしくはサーバ起動時のフラグで--hide-prev-plan-commentsを指定することで、以前の Plan 結果を非表示にすることができます。

Plan 結果を要約する

差分が多い場合、意図しない差分に気づきづらいことがあります。
例えば手動で設定を変更した場合、意図せず設定を元に戻してしまうリスクがあります。
Plan 結果を要約するコメントを追加することでそのような意図しない変更に気づきやすくすることができます。
調査したところ Amazon Bedrock を利用して Plan 結果を要約する方法が公開されていましたので、参考にさせていただきました。

記事を参考に python のスクリプトを作成し、terraform show の出力を要約します。
スクリプトの詳細は割愛しますが、以下のように repos.yaml にカスタムワークフローを追加することで Plan 結果を要約したコメントを追加することができます。

repos.yaml
repos:
  - id: /.*/
    workflow: hoge

workflows:
  hoge:
    plan:
      steps:
        - run:
            command: terraform init
        - run:
            command: terraform plan -out $PLANFILE
            output: strip_refreshing
        - run: terraform show -no-color $PLANFILE | summary.py -p hoge

コメントは以下のようになります。

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:

  # aws_iam_role.hoge will be created
+ resource "aws_iam_role" "hoge" {
    # 略
  }

  # aws_iam_role_policy_attachment.hoge will be created
+ resource "aws_iam_role_policy_attachment" "hoge" {
    # 略
  }

Plan: 2 to add, 0 to change, 0 to destroy.

 Terraformが実行する変更の概要は以下の通りです:

- aws_iam_role.hoge リソースを新規作成
- aws_iam_role_policy_attachment.hoge リソースを新規作成

以上の2つのリソースが新規に作成されます。

変更対象が少ないのでメリットを感じづらいかもしれませんが、実際には数百行にも及ぶ Plan 結果を要約してくれるので、非常に便利に感じています。

まとめ

本記事では Atlantis の Plan 結果のコメントを見やすくする方法についてご紹介しました。
ぜひ参考にしていただき、Atlantis の導入や運用に役立てていただければ幸いです。

参考文献

株式会社バニッシュ・スタンダード

Discussion