🔍

terraform consoleでモジュールの中のlocal変数をデバッグする方法

2024/08/25に公開
2

Terraformで複数の環境を管理する方法はいくつかありますが、私がよく採用するのは、モジュールを作成して再利用する方法です。

モジュール内でDRYな設計を目指すために、local変数でmapを定義しfor_eachでリソースを作成することが多いです。ただし、flattenなどの関数を使って加工してからリソースに渡す必要がある場合もあります。
慣れてくると、これで合っているなと書きながら分かるのですが、Terraformは頻繁に使うものではないので、「これで合ってるかな?」と不安になることがあります。

そんな時に重宝するのがterraform consoleコマンドです。
ただし、モジュール内のlocal変数を扱う際には少し工夫が必要なので、備忘録として残しておきます(もっと良い方法があるかもしれませんが…)。

結論

outputに設定して渡せばOKです。

例えば、モジュール内で以下のように設定すると確認できます。

locals {
  map_sample = {
    key = {
      key_1 = "value_1"
      key_2 = [
        "value_2_1",
        "value_2_2"
      ]
    }
  }

  # これがちゃんと展開されているか確認したい
  flatten_map_sample = flatten([
    for k, v in local.map_sample : [
      for i, l in v.key_2 : {
        key_1 = v.key_1,
        key_2 = l
      }
    ]
  ])
}

output "debug" {
  value = local.flatten_map_sample
}

これで、terraform console を実行し、module.<module名>.debug を表示すれば確認可能です。

$ terraform console
> module.objects.debug
[
  {
    "key_1" = "value_1"
    "key_2" = "value_2_1"
  },
  {
    "key_1" = "value_1"
    "key_2" = "value_2_2"
  },
]
>  

ちなみに、トップレベルのlocalはそのまま local.<変数名> で確認できます。

最後に

他に良い方法があれば、随時更新していきます!(この方法でそこまで困ってはいないのですが)
(コメントもいただいておりますが、昔はもう少し方法があったようですが、いろいろ副作用があるみたいなので消えていった経緯があるようです。)

修正履歴

2024/08/26 記事投稿時点で古いコード貼っていたので差し替えて、そもそも変数を乱用しすぎないように注意しましょうというメッセージも追加。

Discussion

rakiraki

module のコードの fmt ができていない(}が足りない)のと、output のところに local. が要るのと key_1 = v.key1 が間違っているのでサンプルコードが動かないの直したほうがいいかも。

本家ではこのへん
https://github.com/hashicorp/terraform/issues/31861#issuecomment-2197417765

確かにすっごい昔(少なくても5年以上前)はできた気もするけど中の人も覚えてない感じなので
https://github.com/hashicorp/terraform/issues/34252#issuecomment-1814751085

とはいえ、そもそも module の locals の値をデバッグしないといけないほど複雑な作りにするのがそもそもよくない、という話。。。

jimatomojimatomo

コメントありがとうございます!(すっかり古いコードのまま差し替え忘れていました)
いろいろリファレンスもいただきありがとうございます。

とはいえ、そもそも module の locals の値をデバッグしないといけないほど複雑な作りにするのがそもそもよくない、という話。。。

その通りですね。大事なことなので記事の上部のメッセージにも追加しておきました