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

BigQuery Data Transfer Service(DTS)の MySQL コネクタを使うと、MySQL インスタンスのテーブルを BigQuery に取り込める。
GCS コネクタ・S3 コネクタ(無料・ファイルベース)とは異なり、有料コネクタ(スロット時間課金)かつネットワーク構成が必要。本記事では、ネットワーク構成から DTS 転送設定までを Terraform で構築する。
contents
- MySQL コネクタ
- 構成
- 構築するリソースの全体像
- 前提
- ディレクトリ構成
- Terraform
- 適用
- スキーマ自動マッピング
- スロット消費量の計測
- 転送対象テーブルの追加
- エラー時の挙動
- SA の権限
- 認証情報のローテーション
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 VPN | GCP-AWS 間に IPsec VPN トンネルを張り、プライベート IP で接続 | プライベート | ~$110/月(HA VPN 2トンネル) |
| Cloud NAT | GCP 側に静的 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 VPN | Cloud 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 Router | Cloud NAT のルーティング制御 | VPC |
| 静的外部 IP | Cloud NAT に割り当て、RDS のセキュリティグループで許可する IP | — |
| Cloud NAT | DTS のアウトバウンド通信に静的 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-password | MySQL ユーザーのパスワード | ユーザー管理(asia-northeast1) |
dts-mysql-tls-certificate | AWS 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 の違い:
| 項目 | GCS | S3 | MySQL |
|---|---|---|---|
data_source_id | google_cloud_storage | amazon_s3 | mysql |
| パスのキー | data_path_template | data_path | — |
| 認証 | SA の GCS IAM | access_key_id + secret_access_key | connector.authentication.* |
| テーブル指定 | destination_table_name_template | destination_table_name_template | assets(JSON 配列) |
| ネットワーク | — | — | connector.networkAttachment |
| TLS | — | — | connector.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 |
| 静的外部 IP | Cloud NAT に割り当て |
| Cloud Router | Cloud NAT のルーティング |
| Cloud NAT | DTS の通信に静的 IP を付与 |
| ネットワークアタッチメント | DTS と VPC の接続 |
| Secret Manager IAM × 2 | SA のシークレット読み取り権限 |
| 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 型 |
|---|---|
| INT | INTEGER |
| VARCHAR | STRING |
| DATETIME | TIMESTAMP |
| DATE | DATE |
全カラムが 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 のエラーメッセージだけでは「ネットワーク到達不可」と「権限不足」を区別できない。原因切り分けは以下の順で行う:
- ネットワーク疎通確認(VPN / NAT の状態、セキュリティグループ)
- MySQL 側のログ確認(接続拒否 or 認証失敗 or 権限不足)
- DTS の接続設定確認(ホスト、ポート、ユーザー、パスワード、証明書)
SA の権限
| SA | 役割 | 権限 |
|---|---|---|
dataform-executor | 転送設定の実行 SA | roles/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.getAPI で確認する) - 有料コネクタのコスト見積もりは
INFORMATION_SCHEMA.JOBSのtotal_slot_msで実測する

