以下のドキュメントで説明されているスプレッドシートを外部表にする設定をterraformで管理してみます。
まずは、この記事と同様にディレクトリ階層とテーブル階層が等価になるような設計にします。
https://qiita.com/shiozaki/items/71272a71c5a2b6bba93a
sheets_tables
├── データセット名1
│ ├── テーブル名1.yaml
│ └── テーブル名2.yaml
├── データセット名2
│ └── テーブル名3.yaml
└── データセット名3
└── テーブル名4.yaml
それぞれのYAMLファイルの中身は以下のような構造をとっています。
source_uri: <連携したいシートのURL①>
sheet_name: <連携したいシート名称(スプレッドシート画面の最下部にあるタブの名前)②>
range_top_left: <連携したい範囲の左上のセル③>
range_bottom_right: <連携したい範囲の右下のセル(下方向に無制限にしたい場合は数字を省略)④>
schema:
- name: <カラム名1>
type: <カラム名1の型>
mode: NULLABLE
- name: <カラム名2>
type: <カラム名2の型>
mode: NULLABLE
...
それぞれの記載内容を図示します。
最後に以下のtfファイルをterraform applyすればYAMLファイルに対応したスプレッドシート外部表が自動的に作成されます。
resource "google_bigquery_table" "external-sheets" {
for_each = fileset("${path.module}/sheets_tables", "*/*.yaml")
project = local.project
dataset_id = split("/", each.value)[0]
table_id = trimsuffix(split("/", each.value)[1], ".yaml")
external_data_configuration {
source_format = "GOOGLE_SHEETS"
autodetect = false
schema = jsonencode(yamldecode(file("${path.module}/external_tables/${each.value}"))["schema"])
google_sheets_options {
skip_leading_rows = 0
range = join("", [
yamldecode(file("${path.module}/external_tables/${each.value}"))["sheet_name"],
"!",
yamldecode(file("${path.module}/external_tables/${each.value}"))["range_top_left"],
":",
yamldecode(file("${path.module}/external_tables/${each.value}"))["range_bottom_right"],
]
)
}
source_uris = [
yamldecode(file("${path.module}/external_tables/${each.value}"))["source_uri"]
]
}
}