使用for_each的Terraform GCP项目IAM成员状态导入报错求助
问题:Terraform导入for_each生成的google_project_iam_member资源失败
我用以下Terraform代码为GCP服务账号配置项目权限:
resource "google_project_iam_member" "name_of_sa_project_prod" { for_each = toset([ "roles/bigquery.dataOwner", "roles/bigquery.jobUser" ]) role = each.key project = google_project.test_prod.project_id member = "serviceAccount:${google_service_account.sa_account.email}" }
更换笔记本后,需要在执行terraform apply前导入资源状态,尝试了以下命令:
terraform import module.module_name.google_project_iam_member.name_bigquery_dev.owner["user:name@project_name.iam.gserviceaccount.comr"] "project_name roles/owner user:sa_name@project-name.iam.gserviceaccount.com"
报错:
Index brackets must contain either a literal number or a literal string. This character is not used within the language.
又尝试了:
terraform import module.module_name.google_project_iam_member.name_bigquery_dev["roles/bigquery.dataOwner"] "project_name roles/owner user:sa_name@project_name.iam.gserviceaccount.com"
仍然报错:
│ Index brackets must contain either a literal number or a literal string.
官方文档仅给出google_project_iam_binding的导入示例:
terraform import google_project_iam_binding.default "{{project_id}} roles/viewer"
不清楚如何适配我的for_each场景。
解决方案
1. 资源地址规则
使用for_each生成的资源,实例地址格式为:[模块路径].google_project_iam_member.[资源名]["for_each_key"],其中for_each_key就是你定义的角色字符串(比如roles/bigquery.dataOwner)。
2. 正确导入命令格式
google_project_iam_member的导入格式为:
terraform import [资源完整地址] "[项目ID] [角色] [成员标识]"
针对你的场景,需要分别导入两个角色对应的资源实例:
导入roles/bigquery.dataOwner角色
terraform import module.module_name.google_project_iam_member.name_bigquery_dev["roles/bigquery.dataOwner"] "project_name roles/bigquery.dataOwner serviceAccount:sa_name@project_name.iam.gserviceaccount.com"
导入roles/bigquery.jobUser角色
terraform import module.module_name.google_project_iam_member.name_bigquery_dev["roles/bigquery.jobUser"] "project_name roles/bigquery.jobUser serviceAccount:sa_name@project_name.iam.gserviceaccount.com"
3. 错误原因说明
- 之前的命令中,导入参数里的角色(
roles/owner)和资源地址对应的角色不匹配,导致格式校验失败; - 首次尝试的命令中成员标识多了一个
r(user:name@project_name.iam.gserviceaccount.comr),属于输入错误; - 确保资源名(
name_bigquery_dev)和模块路径与你的Terraform配置完全一致,避免笔误。
内容的提问来源于stack exchange,提问作者Moseleyi
相关产品推荐
相关产品推荐

