本頁說明服務帳戶和 VM 存取權範圍,以及如何透過 Dataproc 使用這些帳戶和範圍。
什麼是服務帳戶?
服務帳戶是一種特殊帳戶,可供 Compute Engine 虛擬機器 (VM) 執行個體上執行的服務和應用程式使用,以便與其他 Google Cloud API 互動。應用程式可以透過服務帳戶憑證自行取得一組 API 的授權,並在授予服務帳戶的權限內,在 VM 上執行操作。
Dataproc 服務帳戶
下列服務帳戶已獲得必要權限,可在叢集所在的專案中執行 Dataproc 動作。
- Dataproc VM 服務帳戶: Dataproc 叢集中的 VM 會使用這個服務帳戶執行 Dataproc資料層作業。 除非您在建立叢集時指定 VM 服務帳戶,否則系統會使用 Compute Engine 預設服務帳戶做為 Dataproc VM 服務帳戶。 - project_number-compute@developer.gserviceaccount.com根據預設,Compute Engine 預設服務帳戶會獲得 Dataproc 工作者角色, 其中包含 Dataproc 資料平面作業所需的權限。- 自訂服務帳戶:如果您在建立叢集時指定自訂服務帳戶,則必須授予自訂服務帳戶執行 Dataproc 資料平面作業所需的權限。您可以將 Dataproc 工作者角色指派給服務帳戶,因為這個角色包含 Dataproc 資料平面作業所需的權限。 - 其他角色:您可以授予 VM 服務帳戶其他預先定義或自訂角色,這些角色包含其他作業所需的權限,例如從 Cloud Storage、BigQuery、Cloud Logging 和其他 Google Cloud 資源讀取及寫入資料 (詳情請參閱「查看及管理 IAM 服務帳戶角色」)。 
- Dataproc 服務代理人服務帳戶: Dataproc 會在 Dataproc 使用者的 Google Cloud 專案中,以Dataproc 服務代理人角色建立服務代理人服務帳戶 - service-project_number@dataproc-accounts.iam.gserviceaccount.com。在您建立叢集時,此服務帳戶不得替換為自訂 VM 服務帳戶。這個服務代理帳戶可用於執行 Dataproc 控制層作業,例如建立、更新及刪除叢集 VM。
共用虛擬私有雲網路:如果叢集使用共用虛擬私有雲網路,共用虛擬私有雲管理員必須將共用虛擬私有雲主專案的「網路使用者」角色授予 Dataproc 服務代理人服務帳戶。如需詳細資訊,請參閱:
查看及管理 IAM 服務帳戶角色
如要查看及管理授予 Dataproc VM 服務帳戶的角色,請按照下列步驟操作:
- 前往 Google Cloud 控制台的「IAM」頁面。 
- 按一下「包含 Google 提供的角色授權」。 
- 查看 VM 服務帳戶列出的角色。下圖顯示 Compute Engine 預設服務帳戶 ( - project_number-compute@developer.gserviceaccount.com) 的必要 Dataproc 工作者角色,Dataproc 預設會將這個帳戶做為 VM 服務帳戶。  
- 您可以點選服務帳戶列中顯示的鉛筆圖示,授予或移除服務帳戶角色。 
Dataproc VM 存取範圍
VM 存取範圍和 IAM 角色會共同限制 VM 對 API 的存取權。 Google Cloud舉例來說,如果叢集 VM 只獲得 https://www.googleapis.com/auth/storage-full 範圍的存取權,在叢集 VM 上執行的應用程式就能呼叫 Cloud Storage API,但即使這些應用程式是以已獲授權的 VM 服務帳戶身分執行,且該帳戶已獲授權具有廣泛權限的 BigQuery 角色,應用程式也無法向 BigQuery 提出要求。
最佳做法是將廣泛的 cloud-platform 範圍 (https://www.googleapis.com/auth/cloud-platform) 授予 VM,然後將特定 IAM 角色授予 VM 服務帳戶,藉此限制 VM 存取權。
預設 Dataproc VM 範圍。如果建立叢集時未指定範圍 (請參閱 gcloud dataproc cluster create --scopes),Dataproc VM 會使用下列預設範圍集:
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
如果您在建立叢集時指定範圍,叢集 VM 會具有您指定的範圍和下列最低必要範圍集 (即使您未指定這些範圍):
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
使用自訂 VM 服務帳戶建立叢集
建立叢集時,您可以指定自訂VM 服務帳戶,供叢集用於 Dataproc 資料層作業,而非預設 VM 服務帳戶 (叢集建立後就無法變更 VM 服務帳戶)。使用已指派 IAM 角色的 VM 服務帳戶,可為叢集提供專案資源的精細存取權。
初步步驟
- 在要建立叢集的專案中建立自訂 VM 服務帳戶。 
- 在專案中將「Dataproc Worker」角色授予自訂 VM 服務帳戶,並視工作需求授予其他角色,例如 BigQuery「Reader」和「Writer」角色 (請參閱「Dataproc 權限和 IAM 角色」)。 - gcloud CLI 範例: - 以下指令範例會將專案層級的 Dataproc 工作站角色,授予叢集專案中的自訂 VM 服務帳戶:
 - 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角色。- 自訂角色至少須授予 VM 服務帳戶在Dataproc 暫存和臨時值區中的物件,以及叢集上執行的工作所需的任何其他值區,具有 storage.objects.create、storage.objects.get和storage.objects.update權限。
 
- 自訂角色至少須授予 VM 服務帳戶在Dataproc 暫存和臨時值區中的物件,以及叢集上執行的工作所需的任何其他值區,具有 
 
建立叢集
- 在專案中建立叢集。
gcloud 指令
使用 gcloud dataproc clusters create 指令,建立具有自訂 VM 服務帳戶的叢集。
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,或是在其他叢集中建立使用自訂 VM 服務帳戶的叢集時,其他專案的 ID。
- SCOPE:叢集 VM 執行個體的存取範圍 (例如 https://www.googleapis.com/auth/cloud-platform)。
REST API
完成 GceClusterConfig 做為 clusters.create API 要求的一部分時,請設定下列欄位:
- serviceAccount:服務帳戶會位於叢集建立所在的專案中,除非您使用來自其他專案的 VM 服務帳戶。
- serviceAccountScopes:為叢集 VM 執行個體指定存取範圍 (例如- https://www.googleapis.com/auth/cloud-platform)。
控制台
系統不支援在 Google Cloud 主控台中設定 Dataproc VM 服務帳戶。在 Google Cloud 控制台的 Dataproc「建立叢集」頁面中,按一下「管理安全性」面板的「啟用這個叢集的 cloud-platform 範圍」部分,即可在建立叢集時,設定叢集 VM 的cloud-platform存取範圍。
 
使用其他專案的自訂 VM 服務帳戶建立叢集
建立叢集時,您可以指定叢集要用於 Dataproc 資料層作業的自訂VM 服務帳戶,而非預設 VM 服務帳戶 (叢集建立後就無法指定自訂 VM 服務帳戶)。使用指派 IAM 角色的自訂 VM 服務帳戶,可為叢集提供專案資源的精細存取權。
初步步驟
- 在服務帳戶專案 (自訂 VM 服務帳戶所在的專案) 中: 
- Enable the Dataproc API. - Roles required to enable APIs - To enable APIs, you need the Service Usage Admin IAM role ( - roles/serviceusage.serviceUsageAdmin), which contains the- serviceusage.services.enablepermission. Learn how to grant roles.
 
- 將服務帳戶專案的服務帳戶使用者角色授予您的電子郵件帳戶 (建立叢集的使用者),或在服務帳戶專案中,將自訂 VM 服務帳戶的相同角色授予您的電子郵件帳戶,以進行更精細的控制。 - 如需更多資訊:請參閱「管理專案、資料夾和機構的存取權」一文,瞭解如何授予專案層級的角色,以及「管理服務帳戶的存取權」一文,瞭解如何授予服務帳戶層級的角色。 - gcloud CLI 範例: - 以下範例指令會授予使用者專案層級的服務帳戶使用者角色:
 - gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member=USER_EMAIL \ --role="roles/iam.serviceAccountUser" - 附註: - USER_EMAIL:請提供使用者帳戶電子郵件地址,格式如下:- user:user-name@example.com。- 下列範例指令會在服務帳戶層級,將服務帳戶使用者角色授予使用者:
 - 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 工作站角色授予自訂 VM 服務帳戶。 - 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 服務代理服務帳戶,對象可以是服務帳戶專案,也可以是服務帳戶專案中的自訂 VM 服務帳戶 (如要進行更精細的控制)。這麼做可讓叢集專案中的 Dataproc 服務代理人服務帳戶,為服務帳戶專案中的自訂 Dataproc VM 服務帳戶建立權杖。 - 如需更多資訊:請參閱「管理專案、資料夾和機構的存取權」一文,瞭解如何授予專案層級的角色,以及「管理服務帳戶的存取權」一文,瞭解如何授予服務帳戶層級的角色。 - gcloud CLI 範例: - 下列範例指令會向叢集專案中的 Dataproc 服務代理人服務帳戶,授予專案層級的服務帳戶使用者和服務帳戶權杖建立者角色:
 - 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" - 下列範例指令會在 VM 服務帳戶層級,授予叢集專案中的 Dataproc 服務代理人服務帳戶「服務帳戶使用者」和「服務帳戶權杖建立者」角色:
 - 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 服務代理服務帳戶的服務帳戶憑證建立者角色,授予服務帳戶專案,或授予服務帳戶專案中的自訂 VM 服務帳戶,以進行更精細的控制。這麼做可授予叢集專案中的 Compute Agent 服務代理人服務帳戶權限,為服務帳戶專案中的自訂 Dataproc VM 服務帳戶建立權杖。 - 如需更多資訊:請參閱「管理專案、資料夾和機構的存取權」一文,瞭解如何授予專案層級的角色,以及「管理服務帳戶的存取權」一文,瞭解如何授予服務帳戶層級的角色。 - gcloud CLI 範例: - 下列範例指令會在專案層級,將服務帳戶權杖建立者角色授予叢集專案中的 Compute Engine 服務代理人服務帳戶:
 - 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" - 下列範例指令會在 VM 服務帳戶層級,將服務帳戶權杖建立者角色授予叢集專案中的 Compute Engine 服務代理服務帳戶:
 - 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 精細的身分與存取權管理