ENECHANGE Developer Blog

ENECHANGE開発者ブログ

Terraformのdiff(差分)を見やすくする

プラットフォーム事業部のtaki(@yuyasat)です。 最近、とあるクライアントのインフラを構築しています。いつもであればインフラの基本的な構築はインフラ部門に任せます。ですが、今回は、ElasticBeanstalkがメインとなる構成であるものの、Webサーバだけでなく、バッチ処理を行うためのWorkerも利用し、さらにAWS Lambda等とも連携するため、構築後の動作確認は主にアプリケーションエンジニア側で行なっています。

一発でうまくいけばいいのですが、大抵は設定漏れや環境変数が間違っているなど様々な理由により、初回構築時はうまくいきません。その原因追求のため、アプリケーションエンジニア側でも環境を再構築することがあります。その際、弊社ではインフラを Terraform で管理しているので Terraform のコマンドを実行することになります。

今回、私は初めて Terraform を使ったのですが、現在のインフラ構成と Terraform のコード上の差分を確認するためのコマンドterraform planの結果をみて驚きました。差分が非常に見にくいのです。 例えば、図1に示すように、一つのリソースに差分があると、そのリソースの属性すべてが変更がないものも含めて出力されてしまいます。

f:id:yuyasat:20180910155254p:plain 図1. terraform planを実行した時の様子。実際にはもっと長く続く。

これでは、どの属性に差分があるのかを把握することは容易ではありません。たとえば、Timeoutの値を変更しただけでも、その他の変更のないものも全て出力されてしまいます。本来ならば、図2のように、差分があるものだけ表示してほしいのです。

f:id:yuyasat:20180910155322p:plain 図2. 差分があるものだけ表示されるようにしたい。

Terraformのgithubのissueにおいても、改善案として挙げられていますが、記事執筆時現在、まだ対応はされていません。しかし、こうしたフラストレーションが散り積もって行くと、インフラをコードで管理するのが億劫になってしまいますし、ミスも起きやすくなってしまいます。インフラでのミスはサービス断にも繋がる由々しきことです。

そこで、差分を見やすくするスクリプトを普段使っているrubyで実装してみました。リスト1が実際に使っている差分を見やすくするスクリプトです。これを.bashrcなどに追加して利用します。(.bashrcを変更した後、source ~/.bashrcをするのをお忘れなく。)

alias terr_colored_diff=$(cat <<EOS
  ruby -ne '
    input = \$_;
    if !input.nil? && input.include?("=>") then
      print input.split("\"")[-4] == input.split("\"")[-2] ? "#{input}\e[0m" : "\e[34m#{input}\e[0m"
    else
      print "#{input}\e[0m"
    end
  '
EOS
)
alias terr_delete_no_diff=$(cat <<EOS
  ruby -ne '
    input = \$_;
    if !input.nil? && input.include?("=>") then
      print input.split("\"")[-4] == input.split("\"")[-2] ? nil : "\e[34m#{input}\e[0m"
    else
      print "#{input}\e[0m"
    end
  '
EOS
)
リスト1. Terraformの差分を見やすくするrubyスクリプト

実際の使い方は、リスト2のようにterraform planコマンドにパイプ(|)で繋げて利用します。

terraform plan | terr_colored_diff
terraform plan | terr_delete_no_diff
リスト2. terr_colored_diff、terr_delete_no_diffの使用例。

今回二つのスクリプトを用意しました。

terr_colored_diffは今まで通り変更のないものも含めて表示させ変更のある部分にだけ色をつけます。
terr_delete_no_diffは変更のないものは表示せず、変更のあるものだけ色をつけて表示してくれます。

図3にterraform plan | terr_delete_no_diffの実行結果を示します。なぜか、settings.#のところの色がつかないバグがあるのですが、きちんと差分だけを表示できています。

f:id:yuyasat:20180910155335p:plain 図3. terraform plan | terr_delete_no_diffの実行結果。

なお、Terraformのversionは、v0.11.8を利用しており、違うversionではうまく動かないかもしれません。

これでTerraformの差分を見るストレスが軽減されました。Terraformには、applyしたばかりでもなぜか差分が見えてしまうというようなことがあります。Terraformの設定の仕方が悪いのかTerraformの不具合なのかは調査中ですが、今回のスクリプトを用いれば、表示させる項目が絞られるのでそうした事態にも対応しやすそうです。

追記: 記事を投稿してから同様な機能を提供するterraform_landscapeというgemがありました。車輪の再発明をしてしまったようです。