Laravel+Dockerから踏み台経由でRDSに接続する

Table of Contents

Table of Contents

RDSはEC2からしか接続できない設定になっているため、ローカル環境からRDSに接続したい場合は少し作業が必要です。
今回は、ローカル環境のDockerコンテナで動いているLaravelアプリから踏み台(EC2)経由でRDSに接続してみた方法を紹介します。

ローカル環境

  • macOS:10.15.7
  • Laravelアプリを稼働しているdockerコンテナを起動しています。
$ docker --version
Docker version 20.10.2, build 2291f61

$ docker-compose --version
docker-compose version 1.27.4, build 40524192

前提条件

  • EC2の踏み台サーバーを起動していて、ローカル環境から接続できる状態になっています。
  • AWS RDSを起動していて、踏み台からの接続が可能になっている状態になっています。

全体流れ

  1. SSHトンネルを作成する。
  2. ローカルマシーン(Mac)からやDockerコンテナからの接続を確認する。
  3. Laravelアプリから接続できるように.envファイルを修正する。

やってみる

SSHトンネル

まず、SSHトンネルを作成します

ssh -N -L 3333:[RDS endpoint]:[RDS port] -i [踏み台の秘密鍵] -p 22 [EC2のユーザー]@[EC2踏み台のIPアドレス]

今回は3333のポート番号をRDSと設定します。

作成したら、コマンドで確認します。

ローカルマシーンから接続確認

ローカルマシーンのターミナルで下記のコマンドを実行して確認します。

mysql -h 127.0.0.1 -u [USER NAME] -p -D [DATABASE NAME] -P 3333

Dockerコンテナから接続確認

Dockerコンテナに入って下記のコマンドを実行して確認します。
注意点としては、hostがhost.docker.internalであることです。

mysql -h host.docker.internal -u [USER NAME] -p -D [DATABASE NAME] -P 3333

LaravelアプリのDB設定の修正

次に、Laravelアプリの.envファイルを修正します。

DB_HOST=host.docker.internal
DB_PORT=3333
DB_DATABASE=[DATABASE NAME]
DB_USERNAME=[USER NAME]
DB_PASSWORD=[PASSWAORD]

最後、Laravel アプリで確認します。

サマリー

  • SSHトンネルでローカルと踏み台とRDSを連結します。
  • Dockerコンテナ内部ではhost.docker.internalを使って、ローカルマシーンとやり取りします。

これでやりたいことをできるようになりました。
ご紹介は以上です。