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,适用于控制平面 operations.

共享 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 工作器 以及您的作业所需的任何其他角色,例如 BigQuery 读取者和写入者 角色(请参阅 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.* 权限。

创建集群

  • 在项目中创建集群。

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 请求中,请设置以下字段:

控制台

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

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

创建集群时,您可以指定自定义 虚拟机服务账号 供集群用于 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 工作器 角色。

    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 服务代理服务账号 在服务账号项目中为自定义 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 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"
     

创建集群

后续步骤