🦈

RDSにDockerのMySQLクライアントでSQLシェル(sh)実行

2022/03/10に公開

みなさんこんにちは

本日のお題

RDS(MySQL)にシェル(sh)で、SQLファイルを読み込ませて、様々なSQL文を実行しようという試みです。
これができないと、特定のタイミングでcron使ったりして、DATABASE作ったり、ゴミレコード消したりといった、自動運用のハードルが高くなります。
そのうち、NGINXとReact.jsとかで利用できたらいいなと考えています。

最初の確認

最初の確認として、当然、shを実行する予定のEC2からRDSに接続できるか確認します。

[root@meet ~]# docker run -it --rm mysql:8 mysql -hyukkurixxxxx.crtwqgsulcgh.ap-northeast-1.rds.amazonaws.com -uadmin -pEnter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.27 Source distribution

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

PASSWDの手入力なしてRDSにログインする

ログインできることはわかりましたが、これでは実行のたびにPASSWDの人力入力が必要で面倒です。

[root@meet ~]# docker run -it --rm mysql:8 mysql -hyukkurixxxxx.crtwqgsulcgh.ap-northeast-1.rds.amazonaws.com -uadmin -pPassword12345
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 8.0.27 Source distribution

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

PASSWDファイルの作成

ログインはできそうですが、Warningも出てますし、何とかしたいです。
そこで、PASSWDを書いたファイルを読み込ませて実行します。
PASSWDファイルは、念のため、隠しファイルにして、権限を最低限にしておきます。
この辺りは、気にしておくと、事故が減ると思います。

[root@meet ~]# mkdir /home/rds
[root@meet ~]# vi /home/rds/.rdspass
[client]
password="Password12345"

[root@meet ~]# chmod 400 /home/rds/.rdspass

PASSWDファイルを作ったので、実行してみる。

実行してみると、エラーになります。
これは、MySQLクライアントもdockerのコンテナなので、dockerホスト側に.rsdpassファイルを置いてもdockerゲスト側からは参照できない為、エラーになっています。

[root@meet ~]# docker run -it --rm mysql:8 mysql --defaults-extra-file=/home/rds/.rdspass -hyukkurixxxxx.crtwqgsulcgh.ap-northeast-1.rds.amazonaws.com -uadmin
mysql: [ERROR] Failed to open required defaults file: /home/rds/.rdspass
mysql: [ERROR] Fatal error in defaults handling. Program aborted!
[root@meet ~]#

DockerホストとDockerゲストのディレクトリを連結する

--mount type=bind,src=/home/rds,dst=/home を追加します。
/home/rdsはDockerホストOSのディレクトリで、.rdspassファイルを置いています。
/homeはDockerゲストOSのディレクトリで、.rdspassファイルがリンクされています。
--defaults-extra-file=/home/.rdspass は、DockerゲストOSのディレクトリで、.rdspassファイルを読み込ませます。

[root@meet ~]# docker run -it --rm --mount type=bind,src=/home/rds,dst=/home mysql:8 mysql --defaults-extra-file=/home/.rdspass -hyukkurixxxxx.crtwqgsulcgh.ap-northeast-1.rds.amazonaws.com -uadmin
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 8.0.27 Source distribution

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

PASSWD無しでつながりました。

任意のSQLファイルを実行する

PASSWD無しでログインができたら、MySQLクライアントに、任意のSQLを実行させたいです。

SQLファイルを作成する

[root@meet ~]# vi /home/rds/create.sql
CREATE DATABASE yukkuri;

SQLファイルを実行する

-e'source /home/create.sql' で、SQLファイルを読み込ませます。
PASSWDを書いたファイルと同様に、DockerホストOS上の/home/rds/create.sqlをDockerゲストOSから利用します。

[root@meet ~]# docker run -it --rm --mount type=bind,src=/home/rds,dst=/home mysql:8 mysql --defaults-extra-file=/home/.rdspass -hyukkurixxxxx.crtwqgsulcgh.ap-northeast-1.rds.amazonaws.com -uadmin -e'source /home/create.sql'
[root@meet ~]#

確認する

DATABASEを作ったので、実際に完成しているか確認する。

[root@meet ~]# docker run -it --rm --mount type=bind,src=/home/rds,dst=/home mysql:8 mysql --defaults-extra-file=/home/.rdspass -hyukkurixxxxx.crtwqgsulcgh.ap-northeast-1.rds.amazonaws.com -uadmin
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 27
Server version: 8.0.27 Source distribution

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| yukkuri            |
+--------------------+
5 rows in set (0.00 sec)

mysql>

出来ていました。
後は、作った、CLIをsh(シェル)に組み込んで、いろいろと利用すればよいです。

今回の課題

本業が多忙で、なかなか更新できないのでが課題でしょうか。
DXDX...

今後の予定

メインのプロジェクトでは、RDSは予算の関係から利用しない方針ですが、今回、RDSでやったらどうなるのか気になったもので調査してみました。
どちらかというと今後の覚書ですね。
個別に参考にしたWebサイトはあったのですが、私の欲しい情報がまとまったところはぱっと見発見できませんでしたので。

今回の所要時間

2時間くらい。MySQLは利用してきましたが、RDSや、Dockerと連携させるとなると、利用できるルートが限られるため多少の調査が必要でした。
なお、今回利用したRDSですが、あくまでも当記事記述のための作成なので、削除済みです。

Discussion