概要
- ローカルPCのDocker環境からRDSに接続する方法のメモ
- Dockerの開発では、DBのコンテナイメージを作成する場合が多いと思われるが、何かしらの理由でAWSのRDSを直接使用したい場合の方法
前提
- VPC環境を構築し、PrivateサブネットにEC2インスタンスおよび、Railsアプリケーションが接続する用のRDSを作成済
- Nat gateway もしくは Endpointにより サービス 「com.amazonaws.us-east-1.ssm 」に接続が可能なこと
- EC2インスタンスにssm-agentがインストールされている
- EC2インスタンスへは踏み台サーバ等使用せずにSSMにて接続を行う
ローカルPC環境
- Docker for mac
参考
- https://dev.classmethod.jp/articles/session-manager-launches-tunneling-support-for-ssh-and-scp/#toc-10
- https://blog.serverworks.co.jp/tech/2019/09/11/ssm-portfowarding/
- https://qiita.com/lighttiger2505/items/ea33291639a8656d50b4
- https://dev.classmethod.jp/articles/ssm-session-manager-private/
SSMの設定
- ssh config ファイルにSSM接続用の設定を追記する
config
Host EC2サーバのインスタンスID]
User [ECインスタンス接続ユーザ]
Port 22
ServerAliveInterval 300
IdentityFile ~/.ssh/id_rsa
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
- ssm ssmによるssh接続確認
$ ssh [EC2サーバのインスタンスID]
ポートフォワーディングによるRDSへの接続
- aws profileの設定
- ポートフォワーディングによるトンネル作成時に必要
$ aws configure --profile=ssm-test
- ssh-configに以下を設定
# SSH over Session Manager
host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile=ssm-test"
- トンネルの作成
ssh -i ~/.ssh/id_rsa [ECインスタンス接続ユーザ]@[EC2サーバのインスタンスID] -L 13306:[RDSのエンドポイント]:3306
- rdsへの接続確認を実行
mysql -u [DB接続ユーザ] -h 127.0.0.1 -P 13306 -p
Rails設定
database.ymlの設定
- ポート番号にRDSへのポートフォワーディング時に指定しポート番号(13306)を指定する
- hostに「docker.for.mac.localhost」を指定する
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: [RDS接続ユーザ]
password: [RDS接続パスワード]
host: docker.for.mac.localhost
port: 13306
以上の設定を行うことで、Dockerコンテナで起動するRailsアプリケーションから、RDSへの接続が可能になる。
SSM接続および、ポートフォワーディングに使用に際し、SGおよび、NACLのポート番号(22、13306)の解放等は特に不要。