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 数据平面操作所需的最低权限。还需要其他角色,才能授予 操作,例如在 BigQuery 中读取和写入数据。

  • 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"
     
    • 考虑使用自定义角色:无需向服务授予 为该账号分配预定义的 Dataproc Worker 角色,您可以向账号授予 服务账号 - 包含工作器角色权限的自定义角色 但会限制 storage.objects.* 权限。
      • 自定义角色必须至少向虚拟机服务账号授予对 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:您的 Cloud SDK 所属的项目的 Google Cloud 项目 ID 虚拟机服务账号。这将是 将在其中创建集群的项目,或者是另一个项目的 ID(如果您是 在另一个集群中使用自定义虚拟机服务账号创建集群
  • SCOPE:集群虚拟机实例的访问权限范围(例如 https://www.googleapis.com/auth/cloud-platform)。

REST API

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

控制台

不支持在 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 Account User 角色 和 Service Account Token Creator 角色 为服务账号项目分配不同的角色,或者,为了更精细地控制 服务账号项目中的自定义虚拟机服务账号。这样一来,您就可以允许集群项目中的 Dataproc Service Agent 服务账号为服务账号项目中的自定义 Dataproc 虚拟机服务账号创建令牌。

    更多信息:如需在项目级授予角色,请参阅管理对项目、文件夹和组织的访问权限;如需在服务账号级授予角色,请参阅管理对服务账号的访问权限

    gcloud CLI 示例

    • 以下示例命令会授予 Dataproc 服务代理 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. 授予 集群项目中的 Google API 服务代理服务账号 Service Account Token Creator 指定不同的角色 服务账号项目中的自定义虚拟机服务账号。 这样一来,您就可以向集群项目中的 Google API Service Agent 服务账号授予为服务账号项目中的自定义 Dataproc VM 服务账号创建令牌的权限。

    更多信息:如需在项目级授予角色,请参阅管理对项目、文件夹和组织的访问权限;如需在服务账号级授予角色,请参阅管理对服务账号的访问权限

    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 Agent 服务账号授予 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"
     

创建集群

后续步骤