Ritolabo
  1. Home
  2. GoogleCloud
  3. BigQuery
  4. BigQuery Data Transfer Service で AWS RDS(MySQL)のデータを BigQuery に取り込む

BigQuery Data Transfer Service で AWS RDS(MySQL)のデータを BigQuery に取り込む

  • 公開日
  • カテゴリBigQuery
  • タグBigQuery,DataTransferService,Terraform,自分用メモ
BigQuery Data Transfer Service で AWS RDS(MySQL)のデータを BigQuery に取り込む

BigQuery Data Transfer Service(DTS)の MySQL コネクタを使うと、MySQL インスタンスのテーブルを BigQuery に取り込める。

GCS コネクタS3 コネクタ(無料・ファイルベース)とは異なり、有料コネクタ(スロット時間課金)かつネットワーク構成が必要。本記事では、ネットワーク構成から DTS 転送設定までを Terraform で構築する。

contents

  1. MySQL コネクタ
  2. 構成
    1. ネットワーク構成
  3. 構築するリソースの全体像
  4. 前提
    1. Secret Manager への登録
    2. DTS 接続用 MySQL ユーザー
  5. ディレクトリ構成
  6. Terraform
    1. variables.tf
    2. network.tf
    3. transfer.tf
    4. outputs.tf
    5. environments/dev の設定
  7. 適用
    1. 動作確認
  8. スキーマ自動マッピング
  9. スロット消費量の計測
    1. 計測クエリ
    2. コスト見積もり手順
  10. 転送対象テーブルの追加
  11. エラー時の挙動
  12. SA の権限
  13. 認証情報のローテーション

MySQL コネクタ

DTS の MySQL コネクタは、MySQL インスタンスからテーブル単位でデータを BigQuery に取り込むコネクタ。対象は Cloud SQL だけでなく、AWS RDS やオンプレミス等の外部 MySQL にも対応している。

項目内容
ステータスGA(一般提供)— 2025年12月19日 (リリースノート)
課金有料(スロット時間課金)— 2025年9月25日以降、従量課金制が適用
対応ソースCloud SQL, AWS RDS, オンプレミス, その他クラウドの MySQL
転送方式Full load(全件洗い替え)。CDC / 差分転送は非サポート
接続方式ネットワークアタッチメント経由(固定 IP / SSH トンネルは非サポート)
スキーマMySQL スキーマから BigQuery テーブルを自動作成・自動マッピング

同じ DB 系コネクタでも PostgreSQL は GA、Microsoft SQL Server はまだ Preview であり、コネクタごとにステータスが異なる。

構成

AWS RDS for MySQL
  │
  │ DTS MySQL コネクタ(有料・スロット時間課金)
  │ (ネットワークアタッチメント経由で接続)
  ↓
BigQuery ネイティブテーブル(dl_mysql.*)

ネットワーク構成

DTS には固定 IP も SSH トンネルもない。外部 MySQL に接続するにはネットワークアタッチメントが必須であり、接続方式は2つある。ネットワーク方式の違いは DTS の転送動作自体には影響しない。

方式概要RDS の露出月額固定費
Cloud VPNGCP-AWS 間に IPsec VPN トンネルを張り、プライベート IP で接続プライベート~$110/月(HA VPN 2トンネル)
Cloud NATGCP 側に静的 IP を持つ Cloud NAT を構成し、RDS のセキュリティグループでその IP のみ許可パブリック(IP 制限)~$5/月

Cloud VPN 方式

GCP-AWS 間に IPsec VPN トンネルを張り、プライベート IP で RDS に接続する。RDS をインターネットに露出させないため、セキュリティ的にはこちら一択。

┌─ GCP ──────────────────────────────────────────────────────────┐
│                                                                │
│  ┌─ VPC ネットワーク ────────────────────────────────────────┐  │
│  │                                                          │  │
│  │  ┌─ サブネット ───────────────────────────────────────┐   │  │
│  │  │                                                    │  │  │
│  │  │  ネットワークアタッチメント ◄─── DTS MySQL コネクタ  │  │  │
│  │  │                                                    │  │  │
│  │  └────────────────────────────────────────────────────┘  │  │
│  │                                                          │  │
│  └──────────────────────────────────────────────────────────┘  │
│                     │                                          │
│  Cloud Router ─── HA VPN ゲートウェイ                           │
│                     │ IPsec トンネル × 2(冗長化)              │
│                     │                                          │
└─────────────────────│──────────────────────────────────────────┘
                      │ プライベート IP 通信(暗号化)
                      │
┌─ AWS ──────────────────────────────────────────────────────────┐
│                     │                                          │
│  VPN ゲートウェイ(Virtual Private Gateway or Transit Gateway) │
│                     │                                          │
│  ┌─ VPC ────────────│────────────────────────────────────────┐ │
│  │                  │                                        │ │
│  │  ┌─ プライベートサブネット ─────────────────────────────┐  │ │
│  │  │                                                    │  │ │
│  │  │  RDS for MySQL(パブリックアクセス: 無効)            │  │ │
│  │  │  セキュリティグループ: GCP サブネット CIDR のみ許可   │  │ │
│  │  │                                                    │  │ │
│  │  └────────────────────────────────────────────────────┘  │ │
│  └──────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────┘

Cloud NAT 方式

GCP 側に静的 IP を持つ Cloud NAT を構成し、RDS のセキュリティグループでその IP のみ許可する。RDS がパブリックアクセスを持つ必要があるが、コストが低い。

┌─ GCP ──────────────────────────────────────────────────────────┐
│                                                                │
│  ┌─ VPC ネットワーク ────────────────────────────────────────┐  │
│  │                                                          │  │
│  │  ┌─ サブネット ───────────────────────────────────────┐   │  │
│  │  │                                                    │  │  │
│  │  │  ネットワークアタッチメント ◄─── DTS MySQL コネクタ  │  │  │
│  │  │                                                    │  │  │
│  │  └────────────────────────────────────────────────────┘  │  │
│  │                     │                                    │  │
│  └─────────────────────│────────────────────────────────────┘  │
│                        │                                       │
│  Cloud Router ─── Cloud NAT ─── 静的外部 IP                    │
│                        │                                       │
└────────────────────────│───────────────────────────────────────┘
                         │ アウトバウンド通信(静的 IP から発信)
                         ▼
┌─ AWS ──────────────────────────────────────────────────────────┐
│  RDS for MySQL(セキュリティグループで静的 IP のみ許可)          │
└────────────────────────────────────────────────────────────────┘

方式比較

項目Cloud VPNCloud NAT
GCP 側の追加リソースHA VPN ゲートウェイ, VPN トンネル × 2静的外部 IP, Cloud NAT
AWS 側の追加リソースVPN ゲートウェイ, VPN 接続なし
Cloud Router の役割BGP によるルート交換NAT のルーティング
RDS の配置プライベートサブネットパブリックサブネット
RDS のパブリックアクセス無効有効(IP 制限)
通信経路暗号化トンネル(プライベート)インターネット経由
月額固定費~$110/月~$5/月

本記事は検証用として Cloud NAT 方式で構築する。

構築するリソースの全体像

Cloud NAT 方式で構築するリソースの一覧と依存関係。

リソース役割依存先
VPC ネットワークネットワークの基盤
サブネットDTS の通信が所属するネットワークVPC
Cloud RouterCloud NAT のルーティング制御VPC
静的外部 IPCloud NAT に割り当て、RDS のセキュリティグループで許可する IP
Cloud NATDTS のアウトバウンド通信に静的 IP を付与Cloud Router, 静的外部 IP, サブネット
ネットワークアタッチメントDTS と VPC を接続するインターフェースサブネット
DTS 転送設定MySQL → BigQuery の転送定義ネットワークアタッチメント

DTS がネットワークアタッチメントを通じて VPC に接続し、Cloud NAT 経由で静的 IP を使ってインターネットに出ていく。RDS のセキュリティグループでその静的 IP のみを許可することで、アクセスを制限する。

前提

  • GCP プロジェクトが作成済み
  • Terraform がインストール済み
  • gcloud で認証済み
  • Dataform 環境の記事の構成が適用済み(SA dataform-executor が存在する状態)
  • BigQuery Data Transfer API が有効化済み
  • Compute Engine API が有効化済み(VPC / ネットワークリソースの作成に必要)
  • AWS RDS for MySQL が稼働中(パブリックアクセス有効、セキュリティグループで Cloud NAT の静的 IP を許可)
  • DTS 接続用の MySQL ユーザーが作成済み(SELECT 権限のみで十分)
  • dl_mysql データセットが作成済み

Secret Manager への登録

MySQL パスワードと TLS 証明書を Secret Manager に登録しておく。

GC コンソール → Secret Manager → 「シークレットを作成」から以下の2つを登録する。

シークレット名レプリケーション
dts-mysql-passwordMySQL ユーザーのパスワードユーザー管理(asia-northeast1)
dts-mysql-tls-certificateAWS RDS の CA 証明書(ap-northeast-1-bundle.pem の内容)ユーザー管理(asia-northeast1)

AWS RDS の CA 証明書は AWS 公式ドキュメントからダウンロードする。global-bundle.pem(全リージョン・全世代のバンドル)は Secret Manager の上限(64 KiB)を超えるため登録できない。RDS のリージョンに対応する ap-northeast-1-bundle.pem を使用する。

DTS 接続用 MySQL ユーザー

CREATE USER 'dts_reader'@'%' IDENTIFIED BY '<password>';
GRANT SELECT ON <database>.* TO 'dts_reader'@'%';
FLUSH PRIVILEGES;

DTS は Full load(バッチ転送)であり、SELECT 権限のみで十分。

  • Full load: SELECT * FROM table で全件取得して BigQuery に書き込む方式。
  • CDC(Change Data Capture): MySQL のバイナリログを読んで変更差分を取得する方式。この場合 REPLICATION SLAVE 等の追加権限が必要

ディレクトリ構成

Cloud Workflows の記事で構築した Terraform に dts_mysql/ モジュールを追加する。

terraform/
├── modules/
│   ├── dts_mysql/              ← 新規
│   │   ├── variables.tf
│   │   ├── network.tf          # VPC, サブネット, Cloud Router, Cloud NAT, ネットワークアタッチメント
│   │   ├── transfer.tf         # Secret Manager 参照 + DTS 転送設定
│   │   └── outputs.tf
│   ├── dataform/               # 既存
│   ├── dts_gcs/                # 既存
│   ├── dts_s3/                 # 既存
│   ├── spreadsheet/            # 既存
│   └── workflows/              # 既存
└── environments/
    └── dev/
        ├── main.tf             # module "dts_mysql" 追加
        ├── locals_dts_mysql.tf # 新規
        └── dts_mysql_tables/   # 新規
            └── ec_app.yaml

GCS / S3 コネクタとの違いとして、ネットワークリソース一式(VPC, Cloud NAT 等)がモジュールに含まれる。

Terraform

variables.tf

variable "project_id" {
  description = "GCP プロジェクト ID"
  type        = string
}

variable "region" {
  description = "デフォルトリージョン"
  type        = string
}

variable "dataform_executor_email" {
  description = "Dataform 実行用 SA のメールアドレス"
  type        = string
}

variable "destination_dataset" {
  description = "BigQuery 宛先データセット"
  type        = string
}

variable "mysql_host" {
  description = "MySQL ホスト(RDS エンドポイント)"
  type        = string
}

variable "mysql_port" {
  description = "MySQL ポート"
  type        = string
  default     = "3306"
}

variable "mysql_database" {
  description = "MySQL データベース名"
  type        = string
}

variable "mysql_username" {
  description = "MySQL ユーザー名"
  type        = string
}

variable "mysql_password_secret" {
  description = "Secret Manager のシークレット名(MySQL パスワード)"
  type        = string
}

variable "mysql_tls_certificate_secret" {
  description = "Secret Manager のシークレット名(TLS 証明書)"
  type        = string
}

variable "tables" {
  description = "転送対象テーブルのリスト"
  type        = list(string)
}

variable "network_name_suffix" {
  description = "ネットワークリソース名のサフィックス"
  type        = string
  default     = ""
}

network.tf

ネットワークリソース一式を作成する。

# VPC
resource "google_compute_network" "dts_mysql" {
  name                    = "dts-mysql-vpc${var.network_name_suffix}"
  auto_create_subnetworks = false
}

# サブネット
resource "google_compute_subnetwork" "dts_mysql" {
  name                     = "dts-mysql-subnet${var.network_name_suffix}"
  ip_cidr_range            = "10.0.0.0/24"
  region                   = var.region
  network                  = google_compute_network.dts_mysql.id
  private_ip_google_access = true
}

# 静的外部 IP(Cloud NAT 用)
resource "google_compute_address" "dts_mysql_nat" {
  name   = "dts-mysql-nat-ip${var.network_name_suffix}"
  region = var.region
}

# Cloud Router
resource "google_compute_router" "dts_mysql" {
  name    = "dts-mysql-router${var.network_name_suffix}"
  network = google_compute_network.dts_mysql.id
  region  = var.region
}

# Cloud NAT
resource "google_compute_router_nat" "dts_mysql" {
  name                               = "dts-mysql-nat${var.network_name_suffix}"
  router                             = google_compute_router.dts_mysql.name
  region                             = var.region
  nat_ip_allocate_option             = "MANUAL_ONLY"
  nat_ips                            = [google_compute_address.dts_mysql_nat.self_link]
  source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS"

  subnetwork {
    name                    = google_compute_subnetwork.dts_mysql.id
    source_ip_ranges_to_nat = ["ALL_IP_RANGES"]
  }
}

# ネットワークアタッチメント
resource "google_compute_network_attachment" "dts_mysql" {
  provider              = google-beta
  name                  = "dts-mysql-attachment${var.network_name_suffix}"
  region                = var.region
  subnetworks           = [google_compute_subnetwork.dts_mysql.self_link]
  connection_preference = "ACCEPT_AUTOMATIC"
}

ファイアウォールルールは不要。DTS の通信はアウトバウンドであり、Cloud NAT 経由で行われる。

ネットワークアタッチメントの注意点:

  • 作成後に VPC やサブネットの変更は不可(変更する場合は新規作成が必要)
  • DTS が接続に使用した後はセルフサービスで削除できない(Google Cloud サポートへの連絡が必要)
  • google-beta プロバイダーが必要
  • 宛先データセットと同じリージョンに作成する

transfer.tf

Secret Manager から認証情報を取得し、DTS 転送設定を作成する。

# Secret Manager からパスワードを取得
data "google_secret_manager_secret_version" "mysql_password" {
  secret = var.mysql_password_secret
}

# Secret Manager から TLS 証明書を取得
data "google_secret_manager_secret_version" "mysql_tls_certificate" {
  secret = var.mysql_tls_certificate_secret
}

# SA に Secret Manager の読み取り権限を付与
resource "google_secret_manager_secret_iam_member" "mysql_password" {
  secret_id = var.mysql_password_secret
  role      = "roles/secretmanager.secretAccessor"
  member    = "serviceAccount:${var.dataform_executor_email}"
}

resource "google_secret_manager_secret_iam_member" "mysql_tls_certificate" {
  secret_id = var.mysql_tls_certificate_secret
  role      = "roles/secretmanager.secretAccessor"
  member    = "serviceAccount:${var.dataform_executor_email}"
}

# DTS 転送設定
resource "google_bigquery_data_transfer_config" "mysql" {
  display_name           = "load_mysql_${var.mysql_database}"
  location               = var.region
  data_source_id         = "mysql"
  destination_dataset_id = var.destination_dataset

  params = {
    "connector.endpoint.host"             = var.mysql_host
    "connector.endpoint.port"             = var.mysql_port
    "connector.database"                  = var.mysql_database
    "connector.authentication.username"   = var.mysql_username
    "connector.authentication.password"   = data.google_secret_manager_secret_version.mysql_password.secret_data
    "connector.networkAttachment"         = google_compute_network_attachment.dts_mysql.id
    "connector.tls.mode"                  = "ENCRYPT_VERIFY_CA_AND_HOST"
    "connector.tls.trustedPemCertificate" = data.google_secret_manager_secret_version.mysql_tls_certificate.secret_data
    "assets"                              = jsonencode([for t in var.tables : "${var.mysql_database}/${t}"])
  }

  service_account_name = var.dataform_executor_email
}

GCS / S3 コネクタとの params の違い:

項目GCSS3MySQL
data_source_idgoogle_cloud_storageamazon_s3mysql
パスのキーdata_path_templatedata_path
認証SA の GCS IAMaccess_key_id + secret_access_keyconnector.authentication.*
テーブル指定destination_table_name_templatedestination_table_name_templateassets(JSON 配列)
ネットワークconnector.networkAttachment
TLSconnector.tls.*

assets["database/table1", "database/table2"] 形式の JSON 配列。jsonencode で生成する。

params のキー名について

MySQL コネクタの params キー名は Terraform provider のドキュメントにも公式ドキュメントにも記載されていない(2026-03 時点)。正確なパラメータ名は Data Transfer Service API の dataSources.get エンドポイントで確認した。

GET https://bigquerydatatransfer.googleapis.com/v1/projects/{project}/locations/{location}/dataSources/mysql

レスポンスの parameters 配列に全パラメータの paramId・型・許可値が含まれる。

outputs.tf

output "transfer_config_id" {
  description = "DTS MySQL 転送設定の ID"
  value       = google_bigquery_data_transfer_config.mysql.name
}

output "nat_ip_address" {
  description = "Cloud NAT の静的 IP(RDS のセキュリティグループに設定する)"
  value       = google_compute_address.dts_mysql_nat.address
}

nat_ip_address は apply 後に出力される。この IP を RDS のセキュリティグループに設定する。

environments/dev の設定

# environments/dev/main.tf に追加
module "dts_mysql" {
  source                       = "../../modules/dts_mysql"
  project_id                   = local.project_id
  region                       = local.region
  dataform_executor_email      = module.dataform.dataform_executor_email
  destination_dataset          = "dl_mysql"
  mysql_host                   = local.dts_mysql_host
  mysql_port                   = "3306"
  mysql_database               = local.dts_mysql_database
  mysql_username               = local.dts_mysql_username
  mysql_password_secret        = "dts-mysql-password"
  mysql_tls_certificate_secret = "dts-mysql-tls-certificate"
  tables                       = local.dts_mysql_tables
  network_name_suffix          = "v2"
}
# environments/dev/locals_dts_mysql.tf
locals {
  dts_mysql_host     = "<RDS エンドポイント>"
  dts_mysql_database = "sample_ec"
  dts_mysql_username = "dts_reader"
  dts_mysql_tables   = yamldecode(file("${path.module}/dts_mysql_tables/ec_app.yaml"))
}
# environments/dev/dts_mysql_tables/ec_app.yaml
- users
- products
- orders
- order_items

テーブルリストを YAML で管理することで、新規テーブル追加時は1行追加して terraform apply するだけで対応できる。

適用

cd terraform/environments/dev

terraform init
terraform plan
terraform apply

以下のリソースが作成される。

リソース説明
VPC ネットワークネットワークアタッチメント用
サブネットasia-northeast1
静的外部 IPCloud NAT に割り当て
Cloud RouterCloud NAT のルーティング
Cloud NATDTS の通信に静的 IP を付与
ネットワークアタッチメントDTS と VPC の接続
Secret Manager IAM × 2SA のシークレット読み取り権限
DTS 転送設定MySQL → BigQuery

apply 後に出力される nat_ip_address を RDS のセキュリティグループに追加する。

動作確認

GC コンソール → BigQuery → データ転送 → load_mysql_sample_ec → 「今すぐ転送を実行」

SELECT * FROM `<YOUR-PROJECT-ID>.dl_mysql.users`;
SELECT * FROM `<YOUR-PROJECT-ID>.dl_mysql.products`;

GCS/S3 コネクタでは BigQuery 側にテーブルを CREATE TABLE しておかないと転送設定の作成時にエラーになるが、MySQL コネクタでは転送実行時に BigQuery テーブルが存在しなくても MySQL のスキーマ情報をもとにテーブルが作られた。

スキーマ自動マッピング

MySQL → BigQuery の型変換:

MySQL 型BigQuery 型
INTINTEGER
VARCHARSTRING
DATETIMETIMESTAMP
DATEDATE

全カラムが NULLABLE になる。MySQL 側の NOT NULL 制約は BigQuery に引き継がれない。

スロット消費量の計測

MySQL コネクタは有料コネクタであり、スロット時間(slot-hours)で従量課金される。スロット数は Google が自動で割り当てるため、事前にコストを算出する公式の計算式は存在しない。実際に転送を実行して計測する。

計測クエリ

SELECT
  job_id,
  creation_time,
  TIMESTAMP_DIFF(end_time, start_time, SECOND) AS duration_seconds,
  total_slot_ms,
  total_slot_ms / (1000 * 60 * 60) AS slot_hours,
  total_bytes_processed
FROM
  `region-asia-northeast1`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
  AND job_id LIKE 'mysql_%'
ORDER BY
  creation_time DESC;
  • 1テーブル = 1ジョブとして記録される(テーブルごとの内訳が取れる)
  • 空テーブル(0 B)でも total_slot_ms は発生する(スキーマ取得のオーバーヘッド)

コスト見積もり手順

1. 本番相当のデータ量で DTS 転送を1回実行
2. 上記クエリで total_slot_ms を取得
3. slot-hours に換算(total_slot_ms / 3,600,000)
4. 東京リージョン単価($0.0765/slot-hour)を掛ける
5. 日次実行 × 30日 で月額を算出

公式のガイドラインは「転送実行1時間あたり最大20スロット時間」という上限目安のみ。

転送対象テーブルの追加

MySQL に新しいテーブルが追加された場合、DTS は自動検知しない。YAML にテーブル名を追加して terraform apply する。

# ec_app.yaml
- users
- products
- orders
- order_items
- reviews    # ← 追加

内部的には assets パラメータの変更により転送設定の destroy + recreate が走る。

UI の編集画面からテーブルを追加しようとすると「参照」ボタンが接続エラーになるため、テーブル追加には転送設定の再作成が必要。Terraform 管理であればこの制約は問題にならない。

エラー時の挙動

テストエラーメッセージ
接続不可(セキュリティグループで IP ブロック)INVALID_ARGUMENT: Failed to connect to MySQL instance.
MySQL ユーザーの権限不足(SELECT 剥奪)上記と全く同じメッセージ

DTS のエラーメッセージだけでは「ネットワーク到達不可」と「権限不足」を区別できない。原因切り分けは以下の順で行う:

  1. ネットワーク疎通確認(VPN / NAT の状態、セキュリティグループ)
  2. MySQL 側のログ確認(接続拒否 or 認証失敗 or 権限不足)
  3. DTS の接続設定確認(ホスト、ポート、ユーザー、パスワード、証明書)

SA の権限

SA役割権限
dataform-executor転送設定の実行 SAroles/bigquery.admin
DTS サービスエージェントBigQuery への書き込み自動付与(roles/bigquerydatatransfer.serviceAgent

GCS コネクタでは SA に GCS バケットの objectViewer が必要だったが、MySQL コネクタでは MySQL の認証情報を転送設定の params に直接渡すため、そのような IAM 設定は不要。

認証情報のローテーション

認証情報の自動ローテーションが必要な場合は、AWS Secrets Manager → Lambda → GCP DTS API といった連携を構築する必要がありそう。

Secret Manager に DB 認証情報を登録したのは terraform 用であり、DTS 側には Secret Manager への参照は渡っていない(UI上から登録したときも、ユーザー名やパスワードは入力した。そこが secret manager を指定できたりも現状していなかった)

つまり、Secret Manager の値を更新しただけでは DTS に反映されない。反映には terraform apply または DTS API の transferConfigs.patch が必要の可能性が高い。

まとめ

Terraform で作成したリソースの全体像。

terraform/
└── modules/dts_mysql/
    ├── network.tf
    │   ├── VPC ネットワーク
    │   ├── サブネット(10.0.0.0/24)
    │   ├── 静的外部 IP
    │   ├── Cloud Router
    │   ├── Cloud NAT(静的 IP 割り当て)
    │   └── ネットワークアタッチメント(DTS と VPC の接続)
    │
    └── transfer.tf
        ├── Secret Manager data source × 2(パスワード, TLS 証明書)
        ├── Secret Manager IAM × 2(SA の読み取り権限)
        └── DTS 転送設定(MySQL → BigQuery)

検証で得た知見:

  • DTS MySQL コネクタは AWS RDS・オンプレミス等の外部 MySQL に対応している(Cloud SQL 専用ではない)
  • ネットワークアタッチメントは DTS 接続後にセルフサービスで削除できない(Google Cloud サポートへの連絡が必要)
  • MySQL スキーマから BigQuery テーブルが自動作成される(宛先テーブルの事前作成は不要)
  • NOT NULL 制約は BigQuery に引き継がれない(全カラム NULLABLE
  • エラーメッセージは「接続不可」と「権限不足」で同一(MySQL 側のログで切り分け)
  • テーブル追加には転送設定の再作成が必要(YAML 1行追加 → terraform apply
  • Terraform params のキー名はドキュメント未整備(dataSources.get API で確認する)
  • 有料コネクタのコスト見積もりは INFORMATION_SCHEMA.JOBStotal_slot_ms で実測する

Author

rito

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級