Terraform предлагает два механизма повторения ресурсов: resource "aws_vpc" "vpc" {
for_each = { for i, b in var.vpc_cidrs : i => b }
cidr_block = each.value
tags = {
Name = format("Companyd", each.key + 1)
}
}
и tags = { Name = "Company0${index(var.vpc_cidrs, each.value) + 1}" }
. Основное различие между ними заключается в том, как Terraform будет отслеживать созданные ими несколько экземпляров:
- При использовании
resource "aws_vpc" "vpc" {
count = length(var.vpc_cidrs)
cidr_block = var.vpc_cidrs[count.index]
tags = {
Name = format("Companyd", count.index + 1)
}
}
, each of the multiple instances is tracked by a number starting at 0, giving addresses like count
и cidr_block
.
- При использовании
resource "aws_vpc" "vpc" {
for_each = { for i, b in var.vpc_cidrs : b => { index = i } }
cidr_block = each.key
tags = {
Name = format("Companyd", each.value.index + 1)
}
}
, each of the multiple instances is tracked by a string which could be obtained either from a key in a map or from an element in a set, giving addresses like for_each
и # aws_vpc.vpc["10.0.0.0/16"] will be updated in-place
~ resource "aws_vpc" "vpc" {
~ tags = {
~ Name = "Company01" -> "Company02"
}
# ...
}
# aws_vpc.vpc["10.0.0.0/16"] will be updated in-place
~ resource "aws_vpc" "vpc" {
~ tags = {
~ Name = "Company02" -> "Company01"
}
# ...
}
.
Самая распространенная причина выбора for_each
rather than for_each
заключается в том, чтобы гарантировать, что порядок любого набора значений, вызывающего повторение, не имеет значения. В вашем конкретном случае это даст тот же результат независимо от того, ["10.1.0.0/16", "10.0.0.0/16"]
is ["10.0.0.0/16", "10.1.0.0/16"]
или var.vpc_cidrs
, because the instances would be tracked by the CIDR block string and the index in the list is totally ignored.
С учетом всего сказанного, причина, по которой индекс недоступен напрямую при использовании count
is that this would defeat the main purpose of using for_each
: это снова сделает заказ значимым. В вашей конкретной ситуации, если вы использовали индекс в имени тега, то изменение порядка списка приведет к тому, что Terraform запланирует поменять теги на этих двух VPC:
aws_vpc.vpc["10.1.0.0/16"]
Возможно, это нормально для вашего случая, если эти числа нужны только для создания некоторой уникальности, и не имеет значения, будут ли они переназначаться с течением времени по мере добавления, удаления и переупорядочения блоков CIDR во входной переменной. Если это правда, то мы можем получить значение, содержащее исходный индекс, и использовать его как часть aws_vpc.vpc["10.0.0.0/16"]
like this:
for_each
Однако если вы считаете, что позиция в списке действительно важна — например, если вы хотите поменять местами два элемента в списке, чтобы изменить aws_vpc.vpc[1]
values on the two existing objects rather than to re-tag them, it would be more appropriate to use aws_vpc.vpc[0]
чтобы Terraform сам отслеживал их по индексам:
count
||answer||
Нашел простое решение с помощью индекс функция:
for_each
||answer||
Вы можете использовать без индекса:
count
каждый.ключ = порядковый номер