サービス アカウントを使用する

一部のデータソースでは、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.get 権限と bigquery.datasets.update 権限テーブルで列レベルのアクセス制御を使用している場合、サービス アカウントには bigquery.tables.setCategory 権限も必要です。

    これらすべての権限は、IAM の事前定義ロール bigquery.admin に含まれています。BigQuery Data Transfer Service での IAM ロールの詳細については、IAM の概要をご覧ください。

  • 構成された転送データソースへアクセスする。さまざまなデータソースに必要な権限の詳細については、データソースとサービス アカウントのサポートをご覧ください。

  • Google 広告の転送では、サービス アカウントにドメイン全体の権限を付与する必要があります。詳細については、Google Ads API サービス アカウント ガイドをご覧ください。

データ転送の認証情報を更新する

コンソール

次の手順で、個々のユーザー アカウントではなく、サービス アカウントとして認証するようにデータ転送の構成を更新します。

  1. Google Cloud コンソールで、[データ転送] ページに移動します。

    [データ転送] に移動

  2. データ転送リストで、転送をクリックします。

  3. [編集] をクリックして転送構成を更新します。

    [編集] をクリックして既存のデータ転送を編集

  4. [サービス アカウント] フィールドに、サービス アカウント名を入力します。

  5. [保存] をクリックします。

bq

データ転送の認証情報を更新するには、bq コマンドライン ツールを使用して転送構成を更新します。

--transfer_config フラグ、--update_credentials フラグ、--service_account_name フラグを指定して、bq update コマンドを使用します。

たとえば、次のコマンドは、個々のユーザー アカウントではなく、サービス アカウントとして認証するようにデータ転送の構成を更新します。

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