【问题标题】:gcp google_project_iam_member gives invalid argument message on terraformgcp google_project_iam_member 在 terraform 上给出了无效的参数消息
【发布时间】:2021-10-14 12:01:07
【问题描述】:

我正在使用 terraform 来部署以下内容

resource "google_project_iam_custom_role" "brw-user-function-item-registered-role" {
  role_id     = "brw_user_function_item_registered_role"
  title       = "brw-user-function-item-registered-role"
  description = "Role used by the brw-user-function item-registered"
  permissions = [     
    "storage.objects.create",
    "storage.objects.get",
    "storage.objects.list"
  ]
}

resource "google_service_account" "brw-user-function-item-registered-service-account" {
  account_id   = "brw-user-function-item-reg-svc"
  display_name = "brw-user-function-item-registered-service_account"
}

resource "google_project_iam_member" "brw-user-function-item-registered-service-account-binding" {  
  project = local.project
  role    = "roles/${google_project_iam_custom_role.brw-user-function-item-registered-role.role_id}"
  member  = "serviceAccount:${google_service_account.brw-user-function-item-registered-service-account.email}"
  depends_on = [
    google_project_iam_custom_role.brw-user-function-item-registered-role,
    google_service_account.brw-user-function-item-registered-service-account
  ]
}

但是,当我尝试通过 terraform 进行部署时,出现以下错误

Request "Create IAM Members roles/brw_user_function_item_registered_role serviceAccount:brw-user-function-item-reg-svc@brw-user.iam.gserviceaccount.com for \"project \\\"BRW-User\\\"\"" returned error: Error retrieving IAM policy for project "BRW-User": googleapi: Error 400: Request contains an invalid argument., badRequest

我不确定这里出了什么问题,我也添加了depends_on,只是为了确保它以正确的顺序创建。 member 属性是否有误,我也尝试给account_id,但我仍然得到同样的错误。

【问题讨论】:

    标签: google-cloud-platform terraform terraform-provider-gcp google-iam google-cloud-iam


    【解决方案1】:

    只有预定义角色的名称前面有字符串 roles/

    你正在使用字符串:

    role = "roles/${google_project_iam_custom_role.brw-user-function-item-registered-role.role_id}"
    

    改成:

    role = google_project_iam_custom_role.brw-user-function-item-registered-role.name
    

    注意删除 roles/,将 role_id 更改为 name,并删除字符串插值。

    【讨论】:

    • 约翰,我认为自定义角色必须按照文档作为 [projects|organizations]/{parent-name}/roles/{role-name} 传递:registry.terraform.io/providers/hashicorp/google/latest/docs/…
    • @CaioT - 他们必须遵循格式。您的答案(有一个小错误)和我的答案都使用您答案中的格式生成相同的值。我的答案使用 Terraform 的内置功能,而您的答案手创建角色名称值。您的错误是可能来自您的测试 HCL 的 customer_access 部分。请注意生成短名称的 role_id 和生成长名称的 name 之间的区别。如果 terraform 初学者研究了我们的两个答案,他们将更多地了解价值是如何创造的。
    • 这是有道理的。谢谢你的解释。
    【解决方案2】:

    在资源 google_project_iam_member 中,如果您要传递自定义角色,则其格式必须为:

    [projects|organizations]/{parent-name}/roles/{role-name}
    

    这是一个例子:

    resource "google_project_iam_member" "access" {
      project = var.project_name
      role    = "projects/${var.project_name}/roles/${google_project_iam_custom_role.customer_access.role_id}"
      member  = "serviceAccount:${google_service_account.service_account.email}"
    }
    

    此外,作为最佳做法,请避免在资源名称中使用破折号(下划线更好)并尽量不要使其过长。我遇到了长名称的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2017-08-25
      • 1970-01-01
      相关资源
      最近更新 更多