GCPでpreviewになったdataformを触ってみる(2)~terraformで構築とgit連携編~

Yoshina9aPosted by

この記事は 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

メリークリスマス🎅⛄️🎉