Terraform获取AWS Network Interface公网IP出现Unsupported attribute错误如何解决
问题原因
报错由两个语法错误共同导致:
data.aws_network_interface.my_lb是包含2个元素的tuple集合,你使用的splat *表达式仅能返回集合内顶层元素的属性列表,无法直接匹配嵌套列表association的内部字段,你写的association..public_ip双点语法在Terraform中不存在,无法自动展开嵌套列表取值- 直接在splat表达式后拼接
association[0]时,Terraform无法对tuple中每个元素的嵌套列表做统一索引匹配,才会抛出「不存在对应属性」的报错
解决方案
根据你的使用场景选择对应写法即可:
场景1:输出所有网卡对应的公网IP列表
用for表达式遍历每个网卡,再逐层取嵌套字段:
output "app_lb_public_ips" { value = [ for ni in data.aws_network_interface.my_lb : ni.association[0].public_ip ] }
如果需要过滤没有公网IP的网卡,可增加判断逻辑避免报错:
output "app_lb_public_ips" { value = [ for ni in data.aws_network_interface.my_lb : ni.association[0].public_ip if length(ni.association) > 0 && try(ni.association[0].public_ip, null) != null ] }
场景2:只取指定索引的单个网卡公网IP
直接指定tuple下标访问即可,比如取第一个网卡的公网IP:
output "first_lb_public_ip" { value = data.aws_network_interface.my_lb[0].association[0].public_ip }
场景3:兼容旧版Terraform的splat写法
用两层splat表达式加flatten拍平嵌套列表,也能拿到所有公网IP的一维列表:
output "app_lb_public_ips" { value = flatten(data.aws_network_interface.my_lb[*].association[*].public_ip) }
内容的提问来源于stack exchange,提问作者benja tosello
相关产品推荐
相关产品推荐

