Terraform报错:变量应为string却传入list,如何获取IAM角色ARN字符串?
解决Terraform中IAM角色ARN类型不匹配的问题
这个报错的核心原因很明确:你输出的lambda_iam_role是列表类型,但模块lambda2的lambda_iam_role变量要求是字符串类型,类型不匹配导致了错误。
问题根源
你在output.tf里用了aws_iam_role.this.*.arn,Terraform里的.*是splat表达式,它会把所有匹配到的资源实例的arn属性收集成一个列表——哪怕你只创建了一个IAM角色,结果也是长度为1的列表,而不是单个字符串。
解决方案
根据你的场景,有两种简单的修正方式:
1. 直接引用单实例资源的ARN(推荐)
如果你只创建了一个IAM角色实例(这是最常见的情况),直接省略splat表达式,改用资源的直接属性引用:
修改你的output.tf:
output "lambda_iam_role" { value = aws_iam_role.this.arn }
Terraform对于单实例资源(没有用count或for_each创建多个实例),可以直接通过资源名.属性名获取单个值,这个值就是字符串类型,完全符合模块的变量要求。
2. 针对多实例场景的索引引用
如果你是用count创建了多个IAM角色,但只需要其中第一个的ARN,那么可以用索引取值:
output "lambda_iam_role" { value = aws_iam_role.this[0].arn }
这里的[0]表示取列表中的第一个元素,得到的就是单个字符串ARN。
额外检查
确保你的lambda2模块中变量定义确实是字符串类型,避免后续出现其他问题:
variable "lambda_iam_role" { type = string description = "ARN of the IAM role assigned to the Lambda function" }
这样修改后,再传递输出值给模块时,类型就匹配了,报错应该就会消失。
内容的提问来源于stack exchange,提问作者user10205566
相关产品推荐
相关产品推荐

