本页面介绍服务账号和虚拟机访问权限范围,以及它们如何与 Dataproc 配合使用。
什么是服务账号?
服务账号是一种特殊账号,在 Compute Engine 虚拟机 (VM) 实例上运行的服务和应用可以使用此账号与其他 Google Cloud API 进行交互。应用可以使用服务账号凭据向自身授权使用一组 API,并在已授予服务账号的权限中对虚拟机执行操作。
Dataproc 服务账号
为以下服务账号授予在集群所在的项目中执行 Dataproc 操作所需的权限。
Dataproc 虚拟机服务帐号:Dataproc 虚拟机服务帐号使用此服务帐号执行 Dataproc 数据平面操作,例如在 Cloud Storage 和 BigQuery 之间读取和写入数据(请参阅 Dataproc 虚拟机服务帐号(数据平面身份))。除非您在创建集群时指定虚拟机服务帐号,否则 Compute Engine 默认服务帐号
[project-number]-compute@developer.gserviceaccount.com
将用作 Dataproc 虚拟机服务帐号。Dataproc Worker 角色可为虚拟机服务账号提供使用 Dataproc 所需的最低权限。如需授予对 Google Cloud 资源(例如 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 角色的虚拟机服务帐号,您可以为集群提供对项目资源的精细访问权限。
初步步骤
在要创建集群的项目中创建自定义虚拟机服务帐号。
向自定义虚拟机服务帐号授予项目的 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.*
权限,而不是向服务帐号授予预定义的 DataprocWorker
角色。- 自定义角色必须至少向虚拟机服务帐号授予对 Dataproc 暂存和临时存储分区中的对象以及将在集群上运行的作业所需的任何其他存储分区中的对象的
storage.objects.create
、storage.objects.get
和storage.objects.update
权限。
- 自定义角色必须至少向虚拟机服务帐号授予对 Dataproc 暂存和临时存储分区中的对象以及将在集群上运行的作业所需的任何其他存储分区中的对象的
创建集群
- 在项目中创建集群。
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
后,请设置以下字段:
serviceAccount
:该服务帐号位于将创建集群的项目中,除非您使用的是其他项目中的虚拟机服务帐号。serviceAccountScopes
:指定集群虚拟机实例的访问权限范围(例如https://www.googleapis.com/auth/cloud-platform
)。
控制台
不支持在 Google Cloud 控制台中设置 Dataproc 虚拟机服务帐号。在创建集群时,您可以在创建集群时为集群虚拟机设置 cloud-platform
访问权限范围,方法是在 Google Cloud 控制台中访问 Dataproc 创建集群页面,然后点击管理安全性面板的项目访问权限部分中的“为此集群启用 cloud-platform 范围”。
使用其他项目中的自定义虚拟机服务帐号创建集群
创建集群时,您可以指定集群将用于 Dataproc 数据平面操作的自定义虚拟机服务帐号,而不是使用默认虚拟机服务帐号(创建集群后,您无法指定自定义虚拟机服务帐号)。通过使用已分配 IAM 角色的自定义虚拟机服务帐号,您可以为集群提供对项目资源的精细访问权限。
初步步骤
在服务帐号项目(自定义虚拟机服务帐号所在的项目)中:
启用 Dataproc API。
向您的电子邮件帐号(即创建集群的用户)授予服务帐号项目的 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
格式提供您的用户帐号电子邮件地址。向自定义虚拟机服务帐号授予集群项目的 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"
向集群项目中的 Dataproc Service Agent 服务帐号授予服务帐号项目的 Service Account User 和 Service 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"
请向集群项目中的 Compute Engine 服务代理服务帐号授予服务帐号项目的 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"
创建集群
后续步骤
- 服务账号
- Dataproc 权限和 IAM 角色
- Dataproc 主账号和角色
- 基于 Dataproc 服务账号的安全多租户
- Dataproc 个人集群身份验证
- Dataproc Granular IAM