71
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Terraformで作業がちょっと楽になる小技(compact / for_each / ignore_changes)

71
Last updated at Posted at 2025-12-02

初めに

お疲れさまです。オオタケです。

現在、Terraform を使用した現場に従事しており、その中で便利だと感じた関数やオプションについて、備忘も兼ねてまとめます。

compact()

compact() を使うことで、リスト内に ""(空文字)や null が含まれていた場合、無視してリストに起こすことができます。

例: 値に空文字 "" を含めた場合の plan 実行例

複数の環境(面)ごとに .tfvars ファイルを作成する際、
「この環境では特定の値をリストに含めたくない」というケースがあります。

そのとき、単に "" と記述してしまうと、そのままリストに入り構築時にエラーになることがあります。
そこで compact() を使用することで、空文字を自動的に除外できます。

資材

dev.tfvars
compact_test1 = "hoge"
compact_test2 = "fuga"
compact_test3 = "piyo"
stg.tfvars
compact_test1 = "hoge"
compact_test2 = ""
compact_test3 = "piyo"
prd.tfvars
compact_test1 = "hoge"
compact_test2 = "fuga"
compact_test3 = ""
compact_demo.tf
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
}

出力結果

plan dev.tfvars
$ terraform plan -var-file=dev.tfvars

compact_values = [
  "hoge",
  "fuga",
  "piyo",
]
stg.tfvars
$ terraform plan -var-file=stg.tfvars

compact_values = [
  "hoge",
  "piyo",
]
prd.tfvars
$ terraform plan -var-file=prd.tfvars

compact_values = [
  "hoge",
  "fuga",
]

for_each

Terraformで同じ種類のリソースを複数作成したいときに便利な構文。
構築数を増やしたいときは for_each に渡すリストに要素を追加するだけでOK
めちゃ便利。

例: 設定値が違うリソースを複数個構築

資材

dev.tfvars
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"  
 },
]
for_each_demo.tf
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
~~~~~~~~~省略~~~~~~~~~

出力結果

plan dev.tfvars
$ terraform plan -var-file=dev.tfvars
~~~~~~~~~省略~~~~~~~~~


lifecycle{ignore_changes = []}

「デプロイ実行時に考慮から外す」といった書き方が可能。

初期構築後に設定値を手動で変更した際、通常は terraform plan で差分が発生します。
しかし、ignore_changes を使用することでデプロイ時に変更を無視することができます。

例: 初期構築後、手動でマシンタイプを一時変更している場合

資材

dev.tfvars
instance_name = "hoge-instance"
machine_type = "e2-medium"
zone = "asia-northeast1"
ignore_changes_demo.tf
resource "google_compute_instance" "ignore_demo" {
  name         = var.instance_name
  machine_type = var.machine_type
  zone         = var.zone
~~~~~~~~~省略~~~~~~~~~
  lifecycle {
    ignore_changes = [
      machine_type,
    ]

出力結果

plan dev.tfvars
$ terraform plan -var-file=dev.tfvars
~~~~~~~~~省略~~~~~~~~~

##ignore_changes入れない場合
~ machine_type: "e2-standard-4" => "e2-medium"

##ignore_changes入れた場合
No changes.

一時的なリソース調整や、負荷量で変わるGKEのpod数など、意図しない差分を防ぐのに有効です。

おわりに

Terraformは触れば触るほど新しい発見があって面白いです。
自分もまだまだ勉強中ですが、小技を覚えてテクいTerraform技術者になりましょう!

お疲れさまでした。( ^^) _旦~~

参考

機能 リンク
compact() https://developer.hashicorp.com/terraform/language/functions/compact
lifecycle(ignore_changes) https://developer.hashicorp.com/terraform/language/meta-arguments#lifecycle
for_each https://developer.hashicorp.com/terraform/language/meta-arguments#for_each
71
1
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
71
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?