初めに
お疲れさまです。オオタケです。
現在、Terraform を使用した現場に従事しており、その中で便利だと感じた関数やオプションについて、備忘も兼ねてまとめます。
compact()
compact() を使うことで、リスト内に ""(空文字)や null が含まれていた場合、無視してリストに起こすことができます。
例: 値に空文字 "" を含めた場合の plan 実行例
複数の環境(面)ごとに .tfvars ファイルを作成する際、
「この環境では特定の値をリストに含めたくない」というケースがあります。
そのとき、単に "" と記述してしまうと、そのままリストに入り構築時にエラーになることがあります。
そこで compact() を使用することで、空文字を自動的に除外できます。
資材
compact_test1 = "hoge"
compact_test2 = "fuga"
compact_test3 = "piyo"
compact_test1 = "hoge"
compact_test2 = ""
compact_test3 = "piyo"
compact_test1 = "hoge"
compact_test2 = "fuga"
compact_test3 = ""
variable "compact_test1" {
type = string
}
variable "compact_test2" {
type = string
}
variable "compact_test3" {
type = string
}
locals {
compact_values = compact([
var.compact_test1,
var.compact_test2,
var.compact_test3
])
}
output "compact_values" {
value = local.compact_values
}
出力結果
$ terraform plan -var-file=dev.tfvars
compact_values = [
"hoge",
"fuga",
"piyo",
]
$ terraform plan -var-file=stg.tfvars
compact_values = [
"hoge",
"piyo",
]
$ terraform plan -var-file=prd.tfvars
compact_values = [
"hoge",
"fuga",
]
for_each
Terraformで同じ種類のリソースを複数作成したいときに便利な構文。
構築数を増やしたいときは for_each に渡すリストに要素を追加するだけでOK
めちゃ便利。
例: 設定値が違うリソースを複数個構築
資材
gce_for_each = [
{
"instance_name" = "name1",
"machine_type" = "e2-medium",
"zone" = "asia-northeast1-a"
},
{
"instance_name" = "name2",
"machine_type" = "e2-standard-2",
"zone" = "asia-northeast1-a"
},
{ "instance_name" = "name3",
"machine_type" = "e2-standard-8",
"zone" = "asia-northeast2-a"
},
{
"instance_name" = "name4",
"machine_type" = "e2-highmem-2",
"zone" = "asia-northeast2-a"
},
]
resource "google_compute_instance" "for_each_demo" {
for_each = { for i in var.gce_for_each : i.instance_name => i }
name = each.value.instance_name
machine_type = each.value.machine_type
zone = each.value.zone
~~~~~~~~~省略~~~~~~~~~
出力結果
$ terraform plan -var-file=dev.tfvars
~~~~~~~~~省略~~~~~~~~~
lifecycle{ignore_changes = []}
「デプロイ実行時に考慮から外す」といった書き方が可能。
初期構築後に設定値を手動で変更した際、通常は terraform plan で差分が発生します。
しかし、ignore_changes を使用することでデプロイ時に変更を無視することができます。
例: 初期構築後、手動でマシンタイプを一時変更している場合
資材
instance_name = "hoge-instance"
machine_type = "e2-medium"
zone = "asia-northeast1"
resource "google_compute_instance" "ignore_demo" {
name = var.instance_name
machine_type = var.machine_type
zone = var.zone
~~~~~~~~~省略~~~~~~~~~
lifecycle {
ignore_changes = [
machine_type,
]
出力結果
$ terraform plan -var-file=dev.tfvars
~~~~~~~~~省略~~~~~~~~~
##ignore_changes入れない場合
~ machine_type: "e2-standard-4" => "e2-medium"
##ignore_changes入れた場合
No changes.
一時的なリソース調整や、負荷量で変わるGKEのpod数など、意図しない差分を防ぐのに有効です。
おわりに
Terraformは触れば触るほど新しい発見があって面白いです。
自分もまだまだ勉強中ですが、小技を覚えてテクいTerraform技術者になりましょう!
お疲れさまでした。( ^^) _旦~~