はじめに
テーブル定義とかER図とかを資料にするのが面倒で、何かいいのないかと調べたところschemaspyを見つけました。
これでいい感じにDB仕様書がつくってみます。
自分でDBやテーブル定義を用意するのが面倒だったのでisuconの勉強も兼ねてprivate-isuをお借りしました。
private-isuを立ち上げる
前準備としてprivate-isuを立ち上げます。
立て方と後片付けのやり方は
を参考にしてください。
また、上記に加えてschemaspyでmysqlへのアクセスを行うため、インバウンドルールを追加で設定する必要があります。
MYSQL/Auroraをインバウンドルールに追加しましょう
下記記事が参考になります。
躓きポイントなのでしっかりやっておきましょう。
私はインバウンドルールが認識の外にあったので躓きました。
インスタンスとmysqlに入る
SSH接続かなんかで上記で立てたインスタンスに入ります。
chmod 400 /path/to/my-key-pair.pem
ssh -i /path/to/my-key-pair.pem ubuntu@ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
権限考えるの面倒なんでroot権限で入ります。普通に良くないのでやめた方がいいです。
sudo su -
mysqlもrootユーザで入ります。
入るのに必要な情報はこのへんを見ます。
mysql -u isuconp -p
ポートとホストを確認。
-- host
show variables like 'hostname';
-- port
show variables like 'port';
DBを確認。
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| isuconp |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set
isuconp
(今回schemaspyでER図を作るDB) も一応確認。
show tables from isuconp;
+-------------------+
| Tables_in_isuconp |
+-------------------+
| comments |
| posts |
| users |
+-------------------+
3 rows in set
良さげではないでしょうか。
ユーザーの作成とアクセス権限の付与
MySQL Serverに外部から接続するために、外部接続用ユーザの作成と権限付与を行います。
下記のようにクエリを叩くと、権限がlocalhostしかないことがわかります。
これでは外部からのアクセスができません!
select user, host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| isuconp | localhost |
| root | localhost |
| ...etc | localhost |
+------------------+-----------+
x rows in set
なので作ります。
create user "schemaspy"@"%" identified by "%password%";
select user, host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| schemaspy | % |
| isuconp | localhost |
| root | localhost |
| ...etc | localhost |
+------------------+-----------+
x rows in set
権限の付与もするぞ!
grant all privileges on *.* to "schemaspy"@"%";
できたらmysqlの外に出て、mysqld.cnfを編集します。
下記2項目をIPフリーにします。SG側で設定しているから大丈夫でしょ(適当)
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
リスタートします。
sudo service mysql restart
この章は下記記事を参考にしました。
schemaspy
schemaspyを動かします。
ここからは上記と異なり、EC2インスタンス状ではなく、手元で動かします。
下記記事を参考にしてschemaspy/schemaspyから最新のものをzipで落としてきます。
私はdockerで動かしたので下記のコマンドを叩きました。
docker run -v "$PWD/schema:/output" --net="host" schemaspy/schemaspy:snapshot \
-t mysql -host %EC2インスタンスのパブリックIP%:3306 -db isuconp -u schemaspy -p %password% -connprops useSSL\\=false -s isuconp
上記を叩いて
Public Key Retrieval is not allowed schemaspy
と出るようなら、 connprops
に allowPublicKeyRetrieval\\=false
を加えます。(もしかしたらtrueかも)
すると path/to/schemaspy-x.y.z/schema
に色々出来上がるので、その中のindex.htmlを見てみます。
open ./schemaspy-x.y.z/schema/index.html
やったぜ!
初期状態では下記の通りリレーションがないので、ER図もへったくれもありません。
DESC isuconp.posts;
+------------+-------------+------+-----+-------------------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+-------------------+-------------------+
| id | int | NO | PRI | NULL | auto_increment |
| user_id | int | NO | | NULL | |
| mime | varchar(64) | NO | | NULL | |
| imgdata | mediumblob | NO | | NULL | |
| body | text | NO | | NULL | |
| created_at | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+-------------+------+-----+-------------------+-------------------+
リレーションを追加してみましょう。
リレーションを追加する
再びEC2インスタンスに戻ります。
alter tableに時間がかかるので、ここではpostsにだけ外部キーを貼ります。
use isuconp;
ALTER TABLE posts ADD FOREIGN KEY (user_id) REFERENCES users (id);
DESC posts;
+------------+-------------+------+-----+-------------------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+-------------------+-------------------+
| id | int | NO | PRI | NULL | auto_increment |
| user_id | int | NO | MUL | NULL | |
| mime | varchar(64) | NO | | NULL | |
| imgdata | mediumblob | NO | | NULL | |
| body | text | NO | | NULL | |
| created_at | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+-------------+------+-----+-------------------+-------------------+
再びschemaspy
手元に戻って再びschemaspyを動かします。
docker run -v "$PWD/schema:/output" --net="host" schemaspy/schemaspy:snapshot \
-t mysql -host %EC2インスタンスのパブリックIP%:3306 -db isuconp -u schemaspy -p %password% -connprops allowPublicKeyRetrieval\\=false useSSL\\=false -s isuconp
index.htmlをみます。
open ./schemaspy-x.y.z/schema/index.html
user_idに外部キーが載ってる!
Foooooooo!! 勝ち!!
おわりに
schemaspyでDB仕様書をいい感じに生成できました!
あとはschem配下をgh-pagesかなにかに公開すればみんなで確認できます。私はgh-pagesを使ってデプロイしました。
そしてAWSリソースはお金がどんどん飛んでいくのでちゃんと後片付けをしましょう。
読んでいただきありがとうございました。