Utiliser des comptes de service

Certaines sources de données sont compatibles avec l'authentification de transfert de données à l'aide d'un compte de service via la console Google Cloud, l'API ou la ligne de commande bq. Un compte de service est un compte Google associé à votre projet Google Cloud. Un compte de service peut exécuter des jobs, tels que des requêtes programmées ou des pipelines de traitement par lots, en s'authentifiant avec les identifiants du compte de service plutôt que ceux d'un utilisateur.

Vous pouvez mettre à jour un transfert de données existant avec les identifiants d'un compte de service. Pour en savoir plus, consultez la section Mettre à jour les identifiants de transfert de données.

Les situations suivantes nécessitent la mise à jour des identifiants :

  • Votre transfert n'a pas autorisé l'utilisateur à accéder à la source de données :

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

  • Vous recevez une erreur INVALID_USER lorsque vous tentez d'exécuter le transfert :

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

Pour en savoir plus sur l'authentification avec des comptes de service, consultez la section Présentation de l'authentification.

Sources de données compatibles avec les comptes de service

Le service de transfert de données BigQuery peut utiliser les identifiants du compte de service pour les transferts avec :

Avant de commencer

  • Vérifiez que vous avez effectué toutes les actions requises sur la page Activer le service de transfert de données BigQuery.
  • Attribuez aux utilisateurs des rôles IAM (Identity and Access Management) incluant les autorisations nécessaires pour effectuer l'ensemble des tâches du présent document.

Autorisations requises

Pour mettre à jour un transfert de données afin d'utiliser un compte de service, vous devez disposer des autorisations suivantes :

  • L'autorisation bigquery.transfers.update pour modifier le transfert.

    Le rôle Cloud IAM prédéfini roles/bigquery.admin inclut cette autorisation.

  • Accès au compte de service. Pour plus d'informations sur l'attribution du rôle de compte de service aux utilisateurs, consultez la section Rôle Utilisateur du compte de service.

Assurez-vous que le compte de service que vous choisissez pour exécuter le transfert dispose des autorisations suivantes :

  • Autorisations bigquery.datasets.get et bigquery.datasets.update sur l'ensemble de données cible Si la table utilise le contrôle des accès au niveau des colonnes, le compte de service doit également disposer de l'autorisation bigquery.tables.setCategory.

    Le rôle IAM prédéfini bigquery.admin inclut toutes ces autorisations. Pour en savoir plus sur les rôles IAM dans le service de transfert de données BigQuery, consultez la page Présentation d'IAM.

  • Accès à la source de données de transfert configurée. Pour en savoir plus sur les autorisations requises pour différentes sources de données, consultez la page Sources de données compatibles avec les comptes de service.

Mettre à jour les identifiants de transfert de données

Console

La procédure suivante met à jour la configuration de transfert de données pour s'authentifier en tant que compte de service au lieu de votre compte utilisateur individuel.

  1. Dans la console Google Cloud, accédez à la page Transferts de données.

    Accéder à la page Transferts de données

  2. Cliquez sur le transfert dans la liste des transferts de données.

  3. Cliquez sur MODIFIER pour mettre à jour la configuration de transfert.

    Cliquez sur "Modifier" pour modifier un transfert de données existant.

  4. Dans le champ Compte de service, saisissez le nom du compte de service.

  5. Cliquez sur Enregistrer.

bq

Pour mettre à jour les identifiants d'un transfert de données, vous pouvez utiliser l'outil de ligne de commande bq afin de mettre à jour la configuration de transfert.

Exécutez la commande bq update avec les options --transfer_config, --update_credentials et --service_account_name.

Par exemple, la commande suivante met à jour la configuration de transfert de données pour s'authentifier en tant que compte de service au lieu de votre compte utilisateur individuel :

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

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

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

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Python.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

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))