Terraform配置security_groups报element 0: string required错误
问题根因
- 核心错误出在堡垒机模块的输出配置:
bastion/outputs.tf中直接输出了整个aws_security_group.bastion_sg资源对象,而非安全组ID字符串。Terraform中AWS安全组资源是包含id、arn、出入站规则、标签等共13个属性的结构体对象,直接把整个对象传递给下游EKS模块时,下游接收到的是对象类型值,不是安全组规则要求的字符串类型ID,这也是报错提示var.bastion_sg is object with 13 attributes的直接原因。 - 两种传参写法都报错的本质是传入值的根源类型错误:不管是否给值包裹方括号,核心传入的都是对象而非字符串,永远无法满足
security_groups参数对「字符串集合」的类型要求:去掉方括号时相当于直接把对象传给要求字符串集合的参数,触发set of strings required报错;加方括号时相当于构造了一个元素为对象的列表,列表第一个元素是对象而非字符串,触发element 0: string required报错。 - 存在额外笔误:EKS模块的节点安全组资源定义首单词拼写错误,写为
esource,正确应为resource,不修正的话后续执行会触发资源类型未定义的报错。 - 变量未显式声明类型放大了排查难度:EKS模块的
bastion_sg入参没有指定类型,Terraform无法在模块传参阶段提前做类型校验,直到资源内部引用参数时才抛出类型不匹配错误,增加了排查成本。
修复方法
按顺序修改3处配置即可,不需要调整现有security_groups = [var.bastion_sg]的写法:
- 修正堡垒机模块的安全组输出
打开bastion/outputs.tf,将输出值改为安全组资源的id属性,禁止直接引用整个资源对象:
output "bastion_sg_id" { value = aws_security_group.bastion_sg.id }
- (推荐配置)给EKS模块的入参显式声明类型
打开eks/variables.tf,给bastion_sg变量添加string类型约束,后续如果传参类型错误,Terraform会在初始化/规划阶段提前抛出明确的类型不匹配提示,降低排查成本:
variable "bastion_sg" { type = string description = "bastion sg to add to ingress rule of node sg" }
- 修正资源拼写笔误
打开eks/main.tf,将节点安全组定义首行的拼写错误esource改为resource。
改完之后重新执行terraform init、terraform plan即可通过类型校验。
内容的提问来源于stack exchange,提问作者user19457124
相关产品推荐
相关产品推荐

