Usa cuentas de servicio

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

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

En las siguientes situaciones, se requiere la actualización de credenciales:

  • Tu transferencia no pudo autorizar el acceso del usuario a la fuente de datos:

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

  • Recibirás un error INVALID_USER cuando intentes 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 Introducción a la autenticación.

Fuentes de datos compatibles con la cuenta de servicio

El Servicio de transferencia de datos de BigQuery puede usar credenciales de cuenta de servicio para las transferencias con los siguientes elementos:

Antes de comenzar

Permisos necesarios

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

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

    El rol predefinido de IAM roles/bigquery.admin incluye este permiso.

  • Acceso a la cuenta de servicio. Si quieres más información para otorgarles a los usuarios el rol de cuenta de servicio, consulta Rol del 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 IAM predefinido de bigquery.admin incluye todos estos permisos. Para obtener más información sobre los roles de IAM en el Servicio de transferencia de datos de BigQuery, consulta Introducción a IAM.

  • Acceso a la fuente de datos de transferencia configurada. Si deseas obtener más información sobre los permisos necesarios para las diferentes fuentes de datos, consulta Fuentes de datos compatibles con la cuenta de servicio.

  • Para 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.

Actualiza las credenciales de transferencia de datos

Console

En el siguiente procedimiento, se actualiza una configuración de transferencia de datos para autenticarla como una cuenta de servicio en lugar de la cuenta de usuario individual.

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

    Ir a Transferencias de datos

  2. Haz clic en la transferencia en la lista de transferencias de datos.

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

    Haz clic en Editar (Edit) para editar uns transferencia de datos existente

  4. En el campo Cuenta de servicio, ingresa 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 de bq a fin de 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 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 instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas 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 instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas 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))