🔍
terraform consoleでモジュールの中のlocal変数をデバッグする方法
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
module のコードの fmt ができていない(
}
が足りない)のと、output のところにlocal.
が要るのとkey_1 = v.key1
が間違っているのでサンプルコードが動かないの直したほうがいいかも。本家ではこのへん
確かにすっごい昔(少なくても5年以上前)はできた気もするけど中の人も覚えてない感じなので
とはいえ、そもそも module の locals の値をデバッグしないといけないほど複雑な作りにするのがそもそもよくない、という話。。。
コメントありがとうございます!(すっかり古いコードのまま差し替え忘れていました)
いろいろリファレンスもいただきありがとうございます。
その通りですね。大事なことなので記事の上部のメッセージにも追加しておきました