データ基盤のインフラを手動クリックで管理する時代は終わりました。本記事では、SnowflakeとBigQueryをTerraformで宣言的に管理する具体的な方法をコード付きで解説します。結論から述べると、Terraformはデータ基盤のIaC化における事実上の標準であり、DB・スキーマ・ウェアハウス・ロール・権限の5要素をコード管理することで、監査性・再現性・権限統制のいずれも一気に向上します。

なぜデータ基盤にIaCが必要か

データ基盤の運用で最も厄介なのは「誰が・いつ・何を変更したか分からない」状態です。手動で付与された権限が忘れ去られ、退職者のアカウントが残り続け、検証用に作ったはずのロールが本番環境で使われ続ける――どれもIaC化されていない環境でよく見る光景です。

Terraformなどを使ってインフラをコード化すれば、変更はすべてGitで追跡され、レビュー可能になります。データ基盤は「権限がビジネスクリティカル」という性質を持つため、一般的なアプリケーションインフラよりもIaCの恩恵が大きい領域なのです。

Terraformの基本とデータ基盤での活用範囲

Terraformはプロバイダーと呼ばれるプラグインを通じて各種クラウドリソースを管理します。データ基盤で使う主要なプロバイダーは、Snowflake(Snowflake社公式のSnowflake Terraform Provider)、Google(BigQuery、IAM、Cloud Storage)、AWS(Redshift、S3、IAM)などです。

管理対象は「アプリケーションから見たインフラ層」、すなわちデータベース・スキーマ・ウェアハウス・ロール・権限が中心です。テーブル定義や変換ロジックはdbtの管轄となるため、Terraformで触るのは境界までにしておくのが鉄則です。

【Terraformでの管理対象】

  [Terraform管理レイヤー]
       |
       +--> Database / Schema
       +--> Warehouse / Compute
       +--> Role / User / Group
       +--> Grant / Permission
       +--> Network Policy
       |
  [dbt管理レイヤー]
       |
       +--> Table / View / Materialized View
       +--> Business Logic / Tests / Docs

※ テーブル定義はdbtで管理し、Terraformはインフラの境界まで。

Snowflake × Terraform 実装例

まずはSnowflake Providerの基本設定から始めます。認証情報は環境変数やtfvarsで外部化しておき、コードにハードコードしないのが鉄則です。

terraform {
  required_providers {
    snowflake = {
      source  = "Snowflake-Labs/snowflake"
      version = "~> 0.90"
    }
  }
}

provider "snowflake" {
  account = var.snowflake_account
  role    = "TERRAFORM_ADMIN"
}

次にデータベース、スキーマ、ウェアハウス、ロールを作成します。命名規約を明確にして、環境ごとの接尾辞を変数化しておくと管理しやすくなります。

resource "snowflake_database" "analytics" {
  name = "ANALYTICS_${upper(var.env)}"
}

resource "snowflake_schema" "marts" {
  database = snowflake_database.analytics.name
  name     = "MARTS"
}

resource "snowflake_warehouse" "compute" {
  name           = "COMPUTE_WH_${upper(var.env)}"
  warehouse_size = "XSMALL"
  auto_suspend   = 60
  auto_resume    = true
}

resource "snowflake_role" "analyst" {
  name = "ANALYST_ROLE_${upper(var.env)}"
}

最後に権限付与です。SnowflakeのRBACは階層が深いので、ロール間のgrantとオブジェクトへのgrantを分けて整理します。

resource "snowflake_grant_privileges_to_role" "analyst_select" {
  privileges = ["USAGE", "SELECT"]
  role_name  = snowflake_role.analyst.name
  on_schema_object {
    all {
      object_type_plural = "TABLES"
      in_schema          = "${snowflake_database.analytics.name}.${snowflake_schema.marts.name}"
    }
  }
}

BigQuery × Terraform 実装例

BigQueryはGoogle Providerで管理します。SnowflakeほどRBACが複雑ではなく、データセット単位でIAMポリシーを付けるシンプルな構造です。

resource "google_bigquery_dataset" "marts" {
  dataset_id  = "marts_${var.env}"
  location    = "asia-northeast1"
  description = "Gold層データマート"

  default_table_expiration_ms = 31536000000  # 365日
  labels = {
    env   = var.env
    owner = "data-platform"
  }
}
resource "google_bigquery_dataset_iam_member" "analyst_reader" {
  dataset_id = google_bigquery_dataset.marts.dataset_id
  role       = "roles/bigquery.dataViewer"
  member     = "group:analysts@example.com"
}

IaCのベストプラクティス

Terraformコードを量産するだけでは運用は楽になりません。モジュール化、state管理、CI/CD連携、drift検知の4点を押さえることで、初めて「IaCを運用できる」状態になります。

プラクティス概要具体的な実装方法
モジュール化再利用可能な単位に分割database、role、grantごとにmoduleを作成
Remote State管理複数人で安全に操作するGCS / S3バックエンドとstate lock
環境分離dev/stg/prodで独立workspaceまたはディレクトリ分離
CI/CD連携PRで自動Plan、mergeで自動ApplyGitHub Actions / Atlantis
Drift検知手動変更を検出する日次でterraform planを実行し差分通知
Secretsの分離認証情報をコードから除外Secret Manager / Vault / tfvars暗号化

次にIaCツール自体の選択肢を比較しておきます。データ基盤ではTerraformが事実上の標準ですが、他の選択肢も知っておいて損はありません。

観点TerraformPulumiAWS CDK
記述言語HCLTypeScript / Python / Go 他TypeScript / Python 他
データ基盤対応Snowflake / BigQuery / Databricks 全般Snowflake / BigQuery 対応AWS中心
学習コストHCLを覚える必要あり既存のプログラミング言語が使えるAWS SDKに近い
コミュニティ最大成長中AWS内で大きい
向く用途マルチクラウド、データ基盤ロジック多めのインフラAWS特化

IaC導入の注意点

IaC化は銀の弾丸ではありません。導入時に特に注意が必要な3つの落とし穴をお伝えします。

第一に、state管理の重要性です。stateファイルはインフラの実態とTerraformコードを結びつける要であり、ローカルPCに置いたまま運用すると事故のもとになります。必ずリモートバックエンド(GCS、S3など)とstate lockを併用してください。

第二に、既存リソースのimportです。すでに手動で作ったデータベースや権限を後からTerraform管理下に置く場合、`terraform import`コマンドで取り込む必要があります。一気に全部importしようとせず、段階的にコードと実態を合わせていくのが安全です。

第三に、Plan/Applyのレビュー体制です。Planの出力は長くなりがちで、目視だけでは見落としが起きます。削除系の変更には特に気をつけ、CODEOWNERSやレビュー必須ルールで守る体制を整えましょう。

まとめ

データ基盤のIaC化は、監査・再現性・権限統制の3点で劇的な改善をもたらします。Terraformという強力な道具を手にした以上、次の一歩はモジュール化とCI/CD連携です。小さく始めて、徐々に管理範囲を広げていきましょう。

よくある質問

データ基盤でTerraformは何を管理しますか?

DWHのデータベース・スキーマ・ウェアハウス・ロール・権限付与を管理します。テーブル定義やデータ変換はdbtの管轄で、Terraformはインフラ層を担います。役割分担を明確にすることで、どちらのコードで何を変えるべきかが迷わず判断できます。

既存のSnowflake環境にTerraformを導入できますか?

はい。`terraform import`コマンドで既存リソースをstate管理下に取り込めます。段階的に管理範囲を広げるアプローチが安全です。最初は新規リソースのみTerraformで作成し、軌道に乗ったら既存リソースをimportしていく二段構えが現実的です。

TerraformとPulumiのどちらがデータ基盤に向いていますか?

データ基盤ではTerraformの方がプロバイダーの成熟度が高く、情報も豊富です。TypeScript/Pythonでインフラを書きたい場合はPulumiが選択肢になります。チームのスキルセットとプロバイダーの対応範囲から判断するとよいでしょう。