You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]的写法:

  1. 修正堡垒机模块的安全组输出
    打开bastion/outputs.tf,将输出值改为安全组资源的id属性,禁止直接引用整个资源对象:
output "bastion_sg_id" {
  value = aws_security_group.bastion_sg.id
}
  1. (推荐配置)给EKS模块的入参显式声明类型
    打开eks/variables.tf,给bastion_sg变量添加string类型约束,后续如果传参类型错误,Terraform会在初始化/规划阶段提前抛出明确的类型不匹配提示,降低排查成本:
variable "bastion_sg" {
  type        = string
  description = "bastion sg to add to ingress rule of node sg"
}
  1. 修正资源拼写笔误
    打开eks/main.tf,将节点安全组定义首行的拼写错误esource改为resource。

改完之后重新执行terraform init、terraform plan即可通过类型校验。

内容的提问来源于stack exchange,提问作者user19457124

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 10:06:34