Cuenta de servicio de Serverless para Apache Spark

En este documento se describe cómo ver y gestionar los roles de las cuentas de servicio de Gestión de Identidades y Accesos (IAM). Una carga de trabajo por lotes o una sesión interactiva de Serverless para Apache Spark se ejecuta como la cuenta de servicio predeterminada de Compute Engine, a menos que especifiques una cuenta de servicio personalizada al enviar una carga de trabajo por lotes, crear una sesión o crear una plantilla de tiempo de ejecución de sesión.

Requisito de seguridad: debes tener el permiso de cuenta de servicio ActAs para ejecutar cargas de trabajo o sesiones de Serverless para Apache Spark. El rol Service Account User tiene este permiso. Para obtener información detallada sobre los permisos de las cuentas de servicio, consulta el artículo Roles para la autenticación de cuentas de servicio.

Rol de trabajador de Dataproc necesario

La cuenta de servicio de la carga de trabajo o de la sesión de Serverless para Apache Spark debe tener el rol de gestión de identidades y accesos trabajador de Dataproc. La cuenta de servicio predeterminada de Compute Engine, project_number-compute@developer.gserviceaccount.com, que usa Serverless para Apache Spark, tiene este rol de forma predeterminada. Si especificas una cuenta de servicio diferente al crear una carga de trabajo, una sesión o una plantilla de sesión por lotes, debes asignar el rol de trabajador de Dataproc a la cuenta de servicio. Es posible que se necesiten roles adicionales para otras operaciones, como leer y escribir datos desde y hacia Cloud Storage o BigQuery.

En algunos proyectos, es posible que se haya concedido automáticamente a la cuenta de servicio de la carga de trabajo por lotes o de la sesión el rol Editor del proyecto, que incluye los permisos del rol Trabajador de Dataproc, además de otros permisos que no necesita Serverless para Apache Spark. Para seguir el principio de mínimos privilegios, que es una práctica recomendada de seguridad, sustituye el rol Editor de la cuenta de servicio por el rol Trabajador de Dataproc.

Solucionar problemas basados en permisos

Si la cuenta de servicio que usa tu carga de trabajo o sesión por lotes de Serverless para Apache Spark tiene permisos incorrectos o insuficientes, se pueden producir errores al crear lotes o sesiones, que mostrarán el mensaje de error "Driver compute node failed to initialize for batch in 600 seconds" (No se ha podido inicializar el nodo de cálculo del controlador para el lote en 600 segundos). Este error indica que el controlador de Spark no se ha podido iniciar en el periodo de tiempo de espera asignado, a menudo debido a la falta de acceso necesario a los recursos de Google Cloud .

Para solucionar este problema, comprueba que tu cuenta de servicio tenga los siguientes roles o permisos mínimos:

  • Rol Trabajador de Dataproc (roles/dataproc.worker): este rol otorga los permisos necesarios para que Serverless para Apache Spark gestione y ejecute cargas de trabajo y sesiones de Spark.
  • Lector de objetos de Storage (roles/storage.objectViewer), Creador de objetos de Storage (roles/storage.objectCreator) o Administrador de objetos de Storage (roles/storage.admin): si tu aplicación Spark lee o escribe en segmentos de Cloud Storage, la cuenta de servicio necesita los permisos adecuados para acceder a los segmentos. Por ejemplo, si los datos de entrada están en un segmento de Cloud Storage, se requiere Storage Object Viewer. Si tu aplicación escribe la salida en un segmento de Cloud Storage, se necesita Storage Object Creator o Storage Object Admin.
  • Editor de datos de BigQuery (roles/bigquery.dataEditor) o Lector de datos de BigQuery (roles/bigquery.dataViewer): si tu aplicación Spark interactúa con BigQuery, comprueba que la cuenta de servicio tenga los roles de BigQuery adecuados.
  • Permisos de Cloud Logging: la cuenta de servicio necesita permisos para escribir registros en Cloud Logging y depurar de forma eficaz. Normalmente, el rol Logging Writer (roles/logging.logWriter) es suficiente.
  • Falta el rol dataproc.worker: sin este rol principal, la infraestructura de Serverless para Apache Spark no puede aprovisionar ni gestionar correctamente el nodo de controlador.

  • Permisos de Cloud Storage insuficientes: si tu aplicación Spark intenta leer datos de entrada o escribir datos de salida en un segmento de Cloud Storage sin los permisos de cuenta de servicio necesarios, el controlador no podrá inicializarse porque no tiene acceso a recursos críticos.

  • Problemas de red o de firewall: Controles de Servicio de VPC o las reglas de firewall pueden bloquear por error el acceso de la cuenta de servicio a las APIs o los recursos de Google Cloud .

Para verificar y actualizar los permisos de la cuenta de servicio, sigue estos pasos:

  1. Ve a la página IAM y administración > IAM en la Google Cloud consola.
  2. Busca la cuenta de servicio que se usa en tus cargas de trabajo o sesiones por lotes de Serverless para Apache Spark.
  3. Comprueba que se han asignado los roles necesarios. Si no es así, añádelos.

Para ver una lista de los roles y permisos de Serverless para Apache Spark, consulta Permisos y roles de IAM de Serverless para Apache Spark.

Ver y gestionar roles de cuentas de servicio de gestión de identidades y accesos

Para ver y gestionar los roles concedidos a la cuenta de servicio de la carga de trabajo por lotes o de la sesión de Serverless para Apache Spark, siga estos pasos:

  1. En la consola, ve a la página Gestión de identidades y accesos. Google Cloud

    Ir a IAM

  2. Haz clic en Incluir concesiones de roles proporcionadas por Google.

  3. Consulta los roles que se han asignado a la cuenta de servicio de la carga de trabajo por lotes o de la sesión. En la siguiente imagen se muestra el rol Trabajador de Dataproc necesario de la cuenta de servicio predeterminada de Compute Engine, project_number-compute@developer.gserviceaccount.com, que Serverless para Apache Spark usa de forma predeterminada como cuenta de servicio de carga de trabajo o de sesión.

    Rol de trabajador de Dataproc para la cuenta de servicio predeterminada de Compute Engine en la consola de gestión de identidades y accesos
    El rol de trabajador de Dataproc asignado a la cuenta de servicio predeterminada de Compute Engine en la sección IAM de la consola Google Cloud .
  4. Puedes hacer clic en el icono del lápiz que aparece en la fila de la cuenta de servicio para asignar o quitar roles de la cuenta de servicio.

Cuenta de servicio entre proyectos

Puedes enviar una carga de trabajo por lotes de Serverless para Apache Spark que use una cuenta de servicio de un proyecto diferente al proyecto de la carga de trabajo por lotes (el proyecto en el que se envía el lote). En esta sección, el proyecto en el que se encuentra la cuenta de servicio se denomina service account project, y el proyecto en el que se envía el lote se denomina batch project.

¿Por qué usar una cuenta de servicio entre proyectos para ejecutar una carga de trabajo por lotes? Una posible razón es que a la cuenta de servicio del otro proyecto se le hayan asignado roles de IAM que proporcionen un acceso detallado a los recursos de ese proyecto.

Pasos de configuración

  1. En el proyecto de la cuenta de servicio:

    1. Habilita la vinculación de cuentas de servicio entre proyectos.

    2. 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.enable permission. Learn how to grant roles.

      Enable the API

    3. Asigna a tu cuenta de correo (el usuario que crea el clúster) el rol Usuario de cuenta de servicio en el proyecto de la cuenta de servicio o, para tener un control más granular, en la cuenta de servicio del proyecto de la cuenta de servicio.

      Para obtener más información, consulta los artículos Administrar el acceso a proyectos, carpetas y organizaciones para asignar roles a nivel de proyecto y Gestionar el acceso a cuentas de servicio para asignar roles a nivel de cuenta de servicio.

      Ejemplos de la CLI de gcloud:

      El siguiente comando de ejemplo asigna al usuario el rol Usuario de cuenta de servicio a nivel de proyecto:

      gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
          --member=USER_EMAIL \
          --role="roles/iam.serviceAccountUser"
      

      Notas:

      • USER_EMAIL: proporcione la dirección de correo de su cuenta de usuario con el formato user:user-name@example.com.

      El siguiente comando de ejemplo asigna al usuario el rol Usuario de cuenta de servicio a nivel de cuenta de servicio:

      gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \
          --member=USER_EMAIL \
          --role="roles/iam.serviceAccountUser"
      

      Notas:

      • USER_EMAIL: proporcione la dirección de correo de su cuenta de usuario con el siguiente formato: user:user-name@example.com.
    4. Asigna a la cuenta de servicio el rol Trabajador de Dataproc en el proyecto del lote.

      Ejemplo de la CLI de gcloud:

      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. En el proyecto de lote:

    1. Asigna a la cuenta de servicio del agente de servicio de Dataproc los roles Usuario de cuenta de servicio y Creador de tokens de cuenta de servicio en el proyecto de la cuenta de servicio o, para tener un control más granular, en la cuenta de servicio del proyecto de la cuenta de servicio. De esta forma, permites que la cuenta de servicio del agente de servicio de Dataproc del proyecto de lote cree tokens para la cuenta de servicio del proyecto de cuenta de servicio.

      Para obtener más información, consulta los artículos Administrar el acceso a proyectos, carpetas y organizaciones para asignar roles a nivel de proyecto y Gestionar el acceso a cuentas de servicio para asignar roles a nivel de cuenta de servicio.

      Ejemplos de la CLI de gcloud:

      Los siguientes comandos conceden a la cuenta de servicio del agente de servicio de Dataproc en el proyecto de lote los roles Usuario de cuenta de servicio y Creador de tokens de cuenta de servicio a nivel de proyecto:

      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"
      

      Los siguientes comandos de ejemplo asignan a la cuenta de servicio del agente de servicio de Dataproc en el proyecto de lote los roles Usuario de cuenta de servicio y Creador de tokens de cuenta de servicio a nivel de cuenta de servicio:

      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. Asigna a la cuenta de servicio del agente de servicio de Compute Engine del proyecto por lotes el rol Creador de tokens de cuenta de servicio en el proyecto de la cuenta de servicio o, para tener un control más granular, en la cuenta de servicio del proyecto de la cuenta de servicio. De esta forma, concedes a la cuenta de servicio del agente de servicio de Compute del proyecto de lote la capacidad de crear tokens para la cuenta de servicio del proyecto de cuenta de servicio.

      Para obtener más información, consulta los artículos Administrar el acceso a proyectos, carpetas y organizaciones para asignar roles a nivel de proyecto y Gestionar el acceso a cuentas de servicio para asignar roles a nivel de cuenta de servicio.

      Ejemplos de la CLI de gcloud:

      El siguiente comando de ejemplo asigna el rol Creador de tokens de cuenta de servicio a la cuenta de servicio del agente de servicio de Compute Engine en el proyecto por lotes a nivel de proyecto:

      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"
      

      El siguiente comando de ejemplo asigna el rol Creador de tokens de cuenta de servicio a la cuenta de servicio del agente de servicio de Compute Engine en el proyecto del clúster a nivel de cuenta de servicio:

      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"
      

Enviar la carga de trabajo por lotes

Una vez que hayas completado los pasos de configuración, podrás enviar una carga de trabajo por lotes. Asegúrate de especificar la cuenta de servicio del proyecto de la cuenta de servicio como la cuenta que se va a usar en la carga de trabajo por lotes.