自由気ままに書いちゃおう

好きなことをつらつらと・・・

【Terraform】(初心者向け)MapとObjectの違いについて

今回は、MapとObjectの違いについてです。

 

■ はじめに

Map:

Type Constraints - Configuration Language | Terraform | HashiCorp Developer

 

Object:

Type Constraints - Configuration Language | Terraform | HashiCorp Developer

 

■ わかりにくいところ

MapもObjectも書式は以下の通り、同じです。。。

Types and Values - Configuration Language | Terraform | HashiCorp Developer

 

「{<KEY> = <VALUE>}」のペアを含む中括弧の組で表現されます。
なので、カッコの種類とかで判別することはできません。

■ MapとObjectの違いについて

前置きが長くなりましたが、MapとObjectで何が違うのか。。。。

 

Mapは以下の制約があります。

1.Mapの中のKeyは文字列である
2.Mapの中のValueは、すべて同じ型である

 

反対にObjectには、Mapのような制約はありません。

 

つまり、以下のような感じです。

locals {
  name_map = { # Map
    "dev1" = "develop1"
    "dev2" = "develop2"
    "dev3" = "develop3"
    "dev4" = "develop4"
  }

  test_object = { # Object
    test_string = "string"
    test_value  = 1
    test_list   = ["list1", "list2"]
    test_bool   = true
    1           = "one"
  }
}

 

MapとObjectの出力のために、下記のようなoutput(①、②、③)を用意し、

output "name_map" { # ① Map用のoutput
  value = local.name_map
}

output "test_object_all" { # ② Object用のoutput(すべて出力)
  value = local.test_object
}

output "test_object_string" { # ③ Object用のoutput(一部キーのみを指定して出力)
  value = local.test_object.test_string
}

この出力結果は以下の通りです。

   name_map           = { # ① Map の出力結果
       dev1 = "develop1"
       dev2 = "develop2"
       dev3 = "develop3"
       dev4 = "develop4"
    }
 
   test_object_all    = { # ② Objectをすべて出力
       1           = "one"
       test_bool   = true
       test_list   = [
           "list1",
           "list2",
        ]
       test_string = "string"
       test_value  = 1
    }
 
   test_object_string = "string" # ③ Objectの一部キーのみを指定して出力

 

■ local変数の場合、型のTypeを明示しないけど・・・

local変数の場合、variableと違い、型のTypeを宣言しないことからあまり神経質にならなくても問題ないことが多いです。

 

以上です。