🦊

GitHub ActionsでSchemaSpyのER図を生成してS3にアップロードする

2024/06/02に公開

これはなに

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ロールを作成しておきます。

以下の記事を参考にしてください。分かりやすい記事をありがとうございます。

https://zenn.dev/rescuenow/articles/1976c01e28b3cc

https://zenn.dev/kou_pg_0131/articles/gh-actions-oidc-aws

SchemaSpy実行用のDockerfileを用意します。

compose.schemaspy.yml
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の場合は変わります)

Dockerfile.schemaspy
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.properties
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

.github/workflows/schemaspy.yml
# 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のバケットポリシーの編集が必要です。

https://dev.classmethod.jp/articles/amazon-cloudfront-origin-access-control/

Basic認証に関しては以下の記事が参考になります。CloudFrontで関数を作成して紐づけることで実現できます。

https://dev.classmethod.jp/articles/apply-basic-authentication-password-with-cloudfront-functions/#toc-3

ここまでの設定が完了した上でCloudFrontのドメインをコピーしてアクセスするとBasic認証が起動し、入力するとER図が表示されるはずです🚀

おわりに

以上、GitHub Actions上でSchemaSpyを生成してS3で見れるようにするまでの流れをまとめました。

ホスティング先として最初はGitHub Pagesを考えていましたが、GitHub Enterpriseプランじゃないとアクセス制限をつけられなかったので今回はS3を選択しました。

SchemaSpyは手でER図を書かなくても自動生成してくれるので管理コストが低くて気に入っています。もし他にもER図の管理でおすすめの手法があれば教えてください。

少しでもこの記事がお役に立てれば幸いです。

Discussion