如何在Terraform中使用splat运算符为count管理的资源生成字符串输出
错误原因
你遇到的报错核心有两个原因:
aws_elb.webserver_example.*.dns_name是用splat运算符返回的列表类型值,不能直接嵌入字符串模板做拼接,Terraform要求字符串插值必须传入字符串类型- 当你的
var.create_webserver值为0时,aws_elb.webserver_example会是空元组,不存在任何属性,进一步触发类型不匹配报错
解决方法
根据你的输出需求可以选择以下几种实现方案:
方案1:输出所有ELB URL组成的字符串列表(最常用)
如果可以接受输出为列表类型,直接用for表达式遍历生成即可,即使count为0也只会返回空列表,不会报错:
output "url_list" { type = list(string) value = [for elb in aws_elb.webserver_example : "http://${elb.dns_name}:${var.elb_port}"] }
方案2:输出单个拼接后的字符串
如果要求必须返回单个字符串类型,可以用join函数把所有URL用指定分隔符拼接起来,没有ELB时会返回空字符串:
output "joined_url" { type = string value = join(", ", [for elb in aws_elb.webserver_example : "http://${elb.dns_name}:${var.elb_port}"]) }
你也可以自定义无ELB时的返回值,加个三元判断即可:
output "joined_url" { type = string value = var.create_webserver > 0 ? join(", ", [for elb in aws_elb.webserver_example : "http://${elb.dns_name}:${var.elb_port}"]) : "No ELB instances created" }
方案3:仅单个ELB场景输出单个字符串
如果你确定var.create_webserver的取值只有0或1,不需要处理多个ELB的情况,可以用try函数做兼容:
output "single_url" { type = string value = try("http://${aws_elb.webserver_example[0].dns_name}:${var.elb_port}", "") }
count为0时会自动返回空字符串,不会触发报错。
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

