前置き
こんにちは。データエンジニアの山口歩夢です!
まずは宣伝をさせていただきます。
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データチームではプロダクトのデータ解析や機械学習プロジェクトを推進できるデータサイエンティストを募集しています。
興味を持っていただけましたら、是非ご連絡いただけると幸いです!