
プリミティブ型(単一の値を持つ基本型)
| データ型 | 値 |
|---|---|
| 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 | 任意の型 |
| null | null値リテラル |
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.key と each.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) | 左から順に評価し、最初に成功した値を返す |