Terraform模块引用报错:Unsupported attribute问题排查与解决
Terraform模块引用报错:Unsupported attribute
目录结构
├── main.tf ├── team-members │ ├── github-team-memberships-Admin.tf │ └── main.tf ├── teams ├── github-teams-Admin.tf └── main.tf
各文件内容
根目录main.tf
terraform { required_providers { github = { source = "integrations/github" version = "~> 5.0" } } } module "teams" { source = "./teams" } module "team_members" { source = "./team-members" }
teams/github-teams-Admin.tf
resource "github_team" "Admin" { name = "Admin" description = "Admin team" privacy = "closed" parent_team_id = null }
team-members/main.tf
terraform { required_providers { github = { source = "integrations/github" version = "~> 5.0" } } } module "teams" { source = "../teams" }
team-members/github-team-memberships-Admin.tf
resource "github_team_membership" "Admin-XXXX" { username = "XXXX" team_id = module.teams.github_team.Admin.id role = "member" }
报错信息
│ Error: Unsupported attribute │ │ on team-members/github-team-memberships-Admin.tf line 3, in resource "github_team_membership" "Admin-XXXX": │ 3: team_id = module.teams.github_team.Admin.id │ ├──────────────── │ │ module.teams is a object │ │ This object does not have an attribute named "github_team".
错误原因
Terraform模块的内部资源默认是私有的,外部模块无法直接引用模块内的resource对象。你试图直接访问module.teams.github_team.Admin.id,但teams模块没有对外暴露这个属性,所以Terraform识别不到github_team这个属性。
另外还有一个隐藏问题:你在根目录和team-members模块里都引用了teams模块,这会导致teams模块被实例化两次,创建两个完全相同的Admin团队,属于资源重复定义。
解决步骤
步骤1:在teams模块添加输出配置
在teams目录下创建outputs.tf文件,对外暴露Admin团队的ID:
output "admin_team_id" { type = string description = "ID of the Admin team" value = github_team.Admin.id }
步骤2:优化模块引用,避免重复实例化
修改team-members/main.tf,删除内部的teams模块引用,改为通过根目录传参接收团队ID:
terraform { required_providers { github = { source = "integrations/github" version = "~> 5.0" } } } # 定义输入变量,接收外部传入的团队ID variable "admin_team_id" { type = string description = "ID of the Admin team to add members to" }
步骤3:修改根目录main.tf,传递团队ID给team-members模块
terraform { required_providers { github = { source = "integrations/github" version = "~> 5.0" } } } module "teams" { source = "./teams" } module "team_members" { source = "./team-members" # 将teams模块输出的admin_team_id传递给team-members模块 admin_team_id = module.teams.admin_team_id }
步骤4:修改team-members的资源引用
更新team-members/github-team-memberships-Admin.tf,使用传入的变量替代原来的模块引用:
resource "github_team_membership" "Admin-XXXX" { username = "XXXX" team_id = var.admin_team_id role = "member" }
验证执行
完成以上修改后,执行terraform init和terraform plan,应该就能正常识别团队ID,不会再出现属性错误,同时也避免了重复创建团队资源。
内容的提问来源于stack exchange,提问作者dr.linux
相关产品推荐
相关产品推荐

