6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ZOZOAdvent Calendar 2023

Day 2

BigQueryの静的テーブルをterraformで管理する

Last updated at Posted at 2023-12-01

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"])
}
6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?