使用服務帳戶

部分資料來源支援使用服務帳戶透過 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 資料移轉服務中的 IAM 角色,請參閱 IAM 簡介

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

  • 如要轉移 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 = "[email protected]" 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))