Terraformのapplyでtargetを指定しているにも関わらず、それ以外のリソースが差分として出てくる場合

タイトルのようなことがあって困ったので、忘れないようにメモ。

Terraformのtargetオプション

Terraformを使っていると「このresourceに関するところだけ差分を見たい」「あのモジュールに関するところだけapplyしたい」ということが時々ある。いつもあっては困るのだが、例外的な取り扱いをしている場合とかにたまにある。そうした場合、targetオプションはスコープを狭めることができるので便利。

% terraform plan -target hoge.fuga

targetで指定した以外のリソースも差分として出てくる場合

が、targetで指定したもの以外が差分として検知されてしまう場合がある。どういう時かというと

  • xxxをtargetに指定
  • xxxが依存しているリソースにyyyやzzzがある
  • yyyやzzzにも差分がある

というケース。この場合、terraform plan -target xxxとやっても、yyyやzzzに関する差分が検出されてしまう。targetの指定の仕方が悪いのかと思ってしばらくはまっていた。理由を知ると「それはそうか...」という気持ちになるが、気付かないと結構分からなくて困った。

depends_onなどで明示的に依存関係を書いているときはまだ気付けるが、varなどで参照しているだけというときは結構気付きにくい。terraformのstateファイルをterraform state pull | jq .などと見ると、明示的でない依存関係も

          "dependencies": [
            "module.hoge.fuga",
            "abc"
          ]

などという風に列挙されているので、この辺をヒントに紐解いていくことができそう。あと、一応helpコマンドには以下のようにdependenciesのこともちゃんと言及されてあり、ヘルプをちゃんと読め...という話でもあった。

  -target=resource    Limit the planning operation to only the given module,
                      resource, or resource instance and all of its
                      dependencies. You can use this option multiple times to
                      include more than one object. This is for exceptional
                      use only.