localhostのDockerから、LightsailのMariaDBに接続する

localhostのDockerから、LightsailのMariaDBに接続する AWS

Dockerで開発環境を作る場合、DBもDocker内に作るのが楽ですが、外部のDBに接続したかったので、試してみました。

SSHポートフォワーディングを使用して、Dockerコンテナ内からLightsailのMariaDBに接続します。

ローカルPCのDBクライアントから、SSHトンネル経由で接続する、なんてのはよくありますが、それをアプリから接続できるようにします。

MariaDBの接続許可を設定

Lightsail内のMariaDBは、localhost(Lightsail内)からしか接続できません。
外部からMariaDBに接続できるように、許可設定をします。

vi /opt/bitnami/mariadb/conf/my.cnf

デフォルトではMariaDBへの接続がローカルホストにバインドされるので、コメントアウトします。

#bind_address=127.0.0.1

MariaDBを再起動します。

sudo /opt/bitnami/ctlscript.sh restart mariadb

Lightsailのファイアウォール設定

Lightsailのファイアウォール設定を追加します。
デフォルトでは以下のようになっています。

3306ポートへの接続を許可します。
IPアドレスが指定できるので、特定のIPからのみ接続できるようにしておきます。

SSHポートフォワーディングの実施

ローカルPC(ホスト)で、SSHポートフォワーディングを実行します。

ssh -i [鍵ファイルのパス] -N -L 3307:localhost:3306 [SSHで接続するユーザー名]@[接続先LightsailのIP]

この「localhost:3306」というのは、Lightsailから見たMariaDBのホスト名とポートです。
Lightsail内にMariaDBがあるので、localhostで指定します。

コンテナ内からDB接続できるか確認

予め、DBクライアントを入れておきます。

apt-get -y install mariadb-client

コマンド実行時、ホスト名に「host.docker.internal」を指定することで、コンテナ内からホストへアクセスすることができます。
ホストの3307ポートに接続すると、上記の通りポートフォワーディングされて、Lightsailに接続するという流れです。

mysql -u jravan -P 3307 -h host.docker.internal -p

接続が確認できれば、後は同じ接続情報で、アプリから接続します。
Laravelの場合は、envファイルのDB接続情報を以下のようにします。

DB_HOST_JRAVAN=host.docker.internal
DB_PORT_JRAVAN=3307
DB_DATABASE_JRAVAN=[データベース名]
DB_USERNAME_JRAVAN=[ユーザー名]
DB_PASSWORD_JRAVAN=[パスワード]

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