【Terraform】記述構文について
HCL とは
こちらに記載している通り,Terraform の構文は json に見えますが,実は Terraform 独自の言語(HashiCorp Configuration Language(以下:HCL))です。
Terraform で使用する拡張子が「.tf」のファイルはこの構文で記述したコードを入れます。
すると,$terraform plan や $terraform apply 時に Terraform がコードを読み込み,クラウド上に自動でリソースを構築します。
ブロック
HCL はリソースやデータなどをブロックという単位で記述していきます。
ブロックには主に以下のような種類が存在します。それぞれ用途があります。
- variable
- locals
- resource
- data
- output
- provider
変数関連
variable 変数
- 書式
variable の後に変数名,中かっこで中に変数名とその値を記載します。
variable example {
default = "fuga"
}
- 特徴
variable はコマンド( $terraform plan や $terraform apply )実行時にその変数の値を任意の値で上書きして実行することが可能です(上書きしない場合は default に設定した値が採用されます)。
例えば,コマンド実行時にオプション「-var」で上書きするといかような感じです。
$ terraform plan -var 'example=hoge'
- 参照方法(リソースブロックや locals ブロックから)
「var.<変数名>.<値>」で参照する
variable "user_information" {
type = object({
name = string
address = string
})
}
resource "some_resource" "a" {
name = var.user_information.name
address = var.user_information.address
}
locals 変数
- 書式
locals の後に中かっこで中に変数名とその値を記載します。
locals {
example_s3_bucket_name = "hoge"
}
locals はコマンド実行時に変数を上書きすることはできません。
- locals ブロックは複数定義可能
リソース毎など用途に応じてブロック分けて記述することが可能なので,可読性が高まります。
例
# Storage Account の定義
locals {
account_name = "fugafuga"
}
# Virtual Machines の定義
locals {
vm_name = "hogehoge"
vm_disk_size = "20"
}
- 使用可能なデータ型の幅が広い
以下のようなデータ型が使用可能です。- bool型
- 数値型(10進数)
- 数値型(16進数)
- String
- list
- map
- 上記の複合
- 参照方法(リソースブロックや locals ブロックから)
「local.<変数名>」で参照する
resource "aws_instance" "example" {
# ...
tags = local.common_tags
}
variable 変数と比較した locals 変数
- 定義時に関数や他のリソース参照ができる
例
locals {
fuga = "hoge"
#input 変数が定義されていたら1が,そうでない場合は0が代入されます(関数が使用可能)
fuga = "${var.input == "" ? 1 : 0}"
#定義時に他で定義した変数の値を参照可能
hoge = "{$local.account_name}"
}
- 定義したものはコマンド実行時など外部から変更できない
variabe 変数はコマンド実行時にその値を変更することができますが,locals 変数は変更できません。また,output で外部から参照することもできないです(output 経由なら見える)。
variable 変数と locals 変数の使いどころ
基本的には変数は locals にまとめた方が良いと個人的には考えています。
柔軟に変える必要のある環境名などは variable 変数に定義しておいて,その値を locals 変数から参照する,というのがベストかなと考えています。
例えば,変えてはいけないような設定値を variable に設定した場合はコマンド実行者次第で任意の値に変更することができてしまうので,危険な可能性もあります。
プロバイダーブロック
- 書式
使用するクラウドプロバイダー毎にこのブロックが用意されています。
Terraform を実行するディレクトリ毎に必要になります,ない場合はエラーになるので注意。
自分が使うプロバイダーをチェックしましょう。
Providers
#AWS の場合
provider "aws" {
# Configuration options
}
#Azure の場合
provider "azurerm" {
features {}
version = "2.54.0"
}
リソースブロック
Resource Block
クラウド上のリソースを定義するブロックです。
Terraform の中核をなすブロックでリソースの作成などに必須のブロックです。
- 書式
resource "aws_instance" "web" {
ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
}
ドキュメントの読み方については別の投稿を参照してください(こちら)
データブロック
data Source
Terraform で管理していない( tfstate ファイルに情報が載っていない)リソースを Terraform が認識するために必要なブロック。
例えば,コンソール上で手動で作成したリソースに関しては,tfstate ファイルに情報が載りません。ただ,手動で作成したリソース情報を参照して,Terraform でリソースを作成したいケースがあります。そういう場合に有効です。
- 書式
data "aws_s3_bucket" "selected" {
bucket = "a-test-bucket"
}
ドキュメントの読み方については別の投稿を参照してください(こちら)
Discussion