LoginSignup
6
4

【メタデータ管理】TerraformでStreamlitの自作データカタログのメタデータ管理をやってみた

Last updated at Posted at 2024-03-16

前置き

こんにちは。データエンジニアの山口歩夢です!

まずは宣伝をさせていただきます。
3/28(木)の18:30〜以下のイベントで
「StreamlitとTerraformでデータカタログを作った話」をします。

ソースコードも公開する予定なので、是非視聴していただけると嬉しいです!

本題

それでは本題です。

以前、Streamlitを使ってデータカタログの作成に挑戦をしました。
機能としては、SnowflakeのテーブルのCOMMENTにメタデータを入れておいて、
それをStreamlitアプリ上に表示させるといったものになります。

データカタログは無事作成できたのですが、
毎回SnowFlakeでクエリを実行してCOMMENTにメタデータ入力して更新する必要があり不便だな...と感じておりました。

そこで、Terraformでメタデータの管理をやればyamlでメタデータも管理できるし、
毎回クエリを作成する必要を無くせるのではないかと思いました。

早速実装!

ディレクトリの用意

まずはterraformのディレクトリをこういった形で用意します。

terraform/
├─modules
│  └─schema/
│     ├─tables.tf        # yamlをループ処理で読み込む
│     └─tables/          # テーブル毎にyamlを作成
│         ├─[テーブル名1].yaml
│         ├─[テーブル名2].yaml
│         └─[テーブル名3].yaml
└─tfroot
   ├─main.tf
   └─provider.tf

ファイルにコードを書いていく

用意したファイルたちにコードを書いていきます。

tables.tf

このファイルで、tablesディレクトリの中のyamlをループ処理で読み込んで一気にSnowflakeのテーブルのCOMMENTを更新する形にします。

locals {
 table_files = fileset("${path.module}/tables", "*.yaml")
 tables      = { for file in local.table_files : replace(file, ".yaml", "") => yamldecode(file("${path.module}/tables/${file}")) }
}

resource "snowflake_table" "tables" {
 for_each = local.tables

 database = "DEV_YAMAGUCHI"
 schema   = "TEST"
 name     = each.value.name
 comment  = each.value.comment

 dynamic "column" {
   for_each = each.value.columns
   content {
     name     = column.value.name
     type     = column.value.type
     comment  = column.value.comment
     nullable = column.value.nullable
   }
 }
}

[テーブル名].yaml

yamlにメタデータをテーブル毎に以下のような形式で入れておきます。
こちらをtables.tfで読み込むようにしています。

name: "EMPLOYEES"
comment: "従業員マスター"
change_tracking: false
columns:
 - name: "EMPLOYEE_ID"
   type: "NUMBER(38,0)"
   comment: "従業員の氏名。このテーブルの主キー。"
 - name: "FIRST_NAME"
   type: "VARCHAR(50)"
   comment: "名前。"
 - name: "LAST_NAME"
   type: "VARCHAR(50)"
   comment: "苗字。"
 - name: "SALARY"
   type: "NUMBER(38,0)"
   comment: "給与。ドル単位で格納。"
 - name: "HIRE_DATE"
   type: "DATE"
   comment: "雇用した日。日本時間にて格納。"

main.tf

terraform applyを実行するときに、tables.tfのモジュールを呼び出すようにします。

module "meta_data_definition" {
  source = "../modules/schema/"
}

provider.tf

Snowflakeに接続するためのproviderを用意します。

terraform {
  required_version = "~> 1.5.0"
    snowflake = {
      source  = "Snowflake-Labs/snowflake"
      version = "~> 0.87.2"
    }
  }
}

provider "snowflake" {
  profile = "[~/.snowflake/configファイルのSnowflakeの認証情報]"
  role    = "[Snowflakeで使いたいロール名]"
}

以上のようにファイルを用意し、terraform applyを実行すると、
yamlに書かれたメタデータを一括で更新することができました!

まとめ

このように実装することによって、
以下のようなメリットを得ることができたと考えております。

  • yamlファイルなのでデータエンジニア以外の人でも、
    更新したいメタデータを簡単&自由に編集することもできる
  • 常に最新のメタデータの情報をGitHub上で一元管理できる
  • テーブルのメタデータをterraform applyで一括更新できる

イベントでは上記の詳しい話や、
上記に加えてメタデータの自動更新を可能にした方法などもお話しようと考えています!

採用

GENDAデータチームではプロダクトのデータ解析や機械学習プロジェクトを推進できるデータサイエンティストを募集しています。
興味を持っていただけましたら、是非ご連絡いただけると幸いです!

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4