XFeeのデータベースは外部からアクセスできません

プログラミング

Googleレンズと連携したレシート管理のプロトタイプ(3)」で紹介したように、レシートデータをローカルのMySQLデータベースに保存しました。

今回、ローカルのMySQLサーバーに保存したのですが、これをパブリックなネットワークにあるデータベースに変更しようと思いました。
私はXFree(無料レンタルサーバー)のアカウントを持っているので、レンタルサーバーのMySQLサーバーに変更する試みをしました。
なお、動作するプログラムは、サーバーサイドプログラムではなく、ローカルパソコンで動くPythonプログラムからデータベースに接続しようという試みです。

結論からいうと、それはできないようです。

Googleレンズと連携したレシート管理のプロトタイプ(2)のサンプルコードのホストをMySQLサーバーのIPアドレスまたはURLに変更し、userとpasswordはMySQLサーバー側で設定したものに変更し、databaseもサーバー側で作成したものに変更しました。

#
# データベース接続情報を設定
#
db_config = {
    "host": "■■■.■■■.■■■.■■■",
    "user": "sampleuser",
    "password": "samplepass",
    "database": "sampledb"
}

変更後、実行すると次のエラーになりました。

Error: ‘2003 (HY000): Can’t connect to MySQL server on ‘■■■.■■■.■■■.■■■:3306′ (10060)’

コマンドラインから次のように入力して実行しても同じエラーになりました。
mysql -h ■■■.■■■.■■■.■■■ -u sampleuser -p -P 3306 sampledb;

ホスト名、ユーザー名、データベース名は正しく設定されています。
私の方はクライアントになる訳ですが、ブロックをかけるような設定はしていません。

原因をいろいろ調べた結果、これが原因だろうというものがありました。(おそらく)

原因は、MySQLデータベースサーバーへの接続を許可するIPアドレスがプライベートアドレスになっているため、と思われます。

どのIPアドレスをMySQLサーバーに接続を許可するかという設定はmy.cnfファイルにあります。
Linuxの場合、 /etc/my.cnfまたは/etc/mysql/my.cnfにあります。
(Windows: C:\ProgramData\MySQL\MySQL Server 5.7\my.ini12)

この設定がXFreeの場合、以下のようになっています。(なっているハズ)

[mysqld]
bind-address = 127.0.0.1
または、
[mysqld]
bind-address = localhost

この設定は、XFreeのMySQLサーバーへの接続は、ローカル(=サーバー自身)からしかアクセスができないというものです。
127.0.0.1やlocalhostは、ループバックアドレスといって、NIC(ネットワークインターフェースカード)に到達した信号が折り返して自分自身に戻ってくるという、特殊なアドレスです。
つまり、自分自身としか通信できないアドレスです。

外部のネットワークからMySQLサーバーにアクセスするためには、設定を次のように変更する必要があります。
[mysqld]
bind-address = 0.0.0.0

しかし、my.cnfの設定は、管理者権限が必要で、XFreeの利用者には権限が与えられていません。
つまり、私には設定を変更する権限がありません。

したがって、
「ローカルパソコン上で動作するプログラムは、レンタルサーバーのMySQLに接続はできない」
とう結論です。

この問題を解決するためにはサーバーサイドで動作するプログラムにする必要があります。

セキュリティ上、この結論は当然と言えるでしょう。
ただ、今回の「Googleレンズと連携したレシート管理」プログラムをサーバーサイドプログラムにするのは躊躇してしまいます。
とりあえずレシートデータをデータベースに登録して、その後にゆっくりとSQLを使ってデータ分析をするという使い方を想定しています。
レシートデータの入力が簡単にできて、データベースに登録できれば良いので、スタンドアローン型のプログラムとしてレシート管理プログラムを作っていくことになりそうです。

タイトルとURLをコピーしました