Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
StreamlitとTerraformでデータカタログを作った話
Search
Ayumu Yamaguchi
March 28, 2024
Programming
0
360
StreamlitとTerraformでデータカタログを作った話
Streamlitでデータカタログを自作し、Terraformでメタデータ管理をしたお話です。
Ayumu Yamaguchi
March 28, 2024
Tweet
Share
More Decks by Ayumu Yamaguchi
See All by Ayumu Yamaguchi
Streamlitを使ってデータカタログを作ってみた
gussan0223
0
180
Other Decks in Programming
See All in Programming
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
660
Sheets API使ってみた
toshi0383
2
140
What We Can Learn From OSS
inouehi
0
430
Ruby GitHub Packages
bkuhlmann
0
630
Git Lint
bkuhlmann
4
750
SwiftUIで使いやすいToastの作り方 / How to build a Toast system which is easy to use in SwiftUI
lovee
3
150
Elm Form Validation
bkuhlmann
0
510
二郎系ラーメンのコールで学ぶ AST 解析
memory1994
PRO
7
1.7k
try!Swift Tokyo 2024 参加報告 LT
akidon0000
1
230
Polars入門
daikikatsuragawa
1
110
Kotlin Multiplatform at Stable and Beyond (Android Makers 2024)
zsmb
0
390
Behind VS Code Extensions for JavaScript / TypeScript Linnting and Formatting
unvalley
5
1.1k
Featured
See All Featured
Building Your Own Lightsaber
phodgson
100
5.7k
10 Git Anti Patterns You Should be Aware of
lemiorhan
649
58k
StorybookのUI Testing Handbookを読んだ
zakiyama
13
4.6k
Optimising Largest Contentful Paint
csswizardry
11
2.4k
Art, The Web, and Tiny UX
lynnandtonic
290
19k
Agile that works and the tools we love
rasmusluckow
325
20k
How to name files
jennybc
65
93k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
12
8.3k
Automating Front-end Workflow
addyosmani
1357
200k
Fashionably flexible responsive web design (full day workshop)
malarkey
398
65k
The Brand Is Dead. Long Live the Brand.
mthomps
49
29k
Done Done
chrislema
178
15k
Transcript
© GENDA Inc. StreamlitとTerraformでデータカタログを作った話 Data Engineer 山口 歩夢
© GENDA Inc. 自己紹介 【所属】 株式会社GENDA データエンジニア 【経歴】 営業職:4年 データエンジニア:3年
【発信】 ブログ:https://qiita.com/Ayumu-y X(旧Twitter):https://twitter.com/Yamaguchi_aaaaa 山口歩夢
© GENDA Inc. 本日のお話 StreamlitとTerraformを使って データカタログ作成~メタデータの管理を実現したお話
© GENDA Inc. まずはStreamlitでデータカタログを作成したお話
© GENDA Inc. 作成までの経緯
© GENDA Inc. 作成までの経緯 ▪抱えていた悩み • 社内にしっかり管理されたデータカタログが存在しなかった • Excelファイルや口伝で情報が伝わっており、 どれが最新のものか分かりにくく、メンテナンスが行き届いていなかった
• カタログ型のソフトウェアは高額なため、こちらも参入障壁が高かった • SQLを実行する時に、どのテーブルを使うべきか理解するのに苦労した
© GENDA Inc. 【機能】 • 指定したスキーマのテーブル一覧 • テーブルのカラム情報 • テーブル内のデータプレビュー
データカタログについて
© GENDA Inc. こちらでデータベース, スキーマ, テーブルを指定すると ▪ドロップダウンでDatabase・Schema・Tableを選択 データカタログについて
© GENDA Inc. 指定したスキーマのテーブル一覧がこちらに表示されます ▪ドロップダウンでDatabase・Schema・Tableを選択 データカタログについて
© GENDA Inc. 10 ▪ドロップダウンでDatabase・Schema・Tableを選択 下部にここで指定したテーブルのカラムの情報やプレビューも表示されます データカタログについて
© GENDA Inc. ▪テーブルの概要を検索 赤枠の部分に検索したい文字列を入力すると データカタログについて
© GENDA Inc. 指定したスキーマ内のテーブルの概要に検索をかけられます ▪テーブルの概要を検索 データカタログについて
© GENDA Inc. 評判が良好なデータカタログができました!
© GENDA Inc. しかし、メタデータの管理に課題が残りました
© GENDA Inc. メタデータ管理の課題 • とにかく手間がかかる ◦ ALTER TABLEにCOMMENTを入れて毎回クエリを実行する必要があった •
データエンジニア以外の人が自由にメタデータを編集しづらい ◦ スプレッドシートなどに変更したいメタデータを書いてもらい、 再度ALTER TABLEのクエリを実行する。といった流れになってしまう • 更新メタデータの差分が分かりづらい
© GENDA Inc. そうだ Terraform 使おう
© GENDA Inc. どうしてTerraformでメタデータの管理を効率化できるのか
© GENDA Inc. Terraformでメタデータ管理を効率化できる理由 • 弊社が既にデータ基盤を Terraformで管理している • Terraformがyamlを読み込むことができる 1.
yamlでメタデータの管理ができる 2. yamlで管理できるとエンジニア以外のデータカタログユーザーでも編集 &更新依頼ができる 3. 管理の効率が上がる • GitHub Actionsで更新を自動化できる ◦ yamlをGitHubに上げると自動更新される仕組みが作れる
© GENDA Inc. さっそく実装!!
© GENDA Inc. 【実装方法】 • 以下のようなディレクトリ構成で Terraformのmoduleを用意する • tablesディレクトリ内のyamlにはテーブル毎のメタデータを記述する •
tables.tfからtablesディレクトリ内のyamlファイルを、ループ処理で一括で読み込めるようにする ◦ yamlファイルに変更があったテーブルのみ、 terraform apply でメタデータの更新処理が走る • terraform apply はGitHub Actionsで、Pull Requestがマージされた時に実行されるようにする modules/[database名]/ ├─[schema名]/ │ ├─tables.tf # yamlをループ処理で読み込む │ └─tables/ # テーブル毎にyamlを作成 │ ├─[テーブル名1].yaml │ ├─[テーブル名2].yaml │ └─[テーブル名3].yaml └─schema.tf Terraformによるメタデータ管理
© GENDA Inc. Terraformによるメタデータ管理 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 } } } 【tables.tf】 tablesディレクトリ内のyamlファイルをループ処理で読み込む
© GENDA Inc. name: workflow for Terraform Data Definition #
mainブランチにPRがマージされた時 or mainブランチに直接pushされた時に実行 # yamlファイルを変更したときに実行される。 on: push: branches: - main paths: - 'terraform/modules/snowflake_resource/DATA_CATALOG_LT/tables/*.yaml' permissions: id-token: write contents: read env: TF_VERSION: 1.5.6 AWS_REGION: ${{ secrets.AWS_REGION }} AWS_IAM_ROLE_ARN: ${{ secrets.AWS_IAM_ROLE_ARN }} # Snowflakeの認証情報 SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }} SNOWFLAKE_REGION: ${{ secrets.SNOWFLAKE_REGION }} SNOWFLAKE_USER: ${{ secrets.SNOWFLAKE_USER }} SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }} jobs: main: name: main runs-on: ubuntu-latest strategy: matrix: workdir: [terraform/tfroot] # backendをS3に設定している場合は、AWSの認証情報が必要 steps: - uses: actions/checkout@v3 - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v1-node16 with: role-to-assume: ${{ env.AWS_IAM_ROLE_ARN }} aws-region: ${{ env.AWS_REGION }} - name: terraform setup uses: hashicorp/setup-terraform@v2 with: terraform_version: ${{ env.TF_VERSION }} - name: init working-directory: ${{ matrix.workdir }} run: terraform init - name: Terraform plan -target="module.snowflake_resource_lt" working-directory: ${{ matrix.workdir }} run: terraform plan -no-color -target="module.snowflake_resource_lt - name: Terraform apply -target="module.snowflake_resource_lt" working-directory: ${{ matrix.workdir }} run: terraform apply -auto-approve -no-color Terraformによるメタデータ管理 【workflow.yaml (GitHub Actions)】 paths:で該当のyamlのメタデータが更新された場合のみ、 merge時にterraform applyが走る。
© GENDA Inc. name: "EMPLOYEES" comment: "従業員マスター " change_tracking: false
columns: - name: "EMPLOYEE_ID" type: "NUMBER(38,0)" comment: "従業員ID。このテーブルの主キー。 " nullable: false - name: "FIRST_NAME" type: "VARCHAR(50)" comment: "名前。" nullable: true - name: "LAST_NAME" type: "VARCHAR(50)" comment: "苗字。" nullable: true - name: "SALARY" type: "NUMBER(10,2)" comment: "給与。ドル単位で格納。 " nullable: true - name: "HIRE_DATE" type: "DATE" comment: "雇用した日。日本時間にて格納。 " nullable: true Terraformによるメタデータ管理 【tables/[テーブル名].yaml】 右図の例のように、 table毎にyamlでメタデータを記載しておく。 このyamlをGitHubにpushしてmainにmergeすれば、 GitHub Actionsが走ってメタデータが更新される。 以上で実装完了です!
© GENDA Inc. メタデータ管理の仕組みを作った結果
© GENDA Inc. 結果 データカタログの運用・管理が効率化できました! • メタデータの最新情報を GitHubで管理を一元化できるようになった • データカタログの更新方法が確立した
• データカタログユーザーからのメタデータ更新依頼が来ても、 スムーズに最新情報にアップデートできるようになった
© GENDA Inc. まとめ
© GENDA Inc. 今後の展望 • まだ一部のデータのメタデータしか入っていないので、すべてのメタデータをこの機能に入れる • メタデータ管理の課題を解決できたので、データカタログの機能をアップグレードしていきたい ◦ 曖昧検索
◦ データリネージ ◦ もっと使いやすくてかっこいい UI など • Streamlit in Snowflakeでデータカタログを動かしたい!
© GENDA Inc. サンプルコード GitHubでサンプルコードを公開しています! https://github.com/genda-tech/sample-data-catalog
© GENDA Inc. 採用情報 【株式会社GENDA 採用情報】 募集要項はこちら 【GENDA Creators Blog】
技術記事などはこちら GENDAでは一緒に働く仲間を募集しています! 採用情報やブログ記事などは、下記の 2次元コードからご確認ください! 【GENDA note】 社員インタビューはこちら
© GENDA Inc. ご清聴ありがとうございました!