GitHub ActionsでSchemaSpyのER図を生成してS3にアップロードする
これはなに
GitHub Actions上でSchemaSpyを使ってER図を生成し、S3にホスティングするまでの流れをまとめます。
誰でもアクセスできると困るので、CloudFrontでBasic認証をつけます。
今回はPostgreSQLを使った例ですがMySQLでも流れはほぼ同じです。
SchemaSpyを使うことで実際のDBからER図を自動生成して、テーブル間の関係を視覚的に見ることができます。
参考:公式のサンプルER図
手順
1. アップロード先となるS3の準備
今回はバケット名を仮に「my-schemaspy」とし、アクセスはCloudFront経由で行うのでパブリックアクセスはすべてブロックにしておきます。
2. GitHub ActionsでER図を生成してS3にアップロードする
事前準備としてGitHub ActionsからS3への認証をするためにAWSのIDプロバイダとIAMロールを作成しておきます。
以下の記事を参考にしてください。分かりやすい記事をありがとうございます。
SchemaSpy実行用のDockerfileを用意します。
services:
schemaspy:
container_name: my-schemaspy
build:
context: .
dockerfile: ./Dockerfile.schemaspy
volumes:
- ./output:/output
- ./schemaspy.properties:/schemaspy.properties
command: "java -jar schemaspy.jar -vizjs"
network_mode: "host"
Dockerfile(MySQLの場合は変わります)
FROM openjdk:11-jdk
ENV DRIVER_URL https://jdbc.postgresql.org/download/postgresql-42.6.0.jar
ENV APP_URL https://github.com/schemaspy/schemaspy/releases/download/v6.2.4/schemaspy-6.2.4.jar
RUN apt-get update && apt-get install -y fontconfig fonts-dejavu && \
wget -O schemaspy.jar ${APP_URL} && \
wget -O /postgresql.jar ${DRIVER_URL} && \
rm -rf /var/lib/apt/lists/*
schemaspyの設定ファイル(MySQLの場合は設定が変わります)
schemaspy.t=pgsql
schemaspy.host=localhost
schemaspy.port=5432
schemaspy.db=my_database
schemaspy.u=user
schemaspy.p=password
schemaspy.dp=/postgresql.jar
schemaspy.o=/output
GitHub Actionsのworkflow
# SchemaspyでER図を生成してs3にアップロード
name: schemaspy
# mainにマージされたときに発火させる
# workflow_dispatchで手動実行できるようにもしておく
on:
workflow_dispatch:
push:
branches:
- main
# 権限の設定
permissions:
id-token: write # OIDCでAWSにアクセスするために必要
contents: read # actions/checkoutで必要
jobs:
schemaspy:
runs-on: ubuntu-latest
# PostgreSQLのコンテナを立ち上げる
services:
postgres:
image: postgres
env:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: my_database
ports:
- 5432:5432
steps:
# リポジトリからコードを取得
- uses: actions/checkout@v4
# マイグレーションを実行
- name: Migration
run: # ここにマイグレーションの処理を書く
# SchemaSpyを実行
- name: SchemaSpy
run: docker compose -f compose.schemaspy.yml up
# AWSに接続するための設定
- name: Set up AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: # ここに作成したIAMロールのARNを入れる 例: arn:aws:iam::<アカウントID>:role/<ロール名>
aws-region: ap-northeast-1 # 東京リージョン
# S3にアップロード
- name: Upload to S3
run: |
aws s3 sync ./output s3://my-schemaspy --delete
3. CloudFront経由でS3にアクセスできるようにしてBasic認証をつける
CloudFrontでディストリビューションを作成します。
ER図を見るためだけの用途なので一番安い「北米と欧州のみを使用」で問題ないと思いますが、今回はアジアが含まれているクラスを選択してみます。
OACの設定に関して詳しくは以下の記事が参考になります。S3のバケットポリシーの編集が必要です。
Basic認証に関しては以下の記事が参考になります。CloudFrontで関数を作成して紐づけることで実現できます。
ここまでの設定が完了した上でCloudFrontのドメインをコピーしてアクセスするとBasic認証が起動し、入力するとER図が表示されるはずです🚀
おわりに
以上、GitHub Actions上でSchemaSpyを生成してS3で見れるようにするまでの流れをまとめました。
ホスティング先として最初はGitHub Pagesを考えていましたが、GitHub Enterpriseプランじゃないとアクセス制限をつけられなかったので今回はS3を選択しました。
SchemaSpyは手でER図を書かなくても自動生成してくれるので管理コストが低くて気に入っています。もし他にもER図の管理でおすすめの手法があれば教えてください。
少しでもこの記事がお役に立てれば幸いです。
Discussion