Dataproc 服务账号

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

什么是服务账号?

服务账号是一种特殊账号,在 Compute Engine 虚拟机 (VM) 实例上运行的服务和应用可以使用此账号与其他 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 服务代理服务账号授予共享 VPC 主项目的 Network User 角色。如需了解详情,请参阅以下主题:

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

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

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

    转到 IAM

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

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

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

Dataproc 虚拟机访问权限范围

虚拟机访问权限范围和 IAM 角色协同工作,限制虚拟机对 Google Cloud API 的访问权限。例如,如果仅向集群虚拟机授予 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 集群创建 -- 范围),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 虚拟机服务账号。您可以在创建集群时为集群虚拟机设置 cloud-platform 访问范围,方法是在 Google Cloud 控制台中 Dataproc 创建集群页面上的“管理安全设置”面板的“项目访问权限”部分中,点击“为此集群启用云平台范围”。

使用来自其他项目的自定义虚拟机服务账号创建集群

创建集群时,您可以指定集群将用于 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 UserService Account Token Creator 角色,或者(如需更精细的控制)向服务账号项目中的自定义虚拟机服务账号授予这些角色。这样一来,您就可以允许集群项目中的 Dataproc 服务代理服务账号为服务账号项目中的自定义 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 Agent 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 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"
     

创建集群

后续步骤