本文說明如何查看及管理 Identity and Access Management 服務帳戶角色。除非您在提交批次工作負載、建立工作階段或建立工作階段執行階段範本時指定自訂服務帳戶,否則 Serverless for Apache Spark 批次工作負載或互動式工作階段會以 Compute Engine 預設服務帳戶執行。
安全性規定:您必須具備服務帳戶 ActAs
權限,才能執行無伺服器 Apache Spark 工作負載或工作階段。「Service Account User
」角色具備這項權限。如要進一步瞭解服務帳戶權限,請參閱服務帳戶驗證的角色。
必要 Dataproc 工作站角色
Apache Spark 無伺服器工作負載或工作階段服務帳戶必須具備 IAM Dataproc 工作者角色。根據預設,Serverless for Apache Spark 使用的 Compute Engine 預設服務帳戶 project_number-compute@developer.gserviceaccount.com
具有這個角色。如果您在建立批次工作負載、工作階段或工作階段範本時指定其他服務帳戶,則必須將 Dataproc Worker 角色授予該服務帳戶。如要執行其他作業 (例如從 Cloud Storage 或 BigQuery 讀取及寫入資料),可能需要其他角色。
在某些專案中,系統可能會自動為批次工作負載或工作階段服務帳戶授予專案「編輯者」角色,其中包含 Dataproc 工作者角色權限,以及 Serverless for Apache Spark 不需要的其他權限。為遵循最低權限的安全性最佳做法原則,請將服務帳戶的「編輯者」角色替換為「Dataproc 工作站」角色。
排解權限相關失敗問題
如果 Serverless for Apache Spark 批次工作負載或工作階段使用的服務帳戶權限不正確或不足,可能會導致批次作業或工作階段建立失敗,並回報「Driver compute node failed to initialize for batch in 600 seconds」(驅動程式運算節點無法在 600 秒內初始化批次作業) 錯誤訊息。這項錯誤表示 Spark 驅動程式無法在指定逾時時間內啟動,通常是因為缺少 Google Cloud 資源的必要存取權。
如要排解這個問題,請確認服務帳戶是否具備下列最低角色或權限:
- Dataproc Worker 角色 (
roles/dataproc.worker
):這個角色會授予 Serverless for Apache Spark 必要權限,以便管理及執行 Spark 工作負載和工作階段。 - Storage 物件檢視者 (
roles/storage.objectViewer
)、Storage 物件建立者 (roles/storage.objectCreator
) 或 Storage 物件管理員 (roles/storage.admin
):如果 Spark 應用程式會從 Cloud Storage 值區讀取或寫入資料,服務帳戶必須具備適當的權限才能存取值區。舉例來說,如果輸入資料位於 Cloud Storage 值區,則需要Storage Object Viewer
。如果應用程式將輸出內容寫入 Cloud Storage 值區,則需要Storage Object Creator
或Storage Object Admin
。 - BigQuery 資料編輯者 (
roles/bigquery.dataEditor
) 或 BigQuery 資料檢視者 (roles/bigquery.dataViewer
):如果 Spark 應用程式會與 BigQuery 互動,請確認服務帳戶具有適當的 BigQuery 角色。 - Cloud Logging 權限:服務帳戶需要權限才能將記錄寫入 Cloud Logging,以便有效偵錯。通常
Logging Writer
角色 (roles/logging.logWriter
) 就已足夠。
常見的權限或存取相關失敗
缺少
dataproc.worker
角色:如果沒有這個核心角色,Serverless for Apache Spark 基礎架構就無法正確佈建及管理驅動程式節點。Cloud Storage 權限不足:如果 Spark 應用程式嘗試從 Cloud Storage 值區讀取輸入資料或將輸出資料寫入該值區,但沒有必要的服務帳戶權限,驅動程式可能會因為無法存取重要資源而無法初始化。
網路或防火牆問題:VPC Service Controls 或防火牆規則可能會不慎封鎖服務帳戶對 Google Cloud API 或資源的存取權。
如要驗證及更新服務帳戶權限,請按照下列步驟操作:
- 在 Google Cloud 控制台中,前往「IAM & Admin」(IAM 與管理) >「IAM」(身分與存取權管理) 頁面。
- 找出用於 Serverless for Apache Spark 批次工作負載或工作階段的服務帳戶。
- 確認已指派必要角色。如果沒有,請新增。
如需 Serverless for Apache Spark 角色和權限的清單,請參閱Serverless for Apache Spark 權限和 IAM 角色。
查看及管理 IAM 服務帳戶角色
如要查看及管理授予 Serverless for Apache Spark 批次工作負載或工作階段服務帳戶的角色,請按照下列步驟操作:
前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面。
按一下「包含 Google 提供的角色授權」。
查看批次工作負載或工作階段服務帳戶列出的角色。 下圖顯示 Compute Engine 預設服務帳戶的必要 Dataproc 工作者角色,
project_number-compute@developer.gserviceaccount.com
,Serverless for Apache Spark 預設會將這個帳戶做為工作負載或工作階段服務帳戶。指派給 Google Cloud 控制台 IAM 區段中 Compute Engine 預設服務帳戶的 Dataproc 工作站角色。 您可以點選服務帳戶列中顯示的鉛筆圖示,授予或移除服務帳戶角色。
跨專案服務帳戶
您可以提交使用服務帳戶的 Serverless for Apache Spark 批次工作負載,該服務帳戶來自與批次工作負載專案 (提交批次的專案) 不同的專案。在本節中,服務帳戶所在的專案稱為 service account project
,而提交批次的專案則稱為 batch project
。
為什麼要使用跨專案服務帳戶執行批次工作負載?其中一個可能的原因是,其他專案中的服務帳戶已獲派 IAM 角色,可精細存取該專案中的資源。
設定步驟
在服務帳戶專案中:
Enable the Dataproc API.
在服務帳戶專案中,將服務帳戶使用者角色授予您的電子郵件帳戶 (建立叢集的使用者),或在服務帳戶專案中,將該角色授予服務帳戶,以進行更精細的控制。
詳情請參閱「管理專案、資料夾和機構的存取權」一文,瞭解如何授予專案層級的角色,以及「管理服務帳戶的存取權」一文,瞭解如何授予服務帳戶層級的角色。
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 Worker」角色授予服務帳戶。
gcloud CLI 範例:
gcloud projects add-iam-policy-binding BATCH_PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \ --role="roles/dataproc.worker"
在批次專案中:
在服務帳戶專案中,將服務帳戶使用者和服務帳戶憑證建立者角色授予Dataproc 服務代理程式服務帳戶,或在服務帳戶專案中,將這些角色授予服務帳戶,以進行更精細的控制。這樣做可讓批次專案中的 Dataproc 服務代理程式服務帳戶,為服務帳戶專案中的服務帳戶建立權杖。
詳情請參閱「管理專案、資料夾和機構的存取權」一文,瞭解如何授予專案層級的角色,以及「管理服務帳戶的存取權」一文,瞭解如何授予服務帳戶層級的角色。
gcloud CLI 範例:
下列指令會授予批次專案中的 Dataproc 服務代理人服務帳戶專案層級的「服務帳戶使用者」和「服務帳戶權杖建立者」角色:
gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member=serviceAccount:service-BATCH_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member=serviceAccount:service-BATCH_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountTokenCreator"
下列範例指令會向批次專案中的 Dataproc 服務代理人服務帳戶,授予服務帳戶層級的「服務帳戶使用者」和「服務帳戶權杖建立者」角色:
gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \ --member=serviceAccount:service-BATCH_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-BATCH_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountTokenCreator"
在批次專案中,將服務帳戶專案的服務帳戶憑證建立者角色授予Compute Engine 服務代理人服務帳戶,或在服務帳戶專案中,將該角色授予服務帳戶,以進行更精細的控制。這樣做可授予批次專案中的 Compute Agent Service Agent 服務帳戶權限,為服務帳戶專案中的服務帳戶建立權杖。
詳情請參閱「管理專案、資料夾和機構的存取權」一文,瞭解如何授予專案層級的角色,以及「管理服務帳戶的存取權」一文,瞭解如何授予服務帳戶層級的角色。
gcloud CLI 範例:
下列範例指令會在專案層級,將服務帳戶權杖建立者角色授予批次專案中的 Compute Engine 服務代理程式服務帳戶:
gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member=serviceAccount:service-BATCH_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountTokenCreator"
下列範例指令會授予叢集專案中的 Compute Engine 服務代理程式服務帳戶服務帳戶層級的服務帳戶權杖建立者角色:
gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \ --member=serviceAccount:service-BATCH_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountTokenCreator"
提交批次工作負載
完成設定步驟後,即可提交批次工作負載。請務必在服務帳戶專案中指定服務帳戶,做為批次工作負載使用的服務帳戶。