Usar contas de serviço com o serviço de transferência de dados do BigQuery

O serviço de transferência de dados do BigQuery permite autenticar transferências de dados para fontes de dados compatíveis usando uma conta de serviço em vez de credenciais de usuário individuais. Uma conta de serviço é uma Conta do Google associada ao seu projeto do Google Cloud que pode executar jobs, como consultas programadas ou pipelines de processamento em lote. É possível configurar a autenticação da conta de serviço pelo console do Google Cloud , pela API ou pela linha de comando bq, além de atualizar as transferências atuais quando as credenciais mudarem.

Os códigos de erro a seguir indicam situações em que é necessário atualizar as credenciais:

  • A transferência não autorizou o acesso do usuário à fonte de dados:

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

  • Você recebe o erro INVALID_USER ao tentar executar a transferência:

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

Para saber mais sobre a autenticação com contas de serviço, consulte Introdução à autenticação.

Origens de dados compatíveis com a conta de serviço

O serviço de transferência de dados do BigQuery pode usar credenciais da conta de serviço para transferências com o seguinte:

Antes de começar

Permissões necessárias

Para atualizar uma transferência de dados para usar uma conta de serviço, é necessário ter as seguintes permissões:

  • A permissão bigquery.transfers.update para modificar a transferência.

    O papel predefinido do IAM roles/bigquery.admin inclui essa permissão.

  • Acesso à conta de serviço. Para mais informações sobre como conceder o papel da conta de serviço aos usuários, consulte Papel do usuário da conta de serviço.

Verifique se a conta de serviço que você escolheu para executar a transferência tem as seguintes permissões:

  • Permissões bigquery.datasets.get e bigquery.datasets.update no conjunto de dados de destino Se a tabela usar o controle de acesso no nível da coluna, a conta de serviço também precisará ter a permissão bigquery.tables.setCategory.

    O papel predefinido do Cloud IAM bigquery.admin inclui todas essas permissões. Para mais informações sobre os papéis do IAM no serviço de transferência de dados do BigQuery, consulte Introdução ao IAM.

  • Acesso à origem de dados da transferência configurada. Para mais informações sobre as permissões necessárias para diferentes fontes de dados, consulte Fontes de dados compatíveis com a conta de serviço.

  • Para transferências do Google Ads, a conta de serviço precisa receber autoridade em todo o domínio. Para mais informações, consulte o Guia da conta de serviço da API Google Ads.

Atualizar as credenciais de transferência de dados

É possível atualizar uma transferência de dados atual com as credenciais de uma conta de serviço. As seguintes situações exigem a atualização das credenciais:

  • A transferência não autorizou o acesso do usuário à fonte de dados:

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

  • Você recebe o erro INVALID_USER ao tentar executar a transferência:

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

Console

O procedimento a seguir atualiza uma configuração de transferência de dados para autenticar como uma conta de serviço em vez de sua conta de usuário individual.

  1. No console do Google Cloud , acesse a página "Transferências de dados".

    Acesse Transferências de dados

  2. Clique na transferência na lista correspondente.

  3. Clique em Editar para atualizar a configuração de transferência.

    Clique em "Editar" para modificar uma transferência de dados

  4. No campo Conta de serviço, digite o nome da conta de serviço.

  5. Clique em Salvar.

bq

Para atualizar as credenciais de uma transferência de dados, use a ferramenta de linha de comando bq para atualizar a configuração de transferência.

Use o comando bq update--transfer_config--update_credentials com as sinalizações --service_account_name e .

Por exemplo, o comando a seguir atualiza uma configuração de transferência de dados para autenticar como uma conta de serviço em vez de sua conta de usuário 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 testar esta amostra, siga as instruções de configuração do Java no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Java.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, acesse Configurar a autenticação 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 testar esta amostra, siga as instruções de configuração do Python no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Python.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, acesse Configurar a autenticação 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))