今回はterraform の for と for_each の違いについてです。
■ はじめに
for と for_each は全くの別物です。
ただ、for_each にfor〜がついているので、「for と何が違うんだろう」というところが背景となります。
そのため、既に理解されている方にとっては比較すること自体がおかしいと思うこともあるかもしれませんが、そこは了承いただけたらと思います。
■ for_each について
過去の記事でも書いてますが、こちらでも簡単に記載いたします。
for_each は Terraformでは「メタ引数」に分類されます。
Resources - Configuration Language | Terraform | HashiCorp Developer
メタ引数とは、Terraformがリソースに対して何かしらの操作(リソース作成/削除/リプレイス)する際の動作を制御(=「繰り返し」「無視」「依存関係」などの定義/動作のこと)します。
Terraformにおける他のメタ引数は、ループ処理のためのcountや依存関係を明示するdepends_on等があります。
count 同様、for_each もリソースを複数作成する際のループ処理として利用します。
The for_each Meta-Argument - Configuration Language | Terraform | HashiCorp Developer
for_each はMapもしくはSetを受け取り処理を行います。Terraformのresource/moduleに対して複数回処理を実施する際に使います。
■ for について
for は Terraformでは「式」に分類されます。
Expressions - Configuration Language | Terraform | HashiCorp Developer
式はリソースを作成するときには使いません。(for_eachはリソースを作成するときに使います。)
for の使い所は、Map/List/Set/Tuple/Objectを受け取り、受け取ったものを変換したりするときに使います。語弊はありますが、受け取った情報が複数項目のときに、その一つ一つに対して何かしらの変換を行うときに利用します。
例)大文字を小文字に変換。
また、forには2つの書式があり、for を何で囲むかにより出力結果が異なります。
・for を [] で囲むとタプルを生成
・for を {} で囲むとオブジェクトを生成
■ for について(タプル生成)
例えば、以下のコードの場合(terraform consoleを利用)、
> [for s in ["list1","list2","list3","list4"]:"${s}を表示"]
for はリスト(["list1","list2","list3","list4"])を受け取ってそれぞれを変数sに代入し、「"${s}を表示"」の処理を行います。
出力結果は以下のとおりです。
[
"list1を表示",
"list2を表示",
"list3を表示",
"list4を表示",
]
forは[]で囲まれているため、生成された結果はタプルです。
タプルを生成できて何が嬉しいのかですが、タプル結果を更に利用して処理を行うことも可能です。
■ for について(オブジェクト生成)
例えば、以下のコードの場合(terraform consoleを利用)、
> {for s in ["list1", "list2", "list3", "list4"]: s => length(s) }
出力結果は以下のとおりです。
{
"list1" = 5
"list2" = 5
"list3" = 5
"list4" = 5
}
前述のリスト生成のときと比較すると、
for s in ["list1", "list2", "list3", "list4"]:
までは一緒ですが
・{}で囲まれている
・s => length(s)
が異なる箇所です。
出力結果を見るとイメージが湧きやすいですが、オブジェクトを生成するためのforの場合、
s => length(s)
のような書き方をすることで
「s = 変換結果もしくは計算結果」
という形式で出力されます。
オブジェクトを生成できて何が嬉しいのかですが、以下の記事に纏めております。
以上です。