如何实现Terraform复杂输出的可选性以避免属性报错?
解决Terraform输出可选属性报错问题
问题根源
Terraform的条件表达式会对两个分支都进行预求值和类型校验,哪怕其中一个分支最终不会被触发。当aws_vpc_endpoint.endpoint未创建或无dns_entry属性时,右侧分支的属性访问会直接抛出"Unsupported attribute"错误。
解决方案
方案1:用try函数捕获属性访问错误
try函数会尝试执行表达式,失败时返回指定默认值,适配这种场景:
output endpoint_dns_entries { value = contains(local.de_dupe_phz_names, var.service["phz_name"]) ? { empty = [""] emptyalso = [""] } : { dns_names = try(aws_vpc_endpoint.endpoint.*.dns_entry[*].dns_name, []) hosted_zone_ids = try(aws_vpc_endpoint.endpoint.*.dns_entry[*].hosted_zone_id, []) } }
方案2:用can函数先判断属性可用性
先检查dns_entry属性是否存在,再决定是否访问:
output endpoint_dns_entries { value = contains(local.de_dupe_phz_names, var.service["phz_name"]) ? { empty = [""] emptyalso = [""] } : can(aws_vpc_endpoint.endpoint.*.dns_entry) ? { dns_names = aws_vpc_endpoint.endpoint.*.dns_entry[*].dns_name hosted_zone_ids = aws_vpc_endpoint.endpoint.*.dns_entry[*].hosted_zone_id } : { dns_names = [] hosted_zone_ids = [] } }
方案3:从资源层面控制创建(推荐)
如果aws_vpc_endpoint.endpoint本身是可选创建的,直接用count控制资源实例数,从根源避免无效引用:
首先修改资源定义:
resource "aws_vpc_endpoint" "endpoint" { count = contains(local.de_dupe_phz_names, var.service["phz_name"]) ? 0 : 1 # 其他VPC端点配置... }
然后调整输出:
output endpoint_dns_entries { value = length(aws_vpc_endpoint.endpoint) == 0 ? { empty = [""] emptyalso = [""] } : { dns_names = aws_vpc_endpoint.endpoint[*].dns_entry[*].dns_name hosted_zone_ids = aws_vpc_endpoint.endpoint[*].dns_entry[*].hosted_zone_id } }
内容的提问来源于stack exchange,提问作者Rome_Leader
相关产品推荐
相关产品推荐

