AWS ECSにSchemaSpyを乗せてサーバレスでER図を作成する


TL;DR

公式のDockerを参考にしつつ entrypoint.sh の末尾にS3に吐き出す処理を書く

要件

  • 任意の間隔でER図を定期的に生成したい
  • ER図ドキュメントは特定のIPからのみアクセス可能にしたい
  • EC2などサーバの面倒をみたくない。運用コストは最小限に。

流れ

今回は「ER図 自動生成」とかで検索するとヒットしやすいSchemaSpyを採用。特に深い理由は無いので好きなER図生成ツールを使う。ただしS3にアップロードする関係上静的ファイルを生成するツールを採用したほうが良い。

dockerfile

S3に吐くためにawscliが必要だが公式のimageにはもちろんのこと入っていないので入れてあげる。

entrypoint.sh も自作のを使うのでCOPYする必要がある。

Dockerfile
FROM schemaspy/schemaspy:snapshot

USER root

RUN apk --update --no-cache add \
    python \
    curl

RUN curl https://bootstrap.pypa.io/get-pip.py |python
RUN pip install awscli

COPY ./entrypoint.sh /

USER java

ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh

ドキュメントを生成するまでは同じだが、生成されたドキュメントをS3にアップロードする処理を入れる必要がある。

entrypoint.sh
#!/bin/sh
export MAIN_CLASS=$(unzip -p schemaspy*.jar META-INF/MANIFEST.MF | grep Main-Class | awk -F ': ' '{sub(/\r/,"",$2);print $2}')
[ "$(ls -A /drivers)" ] && export DRIVER_PATH=/drivers/ || export DRIVER_PATH=/drivers_inc/
echo "Running Main-Class $MAIN_CLASS"
echo -n "With drivers:"
ls -Ax $DRIVER_PATH | sed -e 's/  */, /g'
java -cp *:$DRIVER_PATH* $MAIN_CLASS -o /output -t pgsql -host $DB_HOST -u $DB_USER -db $DB_NAME -p $DB_PASS
aws s3 rm $S3PATH --recursive
aws s3 cp /output $S3PATH --recursive

公式のentrypoint.shは

exec java -jar /usr/local/lib/schemaspy/schemaspy*.jar -dp $DRIVER_PATH -o $OUTPUT "$@"

となっており、java実行時に引数をすべて渡すようになっているが、S3にアップロード処理を書く際に汎用性とセキュリティの観点から環境変数で指定してあげるようにする。

java -cp *:$DRIVER_PATH* $MAIN_CLASS -o /output -t pgsql -host $DB_HOST -u $DB_USER -db $DB_NAME -p $DB_PASS
aws s3 rm $S3PATH --recursive
aws s3 cp /output $S3PATH --recursive

これで以下の環境変数を設定する必要が発生する。

  • DB_HOST
  • DB_USER
  • DB_NAME
  • DB_PASS
  • S3PATH

s3を一度削除しているのはテーブル構成の変更で不要なファイルが発生することがあるため。

ECR

何かとECSで動かす場合はECRに乗せたほうが幸せになるので乗せる

FIY
Amazon ECR で AWS CLI を使用する - Amazon ECR
AWS CLI で Amazon ECR に docker イメージを push する - Qiita

例) er-documentsというリポジトリで作成していた場合

docker build -t er-documents .
aws ecr get-login --no-include-email --region ap-northeast-1  |bash -
docker tag er-documents:latest 000000000.dkr.ecr.ap-northeast-1.amazonaws.com/er-documents:latest
docker push 000000000.dkr.ecr.ap-northeast-1.amazonaws.com/er-documents:latest

ECS

今回は常時起動ではなくスケジューリングで動かすので以下の記事を参考にタスクの定義まで行ってください

Amazon ECS入門 〜公式のDockerイメージを使って10分で構築してみる〜 | DevelopersIO
AWS ECSでDockerコンテナ管理入門(基本的な使い方、Blue/Green Deployment、AutoScalingなどいろいろ試してみた) - Qiita

タスクの定義が終わったらスケジューリングを行います
参考例を上げておきます

Fargateがタスクスケジュールをサポートし定期実行処理の幅が超広がりました! | DevelopersIO

後は実行されるのを待てば完了です