Serverless for Apache Spark 服务账号

本文档介绍了如何查看和管理 Identity and Access Management 服务账号角色。Serverless for Apache Spark 批处理工作负载或交互式会话作为 Compute Engine 默认服务账号运行,除非您在提交批处理工作负载创建会话创建会话运行时模板时指定自定义服务账号。

安全要求:您需要具有服务账号 ActAs 权限才能执行 Serverless for Apache Spark 工作负载或会话。Service Account User 角色包含此权限。如需详细了解服务账号权限,请参阅服务账号身份验证角色

所需的 Dataproc Worker 角色

Serverless for Apache Spark 工作负载或会话服务账号必须具有 IAM Dataproc Worker 角色。Serverless for Apache Spark 使用的 Compute Engine 默认服务账号 project_number-compute@developer.gserviceaccount.com 默认具有此角色。如果您在创建批处理工作负载、会话或会话模板时指定了其他服务账号,则必须向该服务账号授予 Dataproc Worker 角色。如需执行其他操作(例如在 Cloud Storage 或 BigQuery 中读写数据),可能还需要具备其他角色。

在某些项目中,批量工作负载或会话服务账号可能已被自动授予项目 Editor 角色,该角色包含 Dataproc Worker 角色权限以及 Serverless for Apache Spark 不需要的其他权限。为了遵循最小权限原则这一安全方面的最佳做法,请将服务账号 Editor 角色替换为 Dataproc Worker 角色。

排查基于权限的失败问题

如果 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 Object Viewer (roles/storage.objectViewer)、Storage Object Creator (roles/storage.objectCreator) 或 Storage Object Admin (roles/storage.admin):如果您的 Spark 应用从 Cloud Storage 存储分区读取数据或向其中写入数据,则服务账号需要具有访问相应存储分区的适当权限。例如,如果您的输入数据位于 Cloud Storage 存储桶中,则需要 Storage Object Viewer。如果您的应用将输出写入 Cloud Storage 存储桶,则需要 Storage Object CreatorStorage Object Admin
  • BigQuery Data Editor (roles/bigquery.dataEditor) 或 BigQuery Data Viewer (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 或资源。

如需验证和更新服务账号权限,请执行以下操作:

  1. 前往 Google Cloud 控制台中的 IAM 和管理 > IAM 页面。
  2. 找到用于 Apache Spark 无服务器批量工作负载或会话的服务账号。
  3. 验证是否已分配必要的角色。如果没有,请添加。

如需查看 Serverless for Apache Spark 角色和权限的列表,请参阅 Serverless for Apache Spark 权限和 IAM 角色

查看和管理 IAM 服务账号角色

如需查看和管理向 Serverless for Apache Spark 批处理工作负载或会话服务账号授予的角色,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM

  2. 点击包括 Google 提供的角色授权

  3. 查看为批处理工作负载或会话服务账号列出的角色。 下图显示了为 Compute Engine 默认服务账号 (project_number-compute@developer.gserviceaccount.com) 列出的必需的 Dataproc Worker 角色,Serverless for Apache Spark 在默认情况下使用该服务账号作为工作负载或会话服务账号。

    IAM 控制台中 Compute Engine 默认服务账号的 Dataproc Worker 角色
    在 Google Cloud 控制台的 IAM 部分,分配给 Compute Engine 默认服务账号的 Dataproc Worker 角色。
  4. 您可以点击服务账号行上显示的铅笔图标,以授予或移除服务账号角色

跨项目服务账号

您可以提交一个 Serverless for Apache Spark 批处理工作负载,该工作负载使用来自不同于批处理工作负载项目(提交批处理的项目)的项目的服务账号。在本部分中,服务账号所在的项目称为 service account project,提交批处理作业的项目称为 batch project

为何使用跨项目服务账号来运行批处理工作负载?一种可能的原因是,其他项目中的服务账号已被分配 IAM 角色,这些角色可提供对相应项目中资源的精细访问权限。

设置步骤

  1. 在服务账号项目中:

    1. 允许跨项目关联服务账号

    2. Enable the Dataproc API.

      Enable the API

    3. 向您的电子邮件账号(创建集群的用户)授予适用于服务账号项目的 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
    4. 向服务账号授予批处理项目的 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"
      
  2. 在批处理项目中:

    1. Dataproc 服务代理服务账号授予适用于服务账号项目的 Service Account User 角色和 Service Account Token Creator 角色,或者向服务账号项目中的服务账号授予这些角色,以实现更精细的控制。通过执行此操作,您使批处理项目中的 Dataproc 服务代理服务账号可以为服务账号项目中的服务账号创建令牌。

      如需了解详情,请参阅管理对项目、文件夹和组织的访问权限,以便在项目级别授予角色,并参阅管理对服务账号的访问权限,以便在服务账号级别授予角色。

      gcloud CLI 示例:

      以下命令会在项目级向批处理项目中的 Dataproc 服务代理服务账号授予 Service Account User 角色和 Service Account Token Creator 角色:

      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 Service Agent 服务账号授予 Service Account User 角色和 Service Account Token Creator 角色:

      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"
      
    2. 向批处理项目中的 Compute Engine Service Agent 服务账号授予适用于服务账号项目的 Service Account Token Creator 角色,或者向服务账号项目中的服务账号授予该角色,以实现更精细的控制。通过执行此操作,您使批处理项目中的 Compute Engine Service Agent 服务账号有能力为服务账号项目中的服务账号创建令牌。

      如需了解详情,请参阅管理对项目、文件夹和组织的访问权限,以便在项目级别授予角色,并参阅管理对服务账号的访问权限,以便在服务账号级别授予角色。

      gcloud CLI 示例:

      以下示例命令会在项目级别为批处理项目中的 Compute Engine Service Agent 服务账号授予 Service Account Token Creator 角色:

      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 Service Agent 服务账号授予 Service Account Token Creator 角色:

      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"
      

提交批处理工作负载

完成设置步骤后,您可以提交批处理工作负载。 请务必在服务账号项目中指定要用于批处理工作负载的服务账号。