Skip to content

Google Bigquery Export Integration V2

Google BigQuery Connector V2は、Google BigQueryへの大量データアップロードプロセスを効率化するように設計されています。以下の主要機能を提供します:

  • Big Queryにアップロードされる大量データを処理するためのParquetファイルへの効率的なデータセットのパッケージング
  • BigQueryロードジョブを使用した最適化されたデータアップロード
  • Truncate同期モードのサポートを追加した柔軟なデータ同期操作

前提条件

  • TD Toolbeltを含むTreasure AIの基本知識
  • Google Cloud Platformアカウント

要件と制限事項

  • ARRAYのようなネストされたデータ型または繰り返しデータ型は、宛先列としてサポートされていません。

サポートされる機能

このコネクターは「append、replace、replace backup、truncate」モードをサポートしています。

認証方法の選択

コネクターは、auth_methodパラメーターで選択される2つの方法のいずれかを使用してGoogle BigQueryに認証します:

  • Service Account JSONキー(json_key、デフォルト) — Google Cloudからダウンロードする長期間有効なJSON認証情報です。設定は簡単ですが、キーは保存・ローテーション・保護が必要な静的なシークレットです。
  • Workload Identity Federation(wif — キーレス認証です。Treasure AIのワークロード(AWS上で実行)が自身のAWS IDを短命なGoogleアクセストークンと交換するため、保存または漏洩する長期間有効なキーがありません。Googleはセキュリティとコンプライアンスの観点からサービスアカウントキーよりもWIFを推奨しており、ダウンロード可能なサービスアカウントキーを禁止している組織に適した選択肢です。

最も簡単な設定にはjson_keyを使用します。セキュリティポリシーで静的な認証情報が許可されていない場合はwifを使用します。既存のjson_key設定は変更なくそのまま動作します。

必要なBigQuery権限

認証方法にかかわらず、コネクターが認証するID(json_keyの場合はサービスアカウント、wifの場合はフェデレーションプリンシパルまたはなりすまし対象のサービスアカウント)には、以下の両方のロールが必要です。エクスポートジョブはテーブルデータの書き込みとロードジョブの実行の両方を行うため、片方のロールだけでは不十分です:

  • 対象データセットに対するBigQuery Data Editorroles/bigquery.dataEditor) — テーブルの作成と書き込みを行うため。これはコネクターが起動時に検証するデータセットメタデータの読み取りもカバーします。
  • プロジェクトに対するBigQuery Job Userroles/bigquery.jobUser) — BigQueryロードジョブを実行するため。これはプロジェクトレベルで付与する必要があります。データセットレベルの付与にはbigquery.jobs.createが含まれません。

Google Cloud Consoleでこれらを付与するには:

  1. BigQuery Data Editorの場合:BigQueryを開き、対象のデータセットを選択し、Sharing > Permissions > Add principalを選択して、IDを入力し、BigQuery Data Editorを割り当てます。
  2. BigQuery Job Userの場合:IAM & Admin > IAMを開き(対象プロジェクトを選択した状態で)、Grant accessを選択し、同じIDを入力して、BigQuery Job Userを割り当てます。

いずれかのロールが欠けていると実行時エラーが発生します。具体的なメッセージについてはトラブルシューティングを参照してください。

Google Cloud Platform認証情報の取得

Service Account JSONキー方式を使用するには、以下が必要です:

  • Project ID
  • JSON Credential

JSON Credentialの取得

Google BigQueryとの統合は、サーバー間API認証に基づいています。

  1. Google Developer Consoleに移動します。
  2. APIs & auth > Credentialsを選択します。
  3. Service accountを選択します。

4. GoogleがJSON形式のキータイプを推奨しており、これを選択します。キーはブラウザによって自動的にダウンロードされます。

Project IDの取得

  1. Google Developer Consoleに移動します。
  2. Homeを選択します。
  3. Project IDを確認します。

Workload Identity Federation(WIF)の設定

Workload Identity Federation認証方式を使用する場合は、サービスアカウントキーをダウンロードする代わりに、このGCP側の設定を行います。これにより、コネクターのadc_keyfileフィールドに貼り付けるApplication Default Credentials(ADC)キーファイルが生成されます。

Treasure AIのエクスポートワークロードはAWS上で実行されます。WIFはそのAWS IDをGoogleが直接信頼できるようにするため、長期間有効なキーは交換されません。この設定では、Workload Identity Poolを通じてTreasure AIのAWSアカウントにBigQueryリソースへのアクセスを付与します。Treasure AIのAWSアカウントIDはコネクターの認証フォーム(読み取り専用のTD's AWS Account IDフィールド)に表示されます。以下でサンプルとして123456789012が使用されている箇所には、その実際の値を使用してください。

前提条件

Google Cloudプロジェクトで以下のAPIを有効にします:IAMResource ManagerService Account CredentialsSecurity Token Service

Workload Identity PoolとAWSプロバイダーの作成

  1. Google Cloud ConsoleでIAM & Admin > Workload Identity Federationに移動します。新しいプールを作成します(または既存のプールを選択します)。
  2. Treasure AIのAWSアカウントID(コネクターの認証フォームに表示されます。ここではサンプルとして123456789012を使用)を使用して、タイプAWSのプロバイダーを追加します。

BigQueryリソースへのアクセス付与

2つの付与モードのいずれかを選択します。どちらもコネクターでサポートされており、違いはダウンロードするexternal_account JSONのみです。

  • 直接フェデレーションID — BigQueryロールをプールのプリンシパルに直接付与します。コネクターはフェデレーションID自体として認証します。
  • サービスアカウントのなりすまし(impersonation) — (BigQueryロールを持つ)既存のサービスアカウントになりすます権限をプールに付与します。ダウンロードされる設定にはservice_account_impersonation_urlフィールドが含まれます。これには対象のサービスアカウントに対するroles/iam.serviceAccountTokenCreatorロールが必要です。

いずれのモードを選択する場合でも、認証するIDに必要なBigQuery権限で説明されているBigQuery Data EditorおよびBigQuery Job Userロールを付与します。直接フェデレーションIDの場合、プリンシパルはprincipalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*の形式になります。なりすましの場合は、なりすまし対象のサービスアカウントにロールを付与します。

ADCキーファイルのダウンロード

Workload Identity Poolから、AWSプロバイダー(Treasure AIのAWSアカウント)のDownload configを選択し、生成されたexternal_account JSONを保存します。これがadc_keyfileとして指定する値です。期待される構造については、以下の実例 WIF adc_keyfileを参照してください。

BigQueryでのDatasetとTableの作成

BigQueryコンソールからDatasetとTableを作成します。

Treasure コンソールからの使用

  1. Treasure コンソールに移動します。
  2. Integrations Hub > Catalogに移動します。
  3. Google Big Query V2を選択します。

4. 次のようにすべての情報を入力します:

エクスポート用のクエリ結果の設定

Treasure コンソールは、データをエクスポートする複数の方法をサポートしています。Data Workbenchからデータをエクスポートするには、次の手順に従います。

  1. Data Workbench > Queriesに移動します。
  2. New Queryを選択し、クエリを定義します。
  3. Export Resultsを選択して、データのエクスポートを設定します。
  4. 既存のSnapchat CAPI認証を選択するか、前述の手順で新しい認証を作成します
  5. Doneを選択します。

コネクター設定パラメーター

フィールド説明
Data Sync Modeデータが宛先テーブルにどのように書き込まれるかを決定します。利用可能なオプション: Append Mode: クエリ結果の新しいデータを既存のテーブルに追加し、既存のレコードを変更しません。 Replace Mode: 既存の宛先テーブルを完全に削除し、クエリ結果のスキーマとデータを使用して新しいテーブルを作成します。 Truncate Mode: 既存のテーブル構造を保持しながらすべてのデータを削除し、クエリ結果から新しいデータを挿入します。既存のテーブルスキーマが維持され、クエリ結果またはJSON Schema Fileからのスキーマ定義は無視されます。 Replace_Backup: バックアップ方法を通じて既存のデータを安全に保持しながら宛先テーブルを置き換えます。このモードを選択すると、バックアップ方法を選択するための追加フィールド「Table Backup Operation Type」が表示されます。
Table Backup Operation Type(Replace_Backupモードを選択した場合のみ表示)置き換え前に既存のテーブルをバックアップする方法を指定します。2つのオプションがあります: Existing Table Rename: タイムスタンププレフィックス(例:backup_{timestamp}_)を付けて既存のテーブルの名前を変更することで、編集可能なバックアップを作成します。その後、クエリ結果のスキーマを使用して元の名前で新しいテーブルが作成され、クエリ結果からデータがロードされます。 Existing Table Snapshot: BigQueryのスナップショット機能を使用して、既存のテーブルの読み取り専用のポイントインタイムコピーを作成します。スナップショットの作成後、既存のテーブルが削除され、クエリ結果のスキーマとデータを使用して新しいテーブルが作成されます。この方法はストレージ効率が高いですが、バックアップは読み取り専用です。
Google Cloud Project IDBigQueryデータセットが存在するGoogle CloudプロジェクトのユニークID。これはGoogle Developer Consoleページの上部で確認できます。
Dataset Nameデータを保存するBigQueryデータセットの名前。これはGoogle Cloudプロジェクト内のテーブルのコレクションです。
Data LocationBigQueryデータが保存される地理的な場所を指定します。データレジデンシー要件にとって重要です。データをUSまたはEUマルチリージョン以外に保存する必要がある場合は、場所を明示的に指定する必要があります。
Table Nameデータが書き込まれる、選択したデータセット内の特定のテーブルの名前。
Auto-create table?チェックすると、宛先テーブルが存在しない場合にシステムが自動的に作成します。このオプションはTruncate同期モードでは無視されます。
Add missing columns?有効にすると、宛先テーブルに存在しないソースデータの列が追加されます。無効にすると、これらの列は無視されます。
Json Schema FileJSON形式を使用してデータの構造を定義し、列名、データ型、制約を指定します。各列定義には名前と型フィールドが必要です。例では、REQUIREDとしてマークされたINTEGER型の「id」フィールドと、STRING型の「comment」フィールドを持つスキーマを示しています。
Skip on invalid records?有効にすると、検証に失敗したレコードに遭遇してもジョブは処理を続行し、無効なレコードをスキップします。無効にすると、無効なレコードに遭遇した場合にジョブは完全に停止します。

クエリ結果データ仕様

BigQueryテーブルスキーマの調整と検証

コネクターは、複数のソースからのスキーマを調和させて最終的なテーブル構造またはスキーマを決定する、スキーマ調整または統合プロセスを実装します。このプロセスは、設定された同期モードとユーザー設定に基づいてスキーマ進化シナリオをサポートしながら、データの整合性を保証します。

スキーマソースと優先順位階層

コネクターは、階層順に3つの潜在的なスキーマソースを評価することで、最終的なテーブルスキーマを決定します。この階層は、データスキーマが宛先BigQueryテーブルでどのように具現化されるかを理解するために重要です。

  1. 宛先テーブルスキーマ(最高優先順位)

宛先テーブルが存在する場合、そのスキーマはデータロード操作の主要な権限として機能します。

適用される場合:

  • 既存のテーブルへのAPPEND操作中
  • TRUNCATE操作中

実例:数値型の処理

  • クエリ結果データ
user_idtransaction_amounttransaction_date
100199.992024-01-15
1002150.502024-01-16

宛先テーブルスキーマ

  • user_id: INT64
  • transaction_amount: NUMERIC(38,9)
  • transaction_date: DATE

結果: クエリ結果データがtransaction_amountに対してFLOAT64として提供される場合でも、宛先スキーマに従ってNUMERICに変換されます。

  1. ユーザー定義のJSONスキーマ(第2優先順位)

JSON Schema File設定を通じて提供される場合、このスキーマはクエリ結果からの型推論を上書きし、明示的な列定義を提供します。

適用される場合:

  • テーブル作成中(新しいテーブル)
  • 既存のテーブルに新しい列を追加する場合
  • 明示的な型キャストと列プロパティ定義の場合​

実例:タイムスタンプと日付の変換

  • ソースデータ
event_timeregistration_date
2024-01-15 14:30:002024-01-15 14:30:00+02:00
2024-01-16 09:15:002024-01-16 09:15:00+08:00
  • ユーザー定義スキーマ

  • event_time: TIMESTAMP

  • registration_date: DATE

  • 効果

event_time:

  • ソースデータはTIMESTAMPとして解析されます
  • マイクロ秒の精度を維持します
  • UTCで保存されます
  1. クエリ結果スキーマ(最低優先順位)

ソースデータ構造から派生したスキーマ。他のスキーマが指定されていない場合のベースラインスキーマとして機能します。

適用される場合:

  • JSONスキーマ定義なしで新しいテーブルを作成する場合
  • 明示的な型定義なしで新しい列を追加する場合
  • オーバーライドが存在しない場合の型推論のソースとして

実例:整数から文字列への変換

  • クエリ結果データ
product_idstatus_code
"SKU-001"200
"SKU-002"404
  • クエリ結果スキーマ

  • product_id: STRING

  • status_code: Int

  • 可能な変換先

  1. status_code as STRING:
  • INT64 → STRING(互換性のある変換)
  • 結果: "200", "404"
  1. status_code as INT64:
  • 元の型を維持
  • 結果: 200, 404

スキーマ処理シナリオマトリックス

以下は、同期モード、テーブルの状態、設定によってスキーマがどのように処理されるかを示す構造化された参照表です。

Sync ModeDestination TableAdd Missing ColumnsColumn TypeSchema Handling Logics
AppendExistsEnabled宛先テーブルの元の列宛先テーブルスキーマを使用
クエリ結果データからの新しい列クエリ結果 + ユーザー定義スキーマを使用
Disabled宛先テーブルの元の列宛先テーブルスキーマを使用
クエリ結果データからの新しい列これらの列を無視
Create NewN/Aすべての列クエリ結果 + ユーザー定義スキーマを使用
Replace/Replace_BackupExistsN/Aすべての列クエリ結果 + ユーザー定義スキーマを使用
Create NewN/Aすべての列クエリ結果 + ユーザー定義スキーマを使用
TruncateExistsEnabled宛先テーブルの元の列宛先テーブルスキーマを使用
クエリ結果データからの新しい列クエリ結果 + ユーザー定義スキーマを使用
Disabled宛先テーブルの元の列宛先テーブルスキーマを使用
クエリ結果データからの新しい列これらの列を無視
Create NewN/Aすべての列エラー: テーブルが存在する必要があります

データ型マッピング

コネクターは、ソースデータ型とBigQueryネイティブ型の間の包括的な型システムマッピングを実装しており、3つのカテゴリーの変換があります:

  1. デフォルトマッピング(ロスレス変換)
Query Result TypeBigQuery Type実装の詳細
int32/int64INT64ネイティブBigQuery整数、64ビット符号付き
doubleFLOAT64IEEE 754倍精度浮動小数点
booleanBOOL1ビットブール値
timestampTIMESTAMPマイクロ秒の精度、UTCタイムゾーン
stringSTRINGUTF-8エンコードされた文字シーケンス
  1. 互換性のあるマッピング(型強制)
Query Result TypeBigQuery Type技術実装
int64NUMERIC精度: 38桁、スケール: 9桁の小数点以下
int64BIGNUMERIC精度: 76.76桁、スケール: 38桁の小数点以下
doubleSTRING完全な精度でtoString()を使用してフォーマット
booleanSTRINGリテラル「true」/「false」表現
timestampSTRINGタイムゾーン付きISO 8601形式
  1. 潜在的にロスのあるマッピング(検証が必要)
Query Result TypeBigQuery Typeデータ損失の考慮事項
timestampDATE時刻コンポーネントを切り捨て、タイムゾーン情報が失われる
stringDATE'YYYY-MM-DD'と一致する必要があり、無効な形式はNULLになる
FLOAT64INT64小数点の切り捨て、精度が失われる可能性
TIMESTAMPDATE時間の粒度が失われ、タイムゾーンの正規化が行われる

(オプション) Query Export ジョブをスケジュールする

Scheduled Jobs と Result Export を使用して、指定したターゲット宛先に出力結果を定期的に書き込むことができます。

Treasure Data のスケジューラー機能は、高可用性を実現するために定期的なクエリ実行をサポートしています。

2 つの仕様が競合するスケジュール仕様を提供する場合、より頻繁に実行するよう要求する仕様が優先され、もう一方のスケジュール仕様は無視されます。

例えば、cron スケジュールが '0 0 1 * 1' の場合、「月の日」の仕様と「週の曜日」が矛盾します。前者の仕様は毎月 1 日の午前 0 時 (00:00) に実行することを要求し、後者の仕様は毎週月曜日の午前 0 時 (00:00) に実行することを要求するためです。後者の仕様が優先されます。

Treasure コンソール を使用してジョブをスケジュールする

  1. Data Workbench > Queries に移動します

  2. 新しいクエリを作成するか、既存のクエリを選択します。

  3. Schedule の横にある None を選択します。

  4. ドロップダウンで、次のスケジュールオプションのいずれかを選択します:

    ドロップダウン値説明
    Custom cron...Custom cron... の詳細を参照してください。
    @daily (midnight)指定されたタイムゾーンで 1 日 1 回午前 0 時 (00:00 am) に実行します。
    @hourly (:00)毎時 00 分に実行します。
    Noneスケジュールなし。

Custom cron... の詳細

Cron 値説明
0 * * * *1 時間に 1 回実行します。
0 0 * * *1 日 1 回午前 0 時に実行します。
0 0 1 * *毎月 1 日の午前 0 時に 1 回実行します。
""スケジュールされた実行時刻のないジョブを作成します。
 *    *    *    *    *
 -    -    -    -    -
 |    |    |    |    |
 |    |    |    |    +----- day of week (0 - 6) (Sunday=0)
 |    |    |    +---------- month (1 - 12)
 |    |    +--------------- day of month (1 - 31)
 |    +-------------------- hour (0 - 23)
 +------------------------- min (0 - 59)

次の名前付きエントリを使用できます:

  • Day of Week: sun, mon, tue, wed, thu, fri, sat.
  • Month: jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec.

各フィールド間には単一のスペースが必要です。各フィールドの値は、次のもので構成できます:

フィールド値 例の説明
各フィールドに対して上記で表示された制限内の単一の値。
フィールドに基づく制限がないことを示すワイルドカード '*''0 0 1 * *'毎月 1 日の午前 0 時 (00:00) に実行するようにスケジュールを設定します。
範囲 '2-5' フィールドの許可される値の範囲を示します。'0 0 1-10 * *'毎月 1 日から 10 日までの午前 0 時 (00:00) に実行するようにスケジュールを設定します。
カンマ区切りの値のリスト '2,3,4,5' フィールドの許可される値のリストを示します。0 0 1,11,21 * *'毎月 1 日、11 日、21 日の午前 0 時 (00:00) に実行するようにスケジュールを設定します。
周期性インジケータ '*/5' フィールドの有効な値の範囲に基づいて、 スケジュールが実行を許可される頻度を表現します。'30 */2 1 * *'毎月 1 日、00:30 から 2 時間ごとに実行するようにスケジュールを設定します。 '0 0 */5 * *' は、毎月 5 日から 5 日ごとに午前 0 時 (00:00) に実行するようにスケジュールを設定します。
'*' ワイルドカードを除く上記の いずれかのカンマ区切りリストもサポートされています '2,*/5,8-10''0 0 5,*/10,25 * *'毎月 5 日、10 日、20 日、25 日の午前 0 時 (00:00) に実行するようにスケジュールを設定します。
  1. (オプション) Delay execution を有効にすることで、クエリの開始時刻を遅延させることができます。

クエリを実行する

クエリに名前を付けて保存して実行するか、単にクエリを実行します。クエリが正常に完了すると、クエリ結果は指定された宛先に自動的にエクスポートされます。

設定エラーにより継続的に失敗するスケジュールジョブは、複数回通知された後、システム側で無効化される場合があります。

(オプション) Delay execution を有効にすることで、クエリの開始時刻を遅延させることができます。

Audience Studio で Segment をアクティベートする

Audience Studio で activation を作成することで、segment データをターゲットプラットフォームに送信することもできます。

  1. Audience Studio に移動します。
  2. parent segment を選択します。
  3. ターゲット segment を開き、右クリックして、Create Activation を選択します。
  4. Details パネルで、Activation 名を入力し、前述の Configuration Parameters のセクションに従って activation を設定します。
  5. Output Mapping パネルで activation 出力をカスタマイズします。

  • Attribute Columns
    • Export All Columns を選択すると、変更を加えずにすべての列をエクスポートできます。
    • + Add Columns を選択して、エクスポート用の特定の列を追加します。Output Column Name には、Source 列名と同じ名前があらかじめ入力されます。Output Column Name を更新できます。+ Add Columns を選択し続けて、activation 出力用の新しい列を追加します。
  • String Builder
    • + Add string を選択して、エクスポート用の文字列を作成します。次の値から選択します:
      • String: 任意の値を選択します。テキストを使用してカスタム値を作成します。
      • Timestamp: エクスポートの日時。
      • Segment Id: segment ID 番号。
      • Segment Name: segment 名。
      • Audience Id: parent segment 番号。
  1. Schedule を設定します。

  • スケジュールを定義する値を選択し、オプションでメール通知を含めます。
  1. Create を選択します。

batch journey の activation を作成する必要がある場合は、Creating a Batch Journey Activation を参照してください。

(オプション)CLIを使用したエクスポート統合

CLI(Toolbelt)を使用してBigQueryに結果をエクスポートすることもできます。

td queryコマンドの*--resultオプションを使用して、Snapchatサーバーへのエクスポート情報を指定する必要があります。td query*コマンドの詳細については、この記事を参照してください。

オプションの形式はJSONで、一般的な構造は次のとおりです。

APPENDモード:

type: 'bigquery_v2'
json_keyfile: |
  {
    "type": "service_account",
    "private_key_id": "xxx",
    "private_key": "-----BEGIN PRIVATE KEY-----xxx-----END PRIVATE KEY-----\n",
    "client_email": "account@xxx.iam.gserviceaccount.com",
    "client_id": "xxx",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/account%40xxx.iam.gserviceaccount.com"
  }
mode: APPEND
project: gcp project id
dataset: bigquery dataset
table: bigquery table
location: gcp location
auto_create_table: true
add_missing_columns: true
schema_file: |
  [
    {"name": "c1", "type": "STRING", "mode": "NULLABLE"},
    {"name": "c2", "type": "INTEGER", "mode": "REQUIRED"}
  ]
skip_invalid_records: true

REPLACEモード:

  type: 'bigquery_v2'
  json_keyfile: |
    {
      "type": "service_account",
      "private_key_id": "xxx",
      "private_key": "-----BEGIN PRIVATE KEY-----xxx-----END PRIVATE KEY-----\n",
      "client_email": "account@xxx.iam.gserviceaccount.com",
      "client_id": "xxx",
      "auth_uri": "https://accounts.google.com/o/oauth2/auth",
      "token_uri": "https://accounts.google.com/o/oauth2/token",
      "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
      "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/account%40xxx.iam.gserviceaccount.com"
    }
  mode: REPLACE
  project: gcp project id
  dataset: bigquery dataset
  table: bigquery table
  location: gcp location
  auto_create_table: true
  add_missing_columns: true
  schema_file: |
    [
      {"name": "c1", "type": "STRING", "mode": "NULLABLE"},
      {"name": "c2", "type": "INTEGER", "mode": "REQUIRED"}
    ]
  skip_invalid_records: true

REPLACE_BACKUPモード:

  type: 'bigquery_v2'
  json_keyfile: |
    {
      "type": "service_account",
      "private_key_id": "xxx",
      "private_key": "-----BEGIN PRIVATE KEY-----xxx-----END PRIVATE KEY-----\n",
      "client_email": "account@xxx.iam.gserviceaccount.com",
      "client_id": "xxx",
      "auth_uri": "https://accounts.google.com/o/oauth2/auth",
      "token_uri": "https://accounts.google.com/o/oauth2/token",
      "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
      "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/account%40xxx.iam.gserviceaccount.com"
    }
  mode: REPLACE_BACKUP
  backup_mode: TABLE_RENAME
  project: gcp project id
  dataset: bigquery dataset
  table: bigquery table
  location: gcp location
  auto_create_table: true
  add_missing_columns: true
  schema_file: |
    [
      {"name": "c1", "type": "STRING", "mode": "NULLABLE"},
      {"name": "c2", "type": "INTEGER", "mode": "REQUIRED"}
    ]
  skip_invalid_records: true

TRUNCATEモード:

  type: 'bigquery_v2'
  json_keyfile: |
    {
      "type": "service_account",
      "private_key_id": "xxx",
      "private_key": "-----BEGIN PRIVATE KEY-----xxx-----END PRIVATE KEY-----\n",
      "client_email": "account@xxx.iam.gserviceaccount.com",
      "client_id": "xxx",
      "auth_uri": "https://accounts.google.com/o/oauth2/auth",
      "token_uri": "https://accounts.google.com/o/oauth2/token",
      "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
      "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/account%40xxx.iam.gserviceaccount.com"
    }
  mode: TRUNCATE
  project: gcp project id
  dataset: bigquery dataset
  table: bigquery table
  location: gcp location
  auto_create_table: true
  add_missing_columns: true
  schema_file: |
    [
      {"name": "c1", "type": "STRING", "mode": "NULLABLE"},
      {"name": "c2", "type": "INTEGER", "mode": "REQUIRED"}
    ]
  skip_invalid_records: true

実例 WIF adc_keyfile

Workload Identity Federationを使用する場合は、auth_methodwifに設定し、json_keyfileの代わりにexternal_account JSONをadc_keyfileとして指定します。コネクターはEC2インスタンスメタデータサービス(IMDSv2)からAWS IDを読み取るため、Workload Identity Poolが信頼するIAMロールを持つTreasure AIのAWSベースのエクスポートワークロード上で実行する必要があります。

プールからダウンロードされるexternal_account JSONは、次の構造になっています(直接フェデレーションID):

{
  "universe_domain": "googleapis.com",
  "type": "external_account",
  "audience": "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID",
  "subject_token_type": "urn:ietf:params:aws:token-type:aws4_request",
  "token_url": "https://sts.googleapis.com/v1/token",
  "credential_source": {
    "environment_id": "aws1",
    "region_url": "http://169.254.169.254/latest/meta-data/placement/availability-zone",
    "url": "http://169.254.169.254/latest/meta-data/iam/security-credentials",
    "regional_cred_verification_url": "https://sts.{region}.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15"
  }
}

audienceはWorkload Identity Providerの完全なリソース名である必要があり、PROJECT_NUMBERは数値のプロジェクトID(プロジェクトID文字列ではありません)です。サービスアカウントのなりすましの場合、ダウンロードされるJSONには追加でservice_account_impersonation_urlフィールドが含まれます(例:https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com:generateAccessToken)。

WIFを使用したコネクター設定の例(APPENDモード):

type: 'bigquery_v2'
auth_method: wif
adc_keyfile: |
  {
    "universe_domain": "googleapis.com",
    "type": "external_account",
    "audience": "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID",
    "subject_token_type": "urn:ietf:params:aws:token-type:aws4_request",
    "token_url": "https://sts.googleapis.com/v1/token",
    "credential_source": {
      "environment_id": "aws1",
      "region_url": "http://169.254.169.254/latest/meta-data/placement/availability-zone",
      "url": "http://169.254.169.254/latest/meta-data/iam/security-credentials",
      "regional_cred_verification_url": "https://sts.{region}.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15"
    }
  }
mode: APPEND
project: gcp project id
dataset: bigquery dataset
table: bigquery table
location: gcp location
auto_create_table: true
add_missing_columns: true
skip_invalid_records: true

Workload Identity Federationのトラブルシューティング

エラー原因と解決方法
Invalid value for "audience"adc_keyfileaudienceがプロバイダーの完全なリソース名になっていません。//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_IDを使用し、PROJECT_NUMBERがプロジェクトID文字列ではなく数値IDであることを確認してください。
Permission bigquery.datasets.get denied認証するIDにデータセットへのアクセス権がありません。データセットにBigQuery Data Editorを付与してください。
does not have bigquery.jobs.create permissionIDがロードジョブを実行できません。プロジェクトBigQuery Job Userを付与してください(データセットレベルの付与ではカバーされません)。
トークン交換中のSTS 4xx/5xxエラーAWS→GCPのトークン交換が失敗しました。プールのAWSプロバイダーがTreasure AIのAWSアカウント(コネクターの認証フォームに表示)を信頼していること、および属性マッピング(google.subjectassertion.arn)が正しいことを確認してください。
長時間実行ジョブが1時間でタイムアウトするなりすましトークンの有効期間はデフォルトで1時間に制限されています。最大12時間まで許可するには、プロジェクトでconstraints/iam.allowServiceAccountCredentialLifetimeExtension組織ポリシーを有効にしてください。

パラメーター

NameDescriptionValueDefault ValueRequired
typeコネクタータイプbigquery_v2N/AYes
auth_method認証方法サポートされる値: - json_key - wifjson_keyNo
json_keyfileGCPサービスアカウントJSON keyfileJSON形式N/Aauth_methodがjson_keyの場合はYes
adc_keyfileWorkload Identity Federationのexternal_account JSON keyfileJSON形式N/Aauth_methodがwifの場合はYes
modeエクスポートモードサポートされるモード: - APPEND - REPLACE - REPLACE_BACKUP - TRUNCATEAPPENDYes
backup_modeBigQueryでのテーブルのバックアップサポートされる値: - TABLE_RENAME - TABLE_SNAPSHOTTABLE_RENAMEmodeがREPLACE_BACKUPの場合はYes
projectGCPプロジェクトID​N/AN/AYes
datasetBigQueryデータセットN/AN/AYes
tableBigQueryテーブルN/AN/AYes
locationBigQueryデータの場所N/AN/ANo
auto_create_tableテーブルが存在しない場合にBigQueryで自動作成を許可します。このオプションはTRUNCATEモードではサポートされませんtrue/falsefalseNo
add_missing_columnsBigQueryテーブルに存在しない追加の列を許可します。true/falsefalseNo
skip_invalid_records無効なレコードを処理するときにジョブを継続または停止するフラグ。true/falsetrueNo

使用例

APPENDモード

$ td query --result '{"type": "bigquery_v2", "td_authentication_id": 123456, "mode": "APPEND", "project": "gcp_project_id", "dataset": "bg_dataset", "table": "bg_table", "location": "US", "auto_create_table": true, "add_missing_columns": true, "schema_file": "[{\"name\": \"c1\", \"type\": \"INTEGER\"}, {\"name\": \"c2\", \"type\": \"STRING\"}]", "skip_invalid_records":true}' -d sample_datasets "select ........ from ........" -T presto

REPLACEモード

$ td query --result '{"type": "bigquery_v2", "td_authentication_id": 123456, "mode": "REPLACE", "project": "gcp_project_id", "dataset": "bg_dataset", "table": "bg_table", "location": "US", "auto_create_table": true, "add_missing_columns": true, "schema_file": "[{\"name\": \"c1\", \"type\": \"INTEGER\"}, {\"name\": \"c2\", \"type\": \"STRING\"}]", "skip_invalid_records":true}' -d sample_datasets "select ........ from ........" -T presto

REPLACE_BACKUPモード

$ td query --result '{"type": "bigquery_v2", "td_authentication_id": 123456, "mode": "REPLACE_BACKUP", "backup_mode": "TABLE_RENAME", "project": "gcp_project_id", "dataset": "bg_dataset", "table": "bg_table", "location": "US", "auto_create_table": true, "add_missing_columns": true, "schema_file": "[{\"name\": \"c1\", \"type\": \"INTEGER\"}, {\"name\": \"c2\", \"type\": \"STRING\"}]", "skip_invalid_records":true}' -d sample_datasets "select ........ from ........" -T presto

TRUNCATEモード

$ td query --result '{"type": "bigquery_v2", "td_authentication_id": 123456, "mode": "TRUNCATE", "project": "gcp_project_id", "dataset": "bg_dataset", "table": "bg_table", "location": "US", "auto_create_table": true, "add_missing_columns": true, "schema_file": "[{\"name\": \"c1\", \"type\": \"INTEGER\"}, {\"name\": \"c2\", \"type\": \"STRING\"}]", "skip_invalid_records":true}' -d sample_datasets "select ........ from ........" -T presto

関連記事

その他の設定

  • Result Exportをスケジュールして、定期的にターゲット先にデータをアップロードできます。
  • すべてのインポートおよびエクスポート統合は、Treasure ワークフローに追加できます。tdデータオペレーターは、クエリ結果を指定された統合にエクスポートできます。詳細については、Reference for Treasure Data Operatorsを参照してください。