Terraform输出批量创建的IAM用户名称时报错,如何解决?
我来帮你搞定这个批量创建IAM用户后的输出报错问题!先看看你原来的代码:
resource "aws_iam_user" "lb" { name = var.elb_names[count.index] count = 3 path = "/system/" } variable "elb_names" { type = list default = ["dev-lb", "qa-lb", "prod-lb"] } output "elb_names" { value = aws_iam_user.lb.name[count.index] }
你期望输出三个用户名称的有序列表,但却碰到了如下错误:
Error: Missing resource instance key
on countEC2.tf line 38, in output "elb_names":
38: value = aws_iam_user.lb.name[count.index]Because aws_iam_user.lb has "count" set, its attributes must be accessed on specific instances.
For example, to correlate with indices of a referring resource, use:
aws_iam_user.lb[count.index]
问题核心原因
count.index是资源块专属的上下文变量,output块本身没有这个上下文,所以直接引用会报错。另外,当你给资源设置count后,该资源会变成一个列表类型的资源实例集合,你需要直接提取整个集合的属性来获取所有实例的名称。
正确的解决方法
修改output块,直接提取整个aws_iam_user.lb实例集合的name属性即可:
output "elb_names" { value = aws_iam_user.lb[*].name }
如果你想显式确保输出是列表类型,也可以用tolist函数转换:
output "elb_names" { value = tolist(aws_iam_user.lb[*].name) }
执行terraform apply后,你会得到如下输出:
elb_names = [ "dev-lb", "qa-lb", "prod-lb", ]
这个数组输出已经清晰展示了所有批量创建的IAM用户名称,和你期望的结果逻辑一致。如果需要在外部工具中转换成有序列表格式,直接遍历这个数组即可。
内容的提问来源于stack exchange,提问作者Shake

