はじめに
これまであまり使わなかったが、terraformの関数values
,keys
を使うケースがあったので使い方を記載する。
さらに、ネストされたmapから取得する方法も記載する。
公式ページは以下
mapで記載された場合の取得方法
mapにて以下のように記載があったとする。
terraform.tf
variable "subnet" {
type = map
default = {}
}
terraform.tfvars
subnet = {
"1a" = "10.0.0.0/20",
"1c" = "10.0.16.0/20",
"1d" = "10.0.32.0/20"
}
この場合、それぞれの値を取得したい際は、関数values
を使用すればvaluesが取得できる。
この際はmap
からlist
となる。
output "subnet" {
value = values(var.subnet)
}
--- result ---
tolist([
"10.0.0.0/20",
"10.0.16.0/20",
"10.0.32.0/20",
])
keyの値を取得したい際は、関数keys
を使用すればkeyが取得できる。
output "subnet_key" {
value = keys(var.subnet)
}
--- result ---
tolist([
"1a",
"1c",
"1d",
])
ネストされたmapから特定の値を取得したいとき
ここからが本題。mapにてネストされた以下のような記載があったとする。
terraform.tf
variable "subnet_nest" {
type = map(object({
az = string
subnet_public = string
}))
default = {}
}
terraform.tfvars
subnet_nest = {
"1a" = {
az = "ap-northeast-1a"
subnet_public = "10.0.0.0/20"
},
"1c" = {
az = "ap-northeast-1c"
subnet_public = "10.0.16.0/20"
},
"1d" = {
az = "ap-northeast-1d"
subnet_public = "10.0.32.0/20"
}
}
先程と同様にすると、以下のように複数の値が取得できる
output "subnet_nest" {
value = values(var.subnet_nest)
}
--- result ---
tolist([
{
"az" = "ap-northeast-1a"
"subnet_public" = "10.0.0.0/20"
},
{
"az" = "ap-northeast-1c"
"subnet_public" = "10.0.16.0/20"
},
{
"az" = "ap-northeast-1d"
"subnet_public" = "10.0.32.0/20"
},
])
ここから特定の値を出力したい際は以下のように設定する
output "subnet_nest_az" {
value = values(var.subnet_nest)[*].az
}
--- result ---
tolist([
"ap-northeast-1a",
"ap-northeast-1c",
"ap-northeast-1d",
])
output "subnet_nest_cidr" {
value = values(var.subnet_nest)[*].subnet_public
}
--- result ---
tolist([
"10.0.0.0/20",
"10.0.16.0/20",
"10.0.32.0/20",
])
key取得は同様
output "subnet_nest_key" {
value = keys(var.subnet_nest)
}
--- result ---
tolist([
"1a",
"1c",
"1d",
])
その他
ネストされたmapを扱うときは取得方法なども合わせて調べると良い。
あとは、mapのkeyとvalueを入れ替える関数transposeのあるのでいずれ試してみたい。