自己紹介
Platform Engineeringチームに所属している縄司です。
今日はデータの民主化におけるデータカタログ導入について執筆しようと思います。
データカタログについて
データカタログの重要性
データに触れるのがエンジニアだけでない現代のビジネス環境では、データの理解、アクセス、利用を容易にするための仕組みが必要となります。データカタログは、データ資産に関するメタデータ(データのデータ)を集約し、整理するツールやプラットフォームを指し、データの発見性、理解度、信頼性を高めることに貢献します。以下にデータカタログの重要性をさらに詳しく説明します。
データの発見性の向上
データカタログはデータセットを検索可能にし、ユーザーが必要とするデータを迅速に見つけ出せるようにするためのキーツールです。これにより、エンジニアだけでなく、データアナリストやビジネスアナリストなど、データを利用する全てのユーザーの生産性が向上します。
データの理解度の向上
データセットの内容、起源、品質、関連性などに関する情報を提供します。これには、各テーブルのカラムが何を示しているか、データの更新頻度、データの所有者などが含まれます。この情報により、ユーザーはデータの文脈を理解し、そのデータが特定の用途に適しているかを判断できます。
ガバナンスの促進とコラボレーション
データの使用に関するガイドラインやポリシーを提供し、データの適切な利用を促進します。また、データの使用状況に関するインサイトを提供し、組織内のコラボレーションを促進します。これにより、データガバナンスの強化と、組織内のデータ文化の醸成が促進されます。
このようにデータカタログはエンジニアだけでなく、非エンジニアも含めたあらゆるステークホルダーがデータを効率的に、かつ効果的に利用できる環境を提供してくれます。
データカタログを通じてデータの発見性、理解度を高めることは、データ駆動型の意思決定を支援し、最終的には組織全体の競争力を向上させることに繋がります。
データカタログ導入
前回のブログで執筆したように検索性と可視化を考慮してデータカタログにSchemaSpyを採用することにしました。
理想的なデータカタログの管理方法として、Amazon S3にデータを保管し、プライベートアクセスで共有することは非常に効果的な手段です。S3はセキュリティが高く、大量のデータを安全に保管することが可能であり、アクセス管理も柔軟に設定できます。これにより、必要なチームや個人だけが特定のデータにアクセスできるように制限することが可能です。しかし、弊社では、エンジニアであれば誰でもVPNを介したプライベートネットワークへの接続が可能ですが、非エンジニアの中には接続できる方が限られています。そのため、全社員がアクセス可能な形で情報を共有するために、Slackを通じて出力ファイルを共有する方針を採用し、実装を行いました。
このプロセスは非常にシンプルです。出力までの流れと、GitHub Actionsで使用したコードは以下の通りになります。

# workflow-schemaspy-uploader.yml
name: schemaspy-uploader
on:
push:
branches:
- production
jobs:
run-schemaspy:
runs-on: ubuntu-latest
env:
DB_NAME: mysql
DB_PASSWORD: password
USER_NAME: mysql
services:
db:
image: mysql:5.7
ports:
- 3306:3306
env:
MYSQL_DATABASE: mysql
MYSQL_USER: mysql
MYSQL_PASSWORD: password
MYSQL_ALLOW_EMPTY_PASSWORD: yes
options: >-
--health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup MySQL
run: |
docker cp .github/workflows/mysql/my.cnf ${{ job.services.db.id }}:/etc/mysql/conf.d/
docker restart ${{ job.services.db.id }}
- name: Install Ridgepole # DB管理ツール
run: |
sudo apt-get update
sudo apt-get install -y ruby ruby-dev build-essential
sudo gem install ridgepole
- name: Apply Database Schema with Ridgepole # Ridgepoleによるスキーマの適用
run: |
MYSQL_PASSWORD=test MYSQL_HOST=db NETWORK=${{ job.services.db.network }} make schema/apply
- name: Make schemaspy.properties # SchemaSpy実行用のプロパティ
run: |
echo -e "
schemaspy.t=mysql\n
schemaspy.host=db\n
schemaspy.port=3306\n
schemaspy.db=$DB_NAME\n
schemaspy.u=$USER_NAME\n
schemaspy.p=$DB_PASSWORD\n
schemaspy.s=$DB_NAME\n
schemaspy.o=./output\n
schemaspy.dp=mysql-connector-java-5.1.48/mysql-connector-java-5.1.48-bin.jar \
" > /tmp/schemaspy.properties
- name: Run SchemaSpy # SchemaSpyの実行
run: |
sudo mkdir -p /tmp/output
sudo chmod 777 /tmp/output
sudo docker run --rm --net=${{ job.services.db.network }} -v "/tmp/output:/output" -v "/tmp/schemaspy.properties:/schemaspy.properties" schemaspy/schemaspy:latest -rails -vizjs -norows -nopages
mkdir -p artifact
cp -r /tmp/output artifact
- name: Enzip # 出力ファイルをzipにまとめる
run: |
sudo apt-get install -y zip
zip -r artifact/schema-info.zip artifact
- uses: actions/upload-artifact@v3
with:
name: my-artifact
path: artifact/schema-info.zip
- name: Post to Slack channel # Slackへの投稿
run: |
sudo curl https://slack.com/api/files.upload -F token=${{ secrets.SLACK_ACCESS_TOKEN }} -F channels="XXXXXXXXXXX" -F file="@artifact/schema-info.zip"
まとめ
この取り組みは、データの民主化を目指し、特に非エンジニアの方々に配慮した実装方針のもとに行われました。しかし、予想以上にエンジニアからも高い関心が寄せられ、多くの方が業務効率化の一助となったと評価しています。オリジナルデータベースには、まだ解読が困難なテーブルが数多く存在します。そのため、テーブルの可読性と使いやすさの向上には、引き続き努力を重ねていく必要があります。