我有一个计数不同的资源(0或1个资源(。
resource "aws_acm_certificate" "cert" {
count = local.acm_version_count
domain_name = "${local.deployment_version_name}.example.com"
subject_alternative_names = [
"*.${local.deployment_version_name}.example.com
]
validation_method = "DNS"
}
现在我想迭代可选资源的一个属性:
resource "aws_route53_record" "acm_validation" {
for_each = {
for dvo in aws_acm_certificate.cert.domain_validation_options : dvo.domain_name => {
name = dvo.resource_record_name
record = dvo.resource_record_value
type = dvo.resource_record_type
}
}
zone_id = data.aws_route53_zone.r53_zone.zone_id
name = each.value.name
type = each.value.type
ttl = 60
records = [each.value.record]
allow_overwrite = true
}
当然,因为aws_acm_certificate.cert
是计数的,所以我们必须在索引(即aws_acm_certificate.cert[0]
或aws_acm_certificate.cert[count.index]
(处访问它。但是,我不能使用计数,因为它与for_each
互斥,并且在未创建可选资源时,我不能访问[0]
。理想情况下,我可以在记录本身上添加一个计数,这样,如果没有aws_acm_certificate
,我就可以忽略aws_route53_record.acm_validation
我知道toproduct
,所以我想知道它是否有用——但老实说,我对它的了解还不够,无法在这里使用
我如何对这个可选资源进行迭代,以便在可选地排除了acm的情况下可以忽略它,但如果有acm,我仍然可以对那些domain_validation_options
进行迭代?
您可以生成所有"域验证选项";在所有aws_acm_certificate.cert
实例中,如下所示:
flatten(aws_acm_certificate.cert[*].domain_validation_options)
当您声明了零个证书时,这就像调用flatten([])
一样,因此它只会生成一个空列表,而当count
为非零时,它会捕获所有声明的验证选项,因为仅aws_acm_certificate.cert[*].domain_validation_options
就会生成一个对象列表。
我认为应该在当前直接引用单例资源的属性的同一位置插入flatten( ... )
调用,并保持其他所有内容不变:
for_each = {
for dvo in flatten(aws_acm_certificate.cert[*].domain_validation_options) :
dvo.domain_name => {
name = dvo.resource_record_name
record = dvo.resource_record_value
type = dvo.resource_record_type
}
}
在大多数情况下,我建议将条件计数视为";可以存在零个或多个实例";,即使您知道最大计数实际上是1
,因为为处理对象列表而设计的语言功能通常比您需要编写的内容更紧凑、更简洁,以明确区分某个资源的零或一。结果并不总是这样,但在许多情况下,是否有一个或多个实例并不重要,包括这种情况。
您需要检查资源是否已创建,如果未创建,则向for_each
传递一个空列表。我会添加一个local
变量,使其更加简洁。
locals {
dvos = local.acm_version_count == 0 ? [] : aws_acm_certificate.cert[0].domain_validation_options
}
resource "aws_route53_record" "acm_validation" {
for_each = {
for dvo in local.dvos : dvo.domain_name => {
name = dvo.resource_record_name
record = dvo.resource_record_value
type = dvo.resource_record_type
}
}
...
}