開発日報

窓際エンジニアの開発備忘。日報は嘘です。

【忘備】Terraform基本構文 ~変数とデータ型~

変数

HCL2で利用可能な変数は2種類

  • locals : ローカル変数。プライベートな変数で外部から変更はできない。
  • variables : 外部から変更可能な変数。コマンドライン実行時にオプションやファイル指定で上書きできる。

locals の定義と参照

「localsブロックで」定義して「${local.【Name】}」で参照

locals {
  project = "testylog"
  env     = "dev"
}

resource <RESOURCE_TYPE> <RESOURCE_NAME> {
  ...
  tags = {
    Name = "${local.project}-${local.env}-vpc"
  }

  output<OUTPUT_NAME> {
    ...
  }
}

variablesの定義と参照

「variableブロック」で変数を1つ定義し、「${var.【NAME】}」で参照

variable "project" {
  type    = string
  default = "tastylog"
}

resource <RESOURCE_TYPE> <RESOURCE_NAME> {
  ...
  tags = {
    Name = "${var.project}-dev-vpc"
  }

  output<OUTPUT_NAME> {
    ...
  }
}

データ型

HCLで扱えるデータ型、

  • プリミティブ
    • string : Unicode文字列
    • number : 数値。整数と少数の両方を表現
    • bool : true/falseの2つ
  • 構造体
    • object : キーバリュー型データ
    • tuple : 各列の方が決まっている配列
  • コレクション
    • list : 特定の方で構成される配列
    • map : キーが文字列の配列
    • set : 値の重複がない配列

プリミティブ

基本となるデータ型

variable "message" {
  type    = string
  default = "Hello World"
}

variable "max_count" {
  type    = number
  default = 10
}

variable "is_enable" {
  type    = bool
  default = true
}

Object

キーバリュー形式で定義されるデータ型。キーごとに方の定義が可能。

variable "obj_sample" {
  type = object({
    name = string
    age  = number
  })
  default = {
    name = "tabaka"
    age  = 28
  }
}
username = var.obj_sample.name

tuple

配列のN番目にどういった型を使うかが決められたデータ型。下の例だと0要素目が文字列、1要素目が数値。

variable "tuple_sample" {
  type = tuple([
    string, number
  ])
  default = ["tanaka", 28]
}
username = var.tuple_sample[0]

list

すべて同じ型で定義される配列

variable "list_sample" {
  type   = list(string)
  default = ["tanaka", "sato"]
}
username = var.list_sample[0]

map

キーが文字列、バリューが指定された方となる配列。

variable "map_sample" {
  type = map(string)
  default = {
    "High" = "m5.2xlarge"
    "Mid"  = "m5.large"
    "Low"  = "t2.micro"
  }
}
instance = var.map_sample.High

set

バリューの重複が排除される配列

variable "set_sample" {
  type = set(string)
  default = [
    "tanaka",
    "sato",
    "tanaka",
    "sato"
  ]
}
[for itm in var.set_samle : itm]

→ toset([
    "sato",
    "tanaka"
  ])