Terraform v0.12.6 から利用できるようになった for_each で count.index の様な連番付与が行えないか調べました。
for_each の利点無くなるので結果的に使わなかったのですが、何かに使えるかもしれないのでメモ。 定義した変数を基にするのであれば、そこに含めてしまえば良いので出番は無いでしょう。
version
>= v0.12.6
$ terraform version Terraform v0.14.6 + provider registry.terraform.io/hashicorp/aws v3.28.0
以下、便宜的に resource aws_sns_topic を指定していますが特に意味は無いです。
map
locals {
# map定義
servers = {
"serverA" = { role = "web" }
"serverB" = { role = "ap" }
"serverC" = { role = "db" }
}
# mapからindex作成
servers_index = [for k, v in local.servers : k]
}
# resource定義
resource "aws_sns_topic" "sns_topic" {
for_each = local.servers
name = "${each.key}-${each.value.role}-${index(local.servers_index, each.key)}"
}
plan
# aws_sns_topic.sns_topic["serverA"] will be created
+ resource "aws_sns_topic" "sns_topic" {
+ arn = (known after apply)
+ id = (known after apply)
+ name = "serverA-web-0"
+ policy = (known after apply)
}
# aws_sns_topic.sns_topic["serverB"] will be created
+ resource "aws_sns_topic" "sns_topic" {
+ arn = (known after apply)
+ id = (known after apply)
+ name = "serverB-ap-1"
+ policy = (known after apply)
}
# aws_sns_topic.sns_topic["serverC"] will be created
+ resource "aws_sns_topic" "sns_topic" {
+ arn = (known after apply)
+ id = (known after apply)
+ name = "serverC-db-2"
+ policy = (known after apply)
}
list
- for_each に list は直接渡せないため変換が必要
The given "for_each" argument value is unsuitable: the "for_each" argument must be a map, or set of strings, and you have provided a value of type tuple.
locals {
# list定義
server_list = [
"serverA", "serverB", "serverC"
]
# listからmapに変換
server_list_to_map = { for i, j in local.server_list : j => { index = i } }
}
# tosetを使用した場合、key,valueが同値となる
# > each.key and each.value are the same for a set
resource "aws_sns_topic" "sns_topic_list" {
for_each = toset(local.server_list)
name = "${each.key}-${each.value}"
}
# 変換したmapを使用
resource "aws_sns_topic" "sns_topic_list_to_map" {
for_each = local.server_list_to_map
name = "${each.key}-${each.value.index}"
}
plan
# aws_sns_topic.sns_topic_list["serverA"] will be created
+ resource "aws_sns_topic" "sns_topic_list" {
+ arn = (known after apply)
+ id = (known after apply)
+ name = "serverA-serverA"
+ policy = (known after apply)
}
# aws_sns_topic.sns_topic_list["serverB"] will be created
+ resource "aws_sns_topic" "sns_topic_list" {
+ arn = (known after apply)
+ id = (known after apply)
+ name = "serverB-serverB"
+ policy = (known after apply)
}
# aws_sns_topic.sns_topic_list["serverC"] will be created
+ resource "aws_sns_topic" "sns_topic_list" {
+ arn = (known after apply)
+ id = (known after apply)
+ name = "serverC-serverC"
+ policy = (known after apply)
}
# aws_sns_topic.sns_topic_list_to_map["serverA"] will be created
+ resource "aws_sns_topic" "sns_topic_list_to_map" {
+ arn = (known after apply)
+ id = (known after apply)
+ name = "serverA-0"
+ policy = (known after apply)
}
# aws_sns_topic.sns_topic_list_to_map["serverB"] will be created
+ resource "aws_sns_topic" "sns_topic_list_to_map" {
+ arn = (known after apply)
+ id = (known after apply)
+ name = "serverB-1"
+ policy = (known after apply)
}
# aws_sns_topic.sns_topic_list_to_map["serverC"] will be created
+ resource "aws_sns_topic" "sns_topic_list_to_map" {
+ arn = (known after apply)
+ id = (known after apply)
+ name = "serverC-2"
+ policy = (known after apply)
}