У вас есть 3 формы, чтобы сделать l oop.
1º, используя dynamic block
... Пример:
resource "aws_security_group" "ecc_default" {
count = length(var.clusters)
vpc_id = var.vpc_id
name = "${terraform.workspace}.ecc-${var.clusters[count.index].engine}.sg"
description = "${terraform.workspace}.ecc-${var.clusters[count.index].engine}.sg"
ingress {
from_port = var.clusters[count.index].port
to_port = var.clusters[count.index].port
protocol = "tcp"
cidr_blocks = [var.vpc_cidr]
}
dynamic "ingress" {
iterator = item
for_each = var.enable_vpn ? var.vpn_cidr : []
content {
from_port = var.clusters[count.index].port
to_port = var.clusters[count.index].port
protocol = "tcp"
cidr_blocks = [item.value["cidr"]]
description = item.value["description"]
}
}
...
...
}
2º Используя for_each
... ( нажмите здесь для ответа )
3º Используя арифметику c итерация ... ( нажмите здесь для ответа ) Пример:
resource "aws_security_group_rule" "ecc_internal" {
count = length(var.ingress_security_groups) > 0 ? length(var.ingress_security_groups) * length(var.clusters) : 0
security_group_id = aws_security_group.ecc_default[count.index % length(var.clusters)].id
type = "ingress"
from_port = var.clusters[count.index % length(var.clusters)].port
to_port = var.clusters[count.index % length(var.clusters)].port
protocol = "tcp"
source_security_group_id = var.ingress_security_groups[floor(count.index / length(var.clusters))]
}
И, для ошибки при преобразовании: попытайтесь использовать coalescelist
с поддельной заменой. Например:
resource "aws_lb_listener_certificate" "default" {
count = (coalescelist(data.aws_alb_listener.https, [{ certificate_arn = "" }])[0].certificate_arn != var.certificate_arn) ? local.enabled : 0
listener_arn = coalescelist(data.aws_alb_listener.https, [{ arn = "" }])[count.index].arn
certificate_arn = var.certificate_arn
}
Преобразование кортежа ([N1, N2, N3]
) в карту ({N1 = "", N2 = ""}
) действительно не допускается. Но вы можете использовать поддельную замену, чтобы сделать работу. tomap
нужен объект для аргумента. И map
, для получения результата требуется несколько аргументов. Попробуйте манипулировать своим списком, конвертировать в карту , с помощью другой формы, подобной этой (если вы хотите просто конвертировать, а не решить проблему):
environment_vars = jsonencode([
for key in sort(keys(data.external.environment_vars.result)) : {
name = key
value = lookup(data.external.environment_vars.result, key)
}])
Я рекомендую для вас: Советы и хитрости Terraform: циклы, операторы if и ошибки