Dataproc 服务账号

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

什么是服务账号?

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

Dataproc 服务账号

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

  • Dataproc 虚拟机服务帐号:Dataproc 集群中的虚拟机使用此服务帐号执行 Dataproc 数据平面操作。除非您在创建集群时指定虚拟机服务帐号,否则 Compute Engine 默认服务帐号 [project-number]-compute@developer.gserviceaccount.com 将用作 Dataproc 虚拟机服务帐号。默认情况下,系统会向 Compute Engine 默认服务帐号授予 Project Editor 角色,该角色拥有为大多数 Google Cloud 服务创建和删除资源的权限,包括执行 Dataproc 数据平面操作所需的权限。

    自定义服务帐号:如果您在创建集群时指定自定义服务帐号,则必须向自定义服务帐号授予 Dataproc 数据平面操作所需的权限。为此,您可以将 Dataproc Worker 角色分配给服务帐号,因为此角色包含 Dataproc 数据平面操作所需的最低权限。如需授予执行其他操作(如读取和写入数据)的权限,还需要具备其他角色。

  • Dataproc Service Agent 服务账号:Dataproc 在 Dataproc 用户的 Google Cloud 项目中创建具有 Dataproc Service Agent 角色的此服务账号。创建集群时,不能将此服务帐号替换为自定义虚拟机服务帐号。此服务账号代理可用于执行 Dataproc 控制平面操作,例如创建、更新和删除集群虚拟机的操作(请参阅 Dataproc Service Agent(控制平面身份))。

    默认情况下,Dataproc 使用 service-[project-number]@dataproc-accounts.iam.gserviceaccount.com 作为服务代理账号。如果该服务帐号没有权限,则 Dataproc 会使用 Google API 服务代理帐号 [project-number]@cloudservices.gserviceaccount.com 来执行控制平面操作。

共享 VPC 网络:如果集群使用共享 VPC 网络,Shared VPC Admin 必须向以上两个服务账号授予共享 VPC 主项目的 Network User 角色。如需了解详情,请参阅以下主题:

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 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"
     
    • 考虑使用自定义角色:您可以向服务帐号授予包含工作器角色权限但限制 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 创建集群页面上,点击管理安全性面板的项目访问权限部分中的“为此集群启用 cloud-platform 范围”。

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

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

初步步骤

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

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

    2. 启用 Dataproc API。

      启用 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 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. 向集群项目中的 Google API 服务代理服务帐号授予服务帐号项目的 Service Account Token Creator 角色,或者为服务帐号项目中的自定义虚拟机服务帐号(进行更精细的控制)授予该角色。通过执行此操作,您可以授权集群项目中的 Google API 服务代理服务帐号为服务帐号项目中的自定义 Dataproc 虚拟机服务帐号创建令牌。

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

    gcloud CLI 示例

    • 以下示例命令会在集群项目中向 Google API 服务代理服务帐号授予项目级别的 Service Account Token Creator 角色:
    gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
        --member=serviceAccount:CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com \
        --role="roles/iam.serviceAccountTokenCreator"
     
    • 以下示例命令会在虚拟机服务帐号级别向集群项目中的 Google API 服务代理服务帐号授予 Service Account Token Creator 角色:
    gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \
        --member=serviceAccount:CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com \
        --role="roles/iam.serviceAccountTokenCreator"
     
  6. 向集群项目中的 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 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"
     

创建集群

后续步骤