Usar cuentas de servicio

Algunas fuentes de datos admiten la autenticación de transferencia de datos mediante una cuenta de servicio a través de la consola, la API o la línea de comandos bq. Google Cloud Una cuenta de servicio es una cuenta de Google asociada a tu proyecto de Google Cloud . Una cuenta de servicio puede ejecutar trabajos, como consultas programadas o pipelines de procesamiento por lotes, autenticándose con las credenciales de la cuenta de servicio en lugar de con las de un usuario.

Puedes actualizar una transferencia de datos con las credenciales de una cuenta de servicio. Para obtener más información, consulta Actualizar las credenciales de transferencia de datos.

En las siguientes situaciones, es necesario actualizar las credenciales:

  • No se ha podido autorizar el acceso del usuario a la fuente de datos en la transferencia:

    Error code 401 : Request is missing required authentication credential. UNAUTHENTICATED

  • Recibes un error INVALID_USER cuando intentas ejecutar la transferencia:

    Error code 5 : Authentication failure: User Id not found. Error code: INVALID_USERID

Para obtener más información sobre la autenticación con cuentas de servicio, consulta el artículo Introducción a la autenticación.

Fuentes de datos compatibles con cuentas de servicio

BigQuery Data Transfer Service puede usar las credenciales de la cuenta de servicio para las transferencias con lo siguiente:

Antes de empezar

  • Comprueba que has completado todas las acciones necesarias en Habilitar BigQuery Data Transfer Service.
  • Concede roles de gestión de identidades y accesos (IAM) que proporcionen a los usuarios los permisos necesarios para realizar cada tarea de este documento.

Permisos obligatorios

Para actualizar una transferencia de datos y usar una cuenta de servicio, debes tener los siguientes permisos:

  • El permiso bigquery.transfers.update para modificar la transferencia.

    El rol de gestión de identidades y accesos roles/bigquery.admin predefinido incluye este permiso.

  • Acceso a la cuenta de servicio. Para obtener más información sobre cómo asignar el rol de cuenta de servicio a los usuarios, consulta el artículo Rol Usuario de cuenta de servicio.

Asegúrate de que la cuenta de servicio que elijas para ejecutar la transferencia tenga los siguientes permisos:

  • Los permisos bigquery.datasets.get y bigquery.datasets.update en el conjunto de datos de destino. Si la tabla usa el control de acceso a nivel de columna, la cuenta de servicio también debe tener el permiso bigquery.tables.setCategory.

    El rol de gestión de identidades y accesos predefinido bigquery.admin incluye todos estos permisos. Para obtener más información sobre los roles de gestión de identidades y accesos en BigQuery Data Transfer Service, consulta la introducción a la gestión de identidades y accesos.

  • Acceso a la fuente de datos de la transferencia configurada. Para obtener más información sobre los permisos necesarios para las distintas fuentes de datos, consulta el artículo Fuentes de datos compatibles con cuentas de servicio.

  • En el caso de las transferencias de Google Ads, la cuenta de servicio debe tener autoridad en todo el dominio. Para obtener más información, consulta la guía de cuentas de servicio de la API de Google Ads.

Actualizar las credenciales de transferencia de datos

Consola

En el siguiente procedimiento se explica cómo actualizar una configuración de transferencia de datos para autenticarla como cuenta de servicio en lugar de como cuenta de usuario individual.

  1. En la Google Cloud consola, ve a la página Transferencias de datos.

    Ir a Transferencias de datos

  2. En la lista de transferencias de datos, haga clic en la transferencia que quiera.

  3. Haz clic en EDITAR para actualizar la configuración de la transferencia.

    Haga clic en Editar para modificar una transferencia de datos.

  4. En el campo Cuenta de servicio, introduce el nombre de la cuenta de servicio.

  5. Haz clic en Guardar.

bq

Para actualizar las credenciales de una transferencia de datos, puedes usar la herramienta de línea de comandos bq para actualizar la configuración de la transferencia.

Usa el comando bq update con las marcas --transfer_config, --update_credentials y --service_account_name.

Por ejemplo, el siguiente comando actualiza una configuración de transferencia de datos para autenticarla como una cuenta de servicio en lugar de como tu cuenta de usuario individual:

bq update \
--transfer_config \
--update_credentials \
--service_account_name=abcdef-test-sa@abcdef-test.iam.gserviceaccount.com projects/862514376110/locations/us/transferConfigs/5dd12f26-0000-262f-bc38-089e0820fe38 \

Java

Antes de probar este ejemplo, sigue las Javainstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Java de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

import com.google.api.gax.rpc.ApiException;
import com.google.cloud.bigquery.datatransfer.v1.DataTransferServiceClient;
import com.google.cloud.bigquery.datatransfer.v1.TransferConfig;
import com.google.cloud.bigquery.datatransfer.v1.UpdateTransferConfigRequest;
import com.google.protobuf.FieldMask;
import com.google.protobuf.util.FieldMaskUtil;
import java.io.IOException;

// Sample to update credentials in transfer config.
public class UpdateCredentials {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String configId = "MY_CONFIG_ID";
    String serviceAccount = "MY_SERVICE_ACCOUNT";
    TransferConfig transferConfig = TransferConfig.newBuilder().setName(configId).build();
    FieldMask updateMask = FieldMaskUtil.fromString("service_account_name");
    updateCredentials(transferConfig, serviceAccount, updateMask);
  }

  public static void updateCredentials(
      TransferConfig transferConfig, String serviceAccount, FieldMask updateMask)
      throws IOException {
    try (DataTransferServiceClient dataTransferServiceClient = DataTransferServiceClient.create()) {
      UpdateTransferConfigRequest request =
          UpdateTransferConfigRequest.newBuilder()
              .setTransferConfig(transferConfig)
              .setUpdateMask(updateMask)
              .setServiceAccountName(serviceAccount)
              .build();
      dataTransferServiceClient.updateTransferConfig(request);
      System.out.println("Credentials updated successfully");
    } catch (ApiException ex) {
      System.out.print("Credentials was not updated." + ex.toString());
    }
  }
}

Python

Antes de probar este ejemplo, sigue las Pythoninstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Python de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

from google.cloud import bigquery_datatransfer
from google.protobuf import field_mask_pb2

transfer_client = bigquery_datatransfer.DataTransferServiceClient()

service_account_name = "abcdef-test-sa@abcdef-test.iam.gserviceaccount.com"
transfer_config_name = "projects/1234/locations/us/transferConfigs/abcd"

transfer_config = bigquery_datatransfer.TransferConfig(name=transfer_config_name)

transfer_config = transfer_client.update_transfer_config(
    {
        "transfer_config": transfer_config,
        "update_mask": field_mask_pb2.FieldMask(paths=["service_account_name"]),
        "service_account_name": service_account_name,
    }
)

print("Updated config: '{}'".format(transfer_config.name))