Dataproc 服务账号

本页面介绍服务账号和虚拟机访问权限范围,以及它们如何与 Dataproc 配合使用。

什么是服务账号?

服务账号是一种特殊账号,在 Compute Engine 虚拟机实例上运行的服务和应用可以使用此账号与其他 Google Cloud API 进行交互。应用可以使用服务账号凭据向自身授权使用一组 API,并在已授予服务账号的权限中对虚拟机执行操作。

Dataproc 服务账号

为以下服务账号授予在集群所在的项目中执行 Dataproc 操作所需的权限。

  • Dataproc Service Agent 服务账号:Dataproc 在 Dataproc 用户的 Google Cloud 项目中创建具有 Dataproc Service Agent 角色的 Service Agent 服务账号 service-project_number@dataproc-accounts.iam.gserviceaccount.com。当您创建集群时,不能将此服务账号替换为自定义虚拟机服务账号。此服务代理账号可用于执行 Dataproc 控制平面操作,例如创建、更新和删除集群虚拟机。

共享 VPC 网络:如果集群使用共享 VPC 网络,则共享 VPC 管理员必须向 Dataproc Service Agent 服务账号授予适用于共享 VPC 宿主项目的 Network User 角色。有关详情,请参阅:

查看和管理 IAM 服务账号角色

如需查看和管理向 Dataproc 虚拟机服务账号授予的角色,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM

  2. 点击包括 Google 提供的角色授权

  3. 查看为虚拟机服务账号列出的角色。下图显示了为 Dataproc 在默认情况下用作虚拟机服务账号的 Compute Engine 默认服务账号 (project_number-compute@developer.gserviceaccount.com) 列出的必需的 Dataproc Worker 角色。

  4. 您可以点击服务账号行上显示的铅笔图标,以授予或移除服务账号角色

Dataproc 虚拟机访问权限范围

虚拟机访问权限范围和 IAM 角色协同工作,以限制虚拟机对 Google CloudAPI 的访问权限。例如,如果仅向集群虚拟机授予 https://www.googleapis.com/auth/storage-full 范围,则在集群虚拟机上运行的应用可以调用 Cloud Storage API,但是它们无法向 BigQuery 发出请求,即使用于运行它们的虚拟机服务账号已被授予具有广泛权限的 BigQuery 角色也不例外。

最佳做法是向虚拟机授予广泛的 cloud-platform 范围 (https://www.googleapis.com/auth/cloud-platform),然后通过向虚拟机服务账号授予特定的 IAM 角色来限制虚拟机访问权限。

默认 Dataproc 虚拟机范围。如果您在创建集群时未指定范围(请参阅 gcloud dataproc cluster create --scopes),Dataproc 虚拟机将具有以下默认范围集:

https://www.googleapis.com/auth/cloud-platform (clusters created with image version 2.1+).
https://www.googleapis.com/auth/bigquery
https://www.googleapis.com/auth/bigtable.admin.table
https://www.googleapis.com/auth/bigtable.data
https://www.googleapis.com/auth/cloud.useraccounts.readonly
https://www.googleapis.com/auth/devstorage.full_control
https://www.googleapis.com/auth/devstorage.read_write
https://www.googleapis.com/auth/logging.write

如果您在创建集群时指定了范围,则集群虚拟机将拥有您指定的范围以及下面的必需的最小范围集(即使您未指定这些范围):

https://www.googleapis.com/auth/cloud-platform (clusters created with image version 2.1+).
https://www.googleapis.com/auth/cloud.useraccounts.readonly
https://www.googleapis.com/auth/devstorage.read_write
https://www.googleapis.com/auth/logging.write

创建使用自定义虚拟机服务账号的集群

创建集群时,您可以指定集群将用于 Dataproc 数据平面操作的自定义虚拟机服务账号,而不是使用默认的虚拟机服务账号(在创建集群后,您无法更改虚拟机服务账号)。使用分配有 IAM 角色的虚拟机服务账号,您可以为集群提供精细的项目资源访问权限。

初步步骤

  1. 在将要创建集群的项目中创建自定义虚拟机服务账号

  2. 向自定义虚拟机服务账号授予适用于该项目的 Dataproc Worker 角色以及作业所需的任何其他角色,例如 BigQuery Reader 和 Writer 角色(请参阅 Dataproc 权限和 IAM 角色)。

    gcloud CLI 示例:

    • 以下示例命令会在项目级别向集群项目中的自定义虚拟机服务账号授予 Dataproc Worker 角色:
    gcloud projects add-iam-policy-binding CLUSTER_PROJECT_ID \
        --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role="roles/dataproc.worker"
     
    • 考虑使用自定义角色:您可以向服务账号授予包含 Worker 角色权限但限制 storage.objects.* 权限的自定义角色,而不是向服务账号授予预定义的 Dataproc Worker 角色。
      • 自定义角色必须至少向虚拟机服务账号授予对 Dataproc 暂存存储桶和临时存储桶以及在集群上运行的作业所需的任何其他存储桶上的对象的 storage.objects.createstorage.objects.getstorage.objects.update 权限。

创建集群

  • 在项目中创建集群。

gcloud 命令

使用 gcloud dataproc clusters create 命令,创建使用自定义虚拟机服务账号的集群。

gcloud dataproc clusters create CLUSTER_NAME \
    --region=REGION \
    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
    --scopes=SCOPE

请替换以下内容:

  • CLUSTER_NAME:集群名称(在项目中必须是唯一的)。该名称必须以小写字母开头,最多可包含 51 个小写字母、数字和连字符。它不能以连字符结尾。已删除集群的名称可以再次使用。
  • REGION:集群所在的区域
  • SERVICE_ACCOUNT_NAME:服务账号名称。
  • PROJECT_ID:包含您的虚拟机服务账号的项目的 Google Cloud 项目 ID。这是您将在其中创建集群的项目的 ID,或者是另一项目的 ID(如果您要创建使用另一集群中的自定义虚拟机服务账号的集群)。
  • SCOPE:集群虚拟机实例的访问权限范围(例如 https://www.googleapis.com/auth/cloud-platform)。

REST API

clusters.create API 请求中完成 GceClusterConfig 后,请设置以下字段:

控制台

不支持在 Google Cloud 控制台中设置 Dataproc 虚拟机服务账号。创建集群时,您可以在 Google Cloud 控制台中 Dataproc 创建集群页面上管理安全设置面板的项目访问权限部分中,点击“为此集群启用 cloud-platform 范围”,从而在集群虚拟机上设置 cloud-platform 访问权限范围

创建使用另一项目的自定义虚拟机服务账号的集群

创建集群时,您可以指定集群将用于 Dataproc 数据平面操作的自定义虚拟机服务账号,而不是使用默认的虚拟机服务账号(在创建集群后,您无法指定自定义虚拟机服务账号)。使用分配有 IAM 角色的自定义虚拟机服务账号,您可以为集群提供精细的项目资源访问权限。

初步步骤

  1. 在服务账号项目(自定义虚拟机服务账号所在的项目)中:

    1. 允许跨项目关联服务账号

    2. Enable the Dataproc API.

      Enable the API

  2. 向您的电子邮件账号(创建集群的用户)授予适用于服务账号项目的 Service Account User 角色,或者向服务账号项目中的自定义虚拟机服务账号授予该角色,以实现更精细的控制。

    如需了解详情:请参阅管理对项目、文件夹和组织的访问权限,以便在项目级别授予角色,并参阅管理对服务账号的访问权限,以便在服务账号级别授予角色。

    gcloud CLI 示例:

    • 以下示例命令会在项目级别向用户授予 Service Account User 角色:
    gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
        --member=USER_EMAIL \
        --role="roles/iam.serviceAccountUser"
    

    注意:USER_EMAIL:提供您的用户账号电子邮件地址,格式为:user:user-name@example.com

    • 以下示例命令会在服务账号级别向用户授予 Service Account User 角色:
    gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \
        --member=USER_EMAIL \
        --role="roles/iam.serviceAccountUser"
    

    注意:USER_EMAIL:提供您的用户账号电子邮件地址,格式为:user:user-name@example.com

  3. 向自定义虚拟机服务账号授予适用于集群项目的 Dataproc Worker 角色。

    gcloud CLI 示例:

    gcloud projects add-iam-policy-binding CLUSTER_PROJECT_ID \
        --member=serviceAccount:SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
        --role="roles/dataproc.worker"
     
  4. 向集群项目中的 Dataproc Service Agent 服务账号授予适用于服务账号项目的 Service Account User 角色和 Service Account Token Creator 角色,或者向服务账号项目中的自定义虚拟机服务账号授予这些角色,以实现更精细的控制。通过执行此操作,您使集群项目中的 Dataproc Service Agent 服务账号可以为服务账号项目中的自定义 Dataproc 虚拟机服务账号创建令牌。

    如需了解详情:请参阅管理对项目、文件夹和组织的访问权限,以便在项目级别授予角色,并参阅管理对服务账号的访问权限,以便在服务账号级别授予角色。

    gcloud CLI 示例:

    • 以下示例命令会在项目级别向集群项目中的 Dataproc Service Agent 服务账号授予 Service Account User 角色和 Service Account Token Creator 角色:
    gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
        --member=serviceAccount:service-CLUSTER_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \
        --role="roles/iam.serviceAccountUser"
     
    gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
        --member=serviceAccount:service-CLUSTER_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \
        --role="roles/iam.serviceAccountTokenCreator"
    
    • 以下示例命令会在虚拟机服务账号级别向集群项目中的 Dataproc Service Agent 服务账号授予 Service Account User 角色和 Service Account Token Creator 角色:
    gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \
        --member=serviceAccount:service-CLUSTER_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \
        --role="roles/iam.serviceAccountUser"
     
    gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \
        --member=serviceAccount:service-CLUSTER_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \
        --role="roles/iam.serviceAccountTokenCreator"
    
  5. 向集群项目中的 Compute Engine Service Agent 服务账号授予适用于服务账号项目的 Service Account Token Creator 角色,或者向服务账号项目中的自定义虚拟机服务账号授予该角色,以实现更精细的控制。通过执行此操作,您使集群项目中的 Compute Engine Service Agent 服务账号有能力为服务账号项目中的自定义 Dataproc 虚拟机服务账号创建令牌。

    如需了解详情:请参阅管理对项目、文件夹和组织的访问权限,以便在项目级别授予角色,并参阅管理对服务账号的访问权限,以便在服务账号级别授予角色。

    gcloud CLI 示例:

    • 以下示例命令会在项目级别为集群项目中的 Compute Engine Service Agent 服务账号授予 Service Account Token Creator 角色:
    gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
        --member=serviceAccount:service-CLUSTER_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
        --role="roles/iam.serviceAccountTokenCreator"
     
    • 以下示例命令会在虚拟机服务账号级别向集群项目中的 Compute Engine Service Agent 服务账号授予 Service Account Token Creator 角色:
    gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \
        --member=serviceAccount:service-CLUSTER_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
        --role="roles/iam.serviceAccountTokenCreator"
     

创建集群

后续步骤