使用服務帳戶

部分資料來源會透過 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 資料移轉服務可使用服務帳戶憑證,搭配以下項目進行資料移轉:

事前準備

  • 確認您已完成啟用 BigQuery 資料移轉服務中的所有必要動作。
  • 授予 Identity and Access Management (IAM) 角色,為使用者提供執行本文中各項工作的必要權限。

所需權限

如要更新資料移轉作業以使用服務帳戶,您必須具備下列權限:

  • 修改移轉作業的 bigquery.transfers.update 權限。

    預先定義的 roles/bigquery.admin IAM 角色包含此權限。

  • 服務帳戶存取權。如要進一步瞭解如何授予使用者服務帳戶角色,請參閱「服務帳戶使用者角色」。

請確認您選擇用於執行轉移作業的服務帳戶具備下列權限:

  • 目標資料集的 bigquery.datasets.getbigquery.datasets.update 權限。如果資料表使用欄級存取權控管,服務帳戶也必須具備 bigquery.tables.setCategory 權限。

    bigquery.admin 預先定義的 IAM 角色具備以上所有權限。如要進一步瞭解 BigQuery 資料移轉服務中的身分與存取權管理角色,請參閱「身分與存取權管理簡介」。

  • 存取已設定的轉移資料來源。如要進一步瞭解不同資料來源的必要權限,請參閱「支援服務帳戶的資料來源」。

  • 如要轉移 Google Ads,服務帳戶必須獲得全網域的權限。詳情請參閱 Google Ads API 服務帳戶指南

更新資料移轉憑證

主控台

以下程序會更新資料移轉設定,以服務帳戶 (而非個別使用者帳戶) 進行驗證。

  1. 在 Google Cloud 控制台中,前往「資料移轉」頁面。

    前往「資料移轉」

  2. 按一下資料移轉清單中的移轉項目。

  3. 按一下「編輯」更新移轉設定。

    按一下「編輯」即可編輯現有的資料移轉作業

  4. 在「Service Account」(服務帳戶) 欄位中輸入服務帳戶名稱。

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