こんにちは、 @kz_morita です。
Terraform で AWS リソースなどを管理しているときに、同じリソースをまとめてつくるときに繰り返し処理に for_each
などが使えそうだったのでまとめます。
for_each でループする
たとえば、1 と 2 などのナンバリングされた ECS Service など作るときは以下のように変数を用意して for_each で参照することができます。
var {
number = [1,2]
}
resource "aws_ecs_service" "ecs_service" {
for_each = to_set(var.number)
name = "ecs_service_${each.value}" # ecs_service_1, ecs_service_2
}
each.value
で値にアクセスすることができます。
上記の例では、toset で set 型にしているので、each.key
でも同じ値が取得できます。
同様に map 型でも以下のようにルー処理を書くことができます。
var {
number_map = {
"1" = "hoge"
"2" = "fuga"
}
}
resource "aws_ecs_service" "ecs_service" {
for_each = var.number_map
name = "ecs_service_${each.key}_${each.value}" # ecs_servce_1_hoge, ecs_service_2_fuga
}
map の場合は、each.key
と each.value
で map の key と value の値がそれぞれとれます。
map 型の値を key で取得する
map の値を key から取得するには、lookup 関数を使います。
var {
number = [1,2]
number_map = {
"1" = "hoge"
"2" = "fuga"
}
}
resource "aws_ecs_service" "ecs_service" {
for_each = var.number
name = "ecs_service_${each.value}_${lookup(var.number_map, each.value)}" # ecs_servce_1_hoge, ecs_service_2_fuga
}
lookup で第二引数に key の値を渡すと value の値を引くことができます。
まとめ
terraform でループ処理を各方法についてまとめました。このあたりをつかえば似たようなリソースをコピペでつくるなどせずにうまく管理できそうなのでこういった機能は積極的に使っていきたいと思いました。