创建 GCE 实例组管理器时出现服务账号权限错误

87次阅读
没有评论

问题描述

在使用 Terraform 创建 Google Compute Engine (GCE) 实例组管理器时,遇到了一个服务账号权限的错误。他已经根据配置创建了实例组管理器和相关资源,但仍然收到如下错误信息:

Error: Error waiting for Creating InstanceGroupManager: The user does not have access to service account ‘One of [serviceAccount:frontend@vpc-challenge-lab-245114.iam.gserviceaccount.com]’. User: ‘terraform@vpc-challenge-lab-245114.iam.gserviceaccount.com’. Ask a project owner to grant you the iam.serviceAccountUser role on the service account

用户已经验证了服务账号的 IAM 策略,发现似乎已经正确配置了权限。以下是他提供的相关配置信息:

  1. 实例模板 (google_compute_instance_template) 的配置
  2. 服务账号 (google_service_account) 的配置
  3. 服务账号权限 (google_service_account_iam_member) 的配置
  4. 项目角色绑定 (google_project_iam_member) 的配置
  5. 自定义角色 (google_project_iam_custom_role) 的配置

用户希望找到导致此错误的原因,并解决这个问题,以便成功创建 GCE 实例组管理器。

解决方案

请注意以下操作可能会有版本差异,具体情况请根据当前环境和 Terraform 版本进行调整。

检查服务账号权限

首先,我们需要确保服务账号已经被授予了iam.serviceAccountUser角色。该角色允许用户使用服务账号来访问资源。请确认以下配置中已经包含了服务账号的iam.serviceAccountUser权限:

resource "google_service_account_iam_member" "frontend_service_account_permission" {
  service_account_id = google_service_account.frontend_service_account.name
  role               = "roles/iam.serviceAccountUser"
  member             = "serviceAccount:${data.google_service_account.terraform.email}"
  depends_on         = [google_service_account.frontend_service_account]
}

修改实例模板中的服务账号配置

在实例模板中,service_account 部分的 email 属性配置中,不需要包含 "serviceAccount:" 前缀。请将配置修改如下:

resource "google_compute_instance_template" "frontend_instance_template" {
  name                 = "frontend-template"
  instance_description = "Frontend Instances"
  machine_type         = "f1-micro"
  can_ip_forward       = false
  scheduling {
    automatic_restart   = true
    on_host_maintenance = "MIGRATE"
  }
  disk {
    source_image = data.google_compute_image.compute_image.self_link
    auto_delete  = true
    boot         = true
  }
  network_interface {
    network = google_compute_network.frontend_network.name
  }
  service_account {
    email  = google_service_account.frontend_service_account.email
    scopes = ["default"]
  }
  depends_on = [
    "google_compute_network.frontend_network",
    "google_service_account_iam_member.frontend_service_account_permission",
    "google_project_iam_member.frontend_service_account_role_binding"
  ]
}

添加项目级权限

有时候,项目级别的权限可能也需要手动添加。可以尝试使用以下命令为项目添加服务账号权限:

gcloud projects add-iam-policy-binding <your-project-id> --member=serviceAccount:terraform@vpc-challenge-lab-245114.iam.gserviceaccount.com --role='roles/iam.serviceAccountUser'

如果用户不在组织或文件夹中,可能存在一些隐含的权限问题,这个时候需要检查是否缺少某些权限。

校验其他资源配置

确保所有相关资源(网络、服务账号、自定义角色等)的依赖关系正确,并且所有资源都已成功创建。在配置中,我们可以看到depends_on属性,这些属性指定了资源之间的依赖关系,确保在创建时的正确顺序。

经过以上检查和修改,重新运行 Terraform 部署命令,应该能够顺利创建 GCE 实例组管理器。

如果问题仍然存在,建议检查 Google Cloud Platform 控制台中服务账号和权限的配置,确保与 Terraform 配置一致。同时,确保 Terraform 版本和所使用的 Google Cloud SDK 版本兼容,避免版本差异引起的问题。

正文完