業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【データ基盤】
データハブとは
Ajust
データの保守運用
AI

執筆者:Handbook編集部

DataformをTerraformで作成する方法

はじめに

この記事では、Dataform を Terraform で構築する方法を紹介します。 なお今回は、Dataformで実行するコードをGithubから取得し、Dataformのデフォルトのサービスアカウントで実行することを想定しています。

Terraform の書き方

早速ですが、Terraform の書き方は以下の通りです

ファイル構成

  • locals.tf
  • secret.tf
  • role.tf
  • dataform.tf

locals.tf

まず、今回作成するリソースで使う各種変数を定義します。 リージョン、プロジェクト名、プロジェクト番号、環境、スケジューリングのタイムゾーンを設定します。

locals {
  system_id      = "YOUR_PROJECT_PREFIX"
  env            = "dev"
  project        = "${local.system_id}-${local.env}"
  project_number = "YOUR_PROJECT_NUMBER"
  region         = "asia-northeast1"
  time_zone      = "Asia/Tokyo"
}

secret.tf

次にSecret ManagerにGithubの個人用アクセス トークン(Personal Access Tokens)を設定します。

resource "google_secret_manager_secret" "dataform_github_pat" {
  secret_id = "${local.project}-dataform-github-pat"
  project   = local.project
  replication {
    user_managed {
      replicas {
        location = local.region
      }
    }
  }
}

data "google_secret_manager_secret_version" "dataform_github_pat" {
  secret  = google_secret_manager_secret.dataform_github_pat.id
  version = "latest"
}

resource "google_secret_manager_secret_iam_member" "dataform_default" {
  project   = google_secret_manager_secret.dataform_github_pat.project
  secret_id = google_secret_manager_secret.dataform_github_pat.secret_id
  role      = "roles/secretmanager.secretAccessor"
  member    = "serviceAccount:service-${local.project_number}@gcp-sa-dataform.iam.gserviceaccount.com"
}

role.tf

続いて、Dataformのデフォルトのサービスアカウントに実行に必要な権限を設定します。

variable "role_for_dataform_default" {
  default = [
    "roles/bigquery.dataEditor",
    "roles/bigquery.jobUser",
    "roles/bigquery.resourceViewer",
  ]
}

resource "google_project_iam_member" "member_dataform_default" {
  count   = length(var.role_for_dataform_default)
  role    = element(var.role_for_dataform_default, count.index)
  member  = "serviceAccount:service-${local.project_number}@gcp-sa-dataform.iam.gserviceaccount.com"
  project = local.project
}

dataform.tf

最後に、実際のDataformのリソースを定義します。

google_dataform_repository においては、接続する Git リポジトリのURL、デフォルトのブランチ名、シークレットの設定をします。 また、接続するリポジトリ内のdataform.jsonで指定している各種デフォルト設定をworkspace_compilation_overridesの中で上書きすることができます。 今回は、dafault_databaseをlocal.projectに指定しています。 これにより、同一のソースコードを本番/ステージング/開発環境などにデプロイしBigQueryを実行するプロジェクトを切り分けることが可能になります。

google_dataform_repositoryにおいては、接続する Git リポジトリの情報を取得する頻度を設定します。 以下の例では、cron_scheduleで毎日午前0時に取得するように設定しています。 また、code_compilation_configのvarsにおいて、カスタム変数を指定することも可能です。 Dataformで実行されるクエリが、default_database以外のGCP プロジェクトを参照する場合などに便利です。

google_dataform_repository_workflow_configにおいては、Dataformのワークフローを設定します。 以下の例では、sqlxのconfigの中にdailyタグが入っているクエリを毎日1:00に実行しています。 これは、上記の google_dataform_repository の時間の後にすると最新の情報が反映されやすいでしょう。

resource "google_dataform_repository" "dataform_repo" {
  provider = google-beta
  name     = "my-dataform"
  project  = local.project
  region   = local.region

  git_remote_settings {
    url                                 = "https://github.com/YOUR_ORG/YOUR_REPO.git"
    default_branch                      = "main"
    authentication_token_secret_version = data.google_secret_manager_secret_version.dataform_github_pat.name
  }

  workspace_compilation_overrides {
    default_database = local.project
  }
}

resource "google_dataform_repository_release_config" "dataform_repo_continue_delivery" {
  provider = google-beta

  project    = google_dataform_repository.dataform_repo.project
  region     = google_dataform_repository.dataform_repo.region
  repository = google_dataform_repository.dataform_repo.name

  name          = "continue-delivery"
  git_commitish = "main"
  cron_schedule = "0 0 * * *"
  time_zone     = locals.time_zone

  code_compilation_config {
    default_database = local.project
    vars = {
      EXTERNAL_PROJECT = "external-project-name"
    }
  }

}

resource "google_dataform_repository_workflow_config" "dataform_daily_tag_workflow" {
  provider = google-beta

  project        = google_dataform_repository.dataform_repo.project
  region         = google_dataform_repository.dataform_repo.region
  repository     = google_dataform_repository.dataform_repo.name
  name           = "dataform_daily_tag_workflow"
  release_config = google_dataform_repository_release_config.dataform_repo_continue_delivery.id

  invocation_config {
    included_tags                            = ["daily"]
    transitive_dependencies_included         = false
    transitive_dependents_included           = false
    fully_refresh_incremental_tables_enabled = false
  }

  cron_schedule = "0 1 * * *"
  time_zone     = locals.time_zone
}

まとめ

本記事では、Terraform で Dataform を管理する方法について解説しました。 Terraformを利用することで、Terraform の設定管理を効率的かつミスの少ないものにできます。

info
備考

Hakky ではエンジニアを募集中です!まずは話してみたいなどでも構いませんので、ぜひお気軽に採用ページからお問い合わせくださいませ。

2025年07月06日に最終更新
読み込み中...