dbtやDataformの普及によって、データ集計定義をGitHubで管理しレビュー後に反映するというソフトウェア開発のプラクティスがデータ分析にも適用されることがよく見られるようになりました。
一方で毎日集計されるわけでも、更新頻度が高いわけでも無いテーブルは以前としてBigQueryのコンソールなどから手動で作成されることもよくあります。
そのため、この種のテーブル(静的テーブル)もterraformで管理し、GitHubのPullRequestによるレビューなどが行われるようなプロセスにしてみます。
テーブルを作成したい人がterraformに慣れ親しんでいるケースは少ないので、terraformに慣れていない人でも扱いやすいファイル構造にします。
まずは、以下のようにデータセットとテーブルの構造を以下のようなディレクトリ構造に対応付けます。
static_tables
├── データセット名1
│ ├── テーブル名1.yaml
│ └── テーブル名2.yaml
├── データセット名2
│ └── テーブル名3.yaml
└── データセット名3
└── テーブル名4.yaml
そして、それぞれのYAMLファイルにはこのようにスキーマ情報を記述します。JSON形式はケツカンマ問題などがあり、書きづらいためにYAML形式にしています。
schema:
- name: カラム名1
type: 型1
mode: NULLABLE
- name: カラム名2
type: 型2
mode: NULLABLE
- name: カラム名3
type: 型3
mode: NULLABLE
最後に以下のようなterraformを用意すれば、YAMLファイルを追加してterraform applyするだけでBigQueryテーブルが自動生成されるようになります。
google_bigquery_tableのschemaフィールドはJSON形式のデータを要求しているので、yamldecodeした後にjsonencodeしています。
resource "google_bigquery_table" "static_table" {
for_each = fileset("${path.module}/static_tables", "*/*.yaml")
project = "プロジェクトID"
dataset_id = split("/", each.value)[0]
table_id = trimsuffix(split("/", each.value)[1], ".yaml")
schema = jsonencode(yamldecode(file("${path.module}/static_tables/${each.value}"))["schema"])
}