この記事は GRIPHONE Advent Calendar 2022 24日目の記事になります。
前回に引き続き、dataformを試してみようと思います。
今回は、こちらを参考にgit(github)連携をしてみようと思います。
また、せっかくなのでbetaではありますが、terraformでdataformの構築ができるようなので、それも試してみます。
git連携をすることで、変更を残すことも出来るようになりますし、
ReviewやPull requestsを通して作業が出来るようになったりと、利用の幅が広がると思います。
今回のストーリー
今回は、
①dataform関連の構築をterraformで実装
②その後は奈良県と京都府の神社のテーブルの生成とそのビューテーブルの作成
③github上のrepositoryに保存
の3点を達成することを目的とします。
やっていき
github周りの設定
まずはgithub上でrepositoryの作成とrepositoryにアクセスするためのtokenを生成します。
repositoryはさくっと作成しておきます。
次に、今回はこちらを参考にfine-grained personal access tokenを作成します。
dataformのリポジトリを作成&選択をして、PermissionsでContentsをRead and Writeにして、tokenを生成します。
Terraformで構築
さて、terraformで一気に構築しましょう。やることとしては、
- dataformのrepositoryを作成
- dataformのrepositoryとリンクするgit repository(予め作成したdataform-exercise)を指定
- dataform用のservice accountにBigQueryのジョブユーザーと編集者のRoleを付与
- git repositoryのtokenを格納できるようにsecret managerを作成
- 作成したsecret managerを閲覧できるroleをdataform用のservice accountに付与
です。
ここではお試しなので、tokenをソースコードにベタ書きしていますが、セキュリティリスク上おすすめしません。
お試しではありますが、tokenとか上げたくないなとかあれば、secret managerだけ手で入れるとかでもよきかと思います。
variable "project_id" {
default = "xxx"
}
variable "dataform_service_account" {
default = "service-xxx@gcp-sa-dataform.iam.gserviceaccount.com"
}
variable "authentication_token_secret" {
default = "token"
}
provider "google-beta" {
project = var.project_id
region = "us-central1"
}
resource "google_project_iam_member" "member_role" {
provider = google-beta
for_each = toset([
"roles/bigquery.dataEditor",
"roles/bigquery.jobUser",
])
role = each.key
member = "serviceAccount:${var.dataform_service_account}"
project = var.project_id
}
resource "google_secret_manager_secret" "dataform_exercise_git" {
provider = google-beta
secret_id = "dataform-exercise-git"
replication {
automatic = true
}
}
resource "google_secret_manager_secret_version" "dataform_exercise_git_version" {
provider = google-beta
secret = google_secret_manager_secret.dataform_exercise_git.id
secret_data = var.authentication_token_secret
}
resource "google_secret_manager_secret_iam_member" "member" {
provider = google-beta
secret_id = google_secret_manager_secret.dataform_exercise_git.secret_id
role = "roles/secretmanager.secretAccessor"
member = "serviceAccount:${var.dataform_service_account}"
}
resource "google_dataform_repository" "dataform_exercise_repository" {
provider = google-beta
name = "shrine"
git_remote_settings {
url = "https://github.com/hoge/fuga"
default_branch = "main"
authentication_token_secret_version = google_secret_manager_secret_version.dataform_exercise_git_version.id
}
}
terraformのコードが出来上がったので、あとはapplyをかけていきます。
shrine repositoryが出来上がりました。git連携もできていそうに見えます。
dataform上でデータフローを作成
さて、ここからは前回同様、dataform上での作業をします。
まずは、ワークスペースを作りましょう。ここでは、add-shrineとします。
さてワークスペースが出来ました。
ここにはすでにREADME.md
があり、先にgithubでdataform-exerciseというrepositoryのREADME.md
が取り込まれていることがわかります。
またワークスペースを初期化したのち、データフローを作成します。
definitions/shrine_kyoto.sqlx
config {
type: "table",
columns: {
name: "shrine name",
}
}
SELECT "伏見稲荷大社" AS name UNION ALL
SELECT "北野天満宮" AS name UNION ALL
SELECT "平等院" AS name
definitions/shrine_nara.sqlx
config {
type: "table",
columns: {
name: "shrine name",
}
}
SELECT "伏見稲荷大社" AS name UNION ALL
SELECT "北野天満宮" AS name UNION ALL
SELECT "平等院" AS name
definitions/shrine.sqlx
config {
type: "view",
columns: {
name: "神社の名前",
}
}
SELECT * FROM ${ref("shrine_kyoto")}
UNION ALL
SELECT * FROM ${ref("shrine_nara")}
ちなみに今回は神社にしてみました。
データワークフローを実行して、実際にテーブルが出来上がっているかを確認しましょう。
無事にできました。では、こちらをcommitとpushをしていきましょう。
リモートリポジトリにpushに成功するとPull requests作成(と見せかけたRepository)へのリンクが出ますので、あとはgithub上でmergeをしてください。
最終的には、github上にもcommitを残すことが出来ました!dataform上でのcommitは 吉永大輝 authored and GCP Dataform committed 24 minutes ago
みたいな表示になるんですね。(ちょっと気になります。)
まとめ
今回はdataformの構築とgithubの連携をterraform上で実行し、github上にcommitログを残すことが出来ました。
今回使用したソースコードはこちらにも置いておきますので、とりあえず遊んでみたいとかあればぜひ試してみてください。
https://github.com/yoshina9a/dataform-exercise
https://github.com/yoshina9a/dataform-exercise-terraform
メリークリスマス🎅⛄️🎉