使用服务账号

某些数据源支持通过 Google Cloud 控制台、API 或 bq 命令行使用服务账号进行数据转移身份验证。服务账号是与您的 Google Cloud 项目关联的 Google 账号。服务账号可以通过使用服务账号凭据(而不是用户的凭据)进行身份验证来运行计划查询或批处理流水线等作业。

您可以使用服务账号的凭据更新现有数据转移作业。如需了解详情,请参阅更新数据转移作业凭据

以下情况需要更新凭据:

  • 转移作业未能授权用户访问数据源:

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

  • 尝试运行转移作业时,您收到 INVALID_USER 错误:

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

如需详细了解如何使用服务账号进行身份验证,请参阅身份验证简介

服务账号支持的数据源

BigQuery Data Transfer Service 可以使用服务账号凭据执行以下数据源的转移作业:

准备工作

  • 验证您是否已完成启用 BigQuery Data Transfer Service 所需的所有操作。
  • 授予为用户提供执行本文档中的每个任务所需权限的 Identity and Access Management (IAM) 角色。

所需权限

如需将数据转移作业更新为使用服务账号,您必须具有以下权限:

  • 修改转移作业的 bigquery.transfers.update 权限。

    预定义的 roles/bigquery.admin IAM 角色包含此权限。

  • 服务账号的访问权限。如需详细了解如何为用户授予服务账号角色,请参阅服务账号用户角色

确保您选择的用于运行转移作业的服务账号具有以下权限:

  • 针对目标数据集的 bigquery.datasets.getbigquery.datasets.update 权限。如果表使用列级访问权限控制,则服务账号还必须具有 bigquery.tables.setCategory 权限。

    预定义的 IAM 角色 bigquery.admin 具有所有的这些权限。如需详细了解 BigQuery Data Transfer Service 中的 IAM 角色,请参阅 IAM 简介

  • 已配置的转移作业数据源的访问权限。如需详细了解不同数据源所需的权限,请参阅具有服务账号支持的数据源

更新数据转移作业凭据

控制台

以下过程会将数据转移作业配置更新为以服务账号身份而不是以个人用户账号身份进行身份验证。

  1. 在 Google Cloud 控制台中,转到“数据转移”页面。

    转到“数据传输”

  2. 点击数据转移作业列表中的转移作业。

  3. 点击修改以更新转移作业配置。

    点击“修改”可修改现有数据转移

  4. 服务账号字段中,输入服务账号名称。

  5. 点击保存

bq

如需更新数据转移作业的凭据,您可以使用 bq 命令行工具来更新转移作业配置。

bq update 命令与 --transfer_config--update_credentials--service_account_name 标志结合使用。

例如,以下命令会将数据转移作业配置更新为以服务账号身份而不是以个人用户账号身份进行身份验证:

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

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

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

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

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