HCL

プリミティブ型(単一の値を持つ基本型)

データ型
string文字列
number数値
bool真偽値
【例:変数定義】

variable "vpc_id" {
  type = string
}

【例:出力定義】

output "vpc_id" {
  value = var.vpc_id
}

オブジェクト型(複数の属性名を持つ構造化データ)

データ型書式
object{
属性名1 = 値1
属性名2 = 値2
属性名3 = 値3
}
【例:変数定義】

variable "example" {
  type = object({
    name     = string
    cidr     = string
    public   = bool
  })
  default = {
    name   = "subnet-a"
    cidr   = "10.0.1.0/24"
    public = true
  }
}

【例:出力定義】

output "app_config_object" {
  value = local.app_config
  type = object({
    name     = string
    cidr     = string
    public   = bool
  })
}

【例:要素の取り出し】

name   = var.example.name            # ドット記法が推奨
cidr   = var.example.cidr
public = var.example.public

リスト型、配列(順序ありの値の集まり、重複可能)

データ型書式
list [値1, 値2, 値3]
【例:変数定義】


variable "example" {
  type    = list(string)
  default = ["ap-northeast-1a", "ap-northeast-1c"]
}

【例:出力定義】

output "features_list" {
  value = local.features_list      # type は省略可能
}


output "features_list" {
  value = local.features_list
  type  = list(string)
}

【例:要素の取り出し】

x = var.example[0]
y = var.example[1]

集合型(順序なしの値の集まり、重複不可)

set[値1, 値2, 値3]
【例:変数定義】

variable "example" {
  type    = set(string)
  default = ["monitoring", "logging", "tracing"]
}

【例:出力定義】

output "features_set" {
  value = local.features_list
  type  = set(string)
}

【例:要素の取り出し】

x = tolist(var.example)[0]           # set にインデックス指定は使用不可
y = tolist(var.example)[1]
z = tolist(var.example)[2]

辞書型(key-value のペア)

map{
キー1 = 値1
キー2 = 値2
キー3 = 値3
}
【例:変数の定義】

variable "instance_types" {
  type = map(string)
  default = {
    dev = "t2.micro"
    prd = "t3.large"
  }
}

【例:出力定義】

output "app_tags_map" {
  value = local.app_tags
  type  = map(string)
}

【例:要素の取り出し】

dev = var.instance_types["dev"]      # ブランケット記法が推奨
prd = var.instance_types["prd"] 

特殊な型指定子

データ型意味
any任意の型
nullnull値リテラル

HCL の for 式

for 式は、データ変換を行うための式です。リスト、マップ、セットといった元のデータ構造を入力として受け取り、変換処理を適用した結果をリスト、マップとして出力します。

HCL の for 式(list)

【書式】

[for item in var.list : 値]

[for item in var.list : 値 if 条件]

【例:for 式】

subnet_names = [for subnet in var.subnets : subnet.name]

【例:for 式、条件付き】

public_subnets = [for subnet in var.subnets : subnet if subnet.public == true]

HCL の for 式(set)

【書式】

[for item in var.set : 値]

[for item in var.set : 値 if 条件]

【例:for 式】

subnet_names = [for subnet in var.subnets : subnet.name]

【例:for 式、条件付き】

public_subnets = [for subnet in var.subnets : subnet if subnet.public == true]

HCL の for 式(map)

【書式】

{for key, value in var.map : 新 key => 新 value}

【例:for 式】

subnet_map = {for key, value in var.subnets : key => upper(value)}

for_each メタ引数

for_each は、resource ブロックまたは module ブロック内で使用するメタ引数で、複数のリソースインスタンスを動的に作成します。入力として受け付けるデータ型はマップまたはセットのみで、リストは使用できません。リストを使用したい場合は、toset() 関数を用いてセット型に変換する必要があります。作成された各リソースは each.keyeach.value を通じて個別に参照でき、リソース間で異なる設定を適用することができます。

HCL の for_each メタ引数(set)

【書式】

resource "リソースタイプ" "リソース名" {
  for_each = var.set

  # each.key でアクセス
}

【例:for_each メタ引数】

resource "aws_instance" "example" {
  for_each = var.names

  ami           = "ami-0c3fd0f5d33134a76"
  instance_type = "t2.micro"

  tags = {
    Name = each.key
  }
}

HCL の for_each メタ引数(map)

【書式】

resource "リソースタイプ" "リソース名" {
  for_each = var.map
  
  # each.key と each.value でアクセス
}

【例:for_each メタ引数】

resource "aws_subnet" "example" {
  for_each = subnets_map

  vpc_id                  = var.vpc_id
  cidr_block              = each.value.cidr
  availability_zone       = each.value.az

  tags = {
    Name = each.value.name
  }
}

HCLの関数処理内容
values(map)マップから全ての値をリストとして取得
lookup(map, 検索key, default)マップから指定キーの値を取得
存在しない場合はデフォルト値を返す
concat(list1, list2, …)複数のリストを連結
length(value)list、map、set、string の要素数を取得
toset(list)リストをセットに変換(重複を自動削除)
tolist(set)セットをリストに変換
join(separator, list)リストを区切り文字で結合
split(separator, string)文字列を区切り文字で分割してリスト化
substr(string, offset, length)文字列の一部を抽出
ofset:開始位置
length:抽出文字数
file(path)ファイルの内容を文字列として読み込む
base64encode(string)文字列をBase64エンコード
base64decode(string)Base64文字列をデコード
jsonencode(value)HCLの値をJSON文字列に変換
jsondecode(json_string)JSON文字列をHCLの値に変換
try(式1, 式2, …, 式N)左から順に評価し、最初に成功した値を返す