0
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?

More than 3 years have passed since last update.

Terraformのfor_eachをお手軽に試したい

Posted at

はじめに

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

main.tf
terraform {
  required_version = ">= 0.12"
  required_providers {
    null = {
      source = "hashicorp/null"
      version = "3.1.0"
    }
  }
}
provider "null" {}

terraform init

mapのlistをfor_eachしてみる

for_each.tf
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

0
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
0
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?