はじめに
Terraformのfor_eachって便利ですね。
一部が異なるresourceを複数作る場合には欠かせないです。
個人的にはとてもIaCを感じるところです。
しかし若干直感に反した、クセがある使い方が必要になることがあります。
例えば、mapのlistをfor_eachしたい時など。
そんな時にこんなことをよく思います。
for_eachをいろいろ試しながら動きを確認したい!!
と。
でもfor_eachってresourceの中でしか使えないので、
試すにもまずはresourceを用意する必要があるんですよね。
そうは言ってもわざわざAWSなどのresourceを使うのはちょっと面倒くさい。
ということで今回は、
- for_eachの動きをちゃんとしたresourceを用意せずに確認する。
そんな時にどうしたらいいのか調べてみたので、その結果をシェアします
結論:Null Providerを使おう!
これだけです。
ドキュメントはこちら。
https://registry.terraform.io/providers/hashicorp/null/latest/docs
有識者の皆様ならこれだけでもう終わりでいいかもしれませんが、
せっかくなので実際にnullを使ってfor_eachの動きを確認するところまで確認してみます。
使い方
上記ドキュメントを読むと、
resource "null_resource" "cluster" {
# Changes to any instance of the cluster requires re-provisioning
triggers = {
cluster_instance_ids = join(",", aws_instance.cluster.*.id)
}
こんな感じでnull_resourceというリソースを使い、
triggersにmapをぶち込めば良さそうです。
早速やってみましょう。
軽く試してみる
nullのインストールとterraform init
terraform {
required_version = ">= 0.12"
required_providers {
null = {
source = "hashicorp/null"
version = "3.1.0"
}
}
}
provider "null" {}
でterraform init
。
mapのlistをfor_eachしてみる
locals {
members = [
{"id" = 1, "name" = "Takashi"},
{"id" = 2, "name" = "Satoshi"},
]
}
resource null_resource for_each {
for_each = {for k in local.members : k.id => k}
triggers = {
"${each.value.id}" = each.value.name
}
}
そしてterraform plan
してみると、、
Terraform will perform the following actions:
# null_resource.for_each["1"] will be created
+ resource "null_resource" "for_each" {
+ id = (known after apply)
+ triggers = {
+ "1" = "Takashi"
}
}
# null_resource.for_each["2"] will be created
+ resource "null_resource" "for_each" {
+ id = (known after apply)
+ triggers = {
+ "2" = "Satoshi"
}
}
Plan: 2 to add, 0 to change, 0 to destroy.
はい!
こんな感じでtriggersの中に良い感じにmapが出力されてますね。
これでfor_eachの動きをお手軽に確認できるようになりました。
本当にありがとうございました。
あとがき
ProviderはもっぱらAWSぐらいしか使っていませんでいたが、
こういうのもあると知ったら俄然調べたくなりますね。
また便利なものがあったら試して記事にしたいと思います。
参考情報
hashicorp/null | Terraform Registry
Types and Values - Configuration Language | Terraform by HashiCorp
Type Constraints - Configuration Language | Terraform by HashiCorp
For Expressions - Configuration Language | Terraform by HashiCorp
The for_each Meta-Argument - Configuration Language | Terraform by HashiCorp