1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[IaCを学ぼう第3回] Terraform(HCL)における変数の使い方

Posted at

これは何?

IaCを学ぼうの第3回、Terraform(HCL)を使う場合の変数の概要と使い方を説明する記事です。

ちょっとだけ前回(第2回)の復習

前回は以下のようなresourceと呼ばれるものを記述しVPCを作成したと思います。

resource "aws_vpc" "vpc" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "test-vpc"
  }
}

今回はこのコードを更に利便性を高くするためにテコ入れしていきます。

どういうこと?

cidr_blocktagsの中のNameの部分を見てみましょう。
今はそれぞれ10.0.0.0/16test-vpcという値がコードに直接記述されています。
これでももちろん動作はしますが、通常はこの値が構築するインフラの要件によって変わりますよね。
記述したコードは基本複数のプロジェクトで使いまわされることが多いです。
毎回同じ内容を記述するのは時間がかかりますよね。

そんなときに値が変更になる部分は予め変数化しておき、必要な値をその都度代入出来るようにしておくと大変便利です。

変数の定義

プログラミングにおいても言語毎に定義のやり方はいろいろありますが
Terraformの場合はvariableとして表現します。
書式は以下です。

variable "変数名" {
  type      = 変数の型
  default   = デフォルト値
  sensitive = 値を秘匿化するかどうか
}

ひとまず何らかの文字列を格納する変数を定義する場合は以下のように記述します。

variable "string" {
  type      = string
  default   = "sato"
  sensitive = false
}

変数の参照

var.変数名という書き方をします。
aws_vpccidr_blockを変数化してみると以下のようになります。

variable "cidr_block" {
  type      = string
  default   = "10.0.0.0/16"
  sensitive = false
}

resource "aws_vpc" "vpc" {
  cidr_block = var.cidr_block

  tags = {
    Name = "test-vpc"
  }
}

変数に対する値の代入

デフォルト値を記述しておけばひとまずその値が格納された変数を定義出来ますが
Terraformでは複数のやり方で変数に値を代入することができます。

  • コマンドラインで対話的に入力
  • terraformコマンド実行時のオプションで指定
  • terraform.tfvarsファイルを利用
  • 環境変数に値を設定する

対話的に入力

以下のようにデフォルト値を指定しない状態で変数の定義のみやっておくと

variable "string" {
  type      = string
  sensitive = false
}

例えばterraform planを実行してみると対話的に値を入力して実行できます。

$ terraform plan
var.string
  Enter a value: sato

コマンド実行時のオプションで指定

変数の定義は同様で、以下のようにコマンド実行時の-varオプションで値を代入できます。

$ terraform plan -var 'string=sato'

terraform.tfvarsファイルを利用

terraform.tfvarsという変数の値が記述されたファイルを利用することも出来ます。
この方法が変数の代入で一番利用する頻度が多いと思います。

main.tf
variable "string" {
  type      = string
  sensitive = false
}
terraform.tfvars
string = "sato"

Terraformを実行するディレクトリにtfファイル群と別にterraform.tfvarsという名前で一緒に置いておくと
コマンド実行時に自動で読み込んでくれます。

ちなみにコマンド実行時のオプションとして-var-fileがあり
これを使うと別のtfvarファイルも読み込むことが可能です。

$ terraform plan -var-file=other.tfvars

環境変数に値を設定する

exportコマンド等で環境変数にセットした値を利用することも可能です。
環境変数名はTF_VAR_変数名という形にしておく必要があります。

export TF_VAR_string="sato"

変数のデータ型

プログラミング言語と同様に扱うデータによって変数の型が存在します。

文字列(string)

variable "string" {
  type      = string
  sensitive = false
}

値の参照はvar.変数名です。

param = var.string

数値(number)

variable "number" {
  type      = number
  default   = 10
  sensitive = false
}

値の参照はvar.変数名です。

param = var.number

真偽(bool)

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

値の参照はvar.変数名です。

param = var.bool

キーバリュー(object)

variable "object" {
  type = object({
    name = string
    age  = number
  })
  default = {
    name = "sato"
    age  = 21
  }
}

値の参照はvar.変数名.キー名です。
nameを参照する場合は以下のようになります。

param = var.object.name

各列の型が異なる配列(tuple)

variable "tuple" {
  type = tuple([
    string, number
  ])
  default = ["sato", 21]
}

値の参照はvar.変数名[要素番号]です。
satoを参照する場合は以下のようになります。

param = var.tuple[0] //21を参照する場合は[1]となります

各列の型が同じ配列(list)

variable "list" {
  type    = list(string)
  default = ["sato", "tanaka"]
}

値の参照はvar.変数名[要素番号]です。
satoを参照する場合は以下のようになります。

param = var.list[0] //tanakaを参照する場合は[1]となります

配列と言えば繰り返し構文ですよね。
Terraformにもcountfor_eachがあるので別記事になりますがまとめていきます。

キーが文字列の連想配列(map)

variable "map" {
  type = map(number)
  default = {
    "sato"   = 21
    "tanaka" = 22
  }
}

値の参照はvar.変数名.キー名です。

param = var.map.sato //値としては21というnumberが返ります

値の重複がない配列(set)

variable "set" {
  type = set(string)
  default = [
    "sato",
    "tanaka",
    "sato",
    "tanaka"
  ]
}

値の参照はvar.変数名です。

param = var.set

Terraformではoutputという記述ができます。
以下のコードでsetという変数の値を出力してみると

output "set" {
  value = var.set
}
Changes to Outputs:
  + set = [
      + "sato",
      + "tanaka",
    ]

重複した値が除かれた状態で参照出来ていますね。

内部変数もある

variableとは別にlocalsというものも存在します。
variableと異なり外部から値の上書きができませんが
変数定義の際に計算式を記述出来たりするのでとても便利です。

variable "environment" {
  type   = string
  default = "dev"
}

locals {
  instance_type = var.environment == "dev" ? "t3.micro" : "m6i.large"
}

local.変数名で変数の値を参照できます。

output "instance_type" {
  value = local.instance_type
}

まとめ

次回は第4回ということでresource間のリソースIDなどの動的参照について記事を書きます。
変数は定義・代入・参照を繰り返して多様するので覚えておきましょう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?