サブネットにパブリックアクセスできない Amazon Relational Database Service (Amazon RDS) DB インスタンスがあります。Linux/macOS マシンから接続したいと思います。踏み台ホストを使用して RDS DB インスタンスに接続する方法を教えてください。
簡単な説明
プライベート Amazon RDS インスタンスまたは Amazon Aurora DB インスタンスに接続するには、VPN または AWS Direct Connect を使用するのがベストプラクティスです。VPN または AWS Direct Connect のいずれも使用できない場合は、踏み台ホストを使用することをおすすめします。この方法を使用して、VPC の外部から Aurora Serverless と RDS Proxy に接続することもできます。この例は、RDS DB インスタンスがプライベートであっても Linux/macOS マシンから RDS DB インスタンスに接続できるように踏み台ホストをセットアップする方法を示すものです。
解決策
1. DB インスタンスを変更して Amazon RDS DB インスタンスをプライベートに設定します。プライベートサブネットでは、パブリックにアクセス可能なパラメーターを no に設定します (つまり、ルートテーブルにインターネットゲートウェイ - igw がない)。DB がすべての IP からポート (5432、3306) に許可されるようにセキュリティグループを設定します。
2. DB インスタンスと同じ VPC で、利用可能な最小 EC2 インスタンスを起動します。パブリックサブネットを使用してインターネットからアクセスできるように Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを設定します (つまり、ルートテーブルにインターネットゲートウェイ - igw がある)。接続元としての使用を試みている Linux/macOS マシンの IP を許可するようにセキュリティグループを設定します。
3. Linux/macOS マシンから次のコマンドを実行して、マシンからの接続用のトンネルを作成します。
Syntax 1:
ssh -i <identity_file> -f -l <bastion-host-username> -L
<local-port-you-connect-to>:<rds-endpoint>:<rds:listening-port>
<bastion-host-public-ip> -v
Example Command:
ssh -i "private_key.pem" -f -l ec2-user -L 5432:172.31.39.62:5432 3.133.141.189 -v
上記のコマンド (SSH トンネリング) を実行すると、次の設定が行われます。
- debug1: Local connections to LOCALHOST: 5432 forwarded to remote address 172.31.39.62:5432
- debug1: Local forwarding listening on 127.0.0.1 port 5432.
- debug1: channel 0: new [port listener]
- debug1: Local forwarding listening on ::1 port 5432.
Syntax 2:
ssh -i "Private_key.pem" -f -N -L 5433:RDS_Instance_Endpoint:5432 ec2-user@EC2-Instance_Endpoint -v
Example Command:
ssh -i "private.pem" -f -N -L
5433:pg115.xxxx.us-east-2.rds.amazonaws.com:5432
ec2-user@ec2-xxxx-xxx9.us-east-2.compute.amazonaws.com -v
4. 以上で、SSH トンネリングが設定されたので、ローカルの Linux/macOS マシンから DB インスタンスに接続できます。次の例では PostgreSQL に接続しますが、この方法で MySQL やその他のエンジンにも接続できます。
Syntax -
psql -hlocalhost -Upostgres -p<local-port-you-connect-to> -d postgres
-h = localhost
-U = the username present in the DB for connectivity
-p = 'local-port-you-connect-to' from the SSH Tunneling command
-d = Any DB, user wish to connect.
Example command -
a483e73d651f:.ssh rahul_saha$ psql -hlocalhost -Upostgres -p5432 -d postgres
Password for user postgres:
psql (12.1, server 11.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=> \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
rdsadmin | rdsadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | rdsadmin=CTc/rdsadmin
template0 | rdsadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/rdsadmin +
| | | | | rdsadmin=CTc/rdsadmin
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
$ psql -hlocalhost -Upostgres -p -d postgres
$ mysql -h127.0.0.1 -uroot -p
注: DB インスタンスへの接続時に localhost キーワード を使用すると、MySQL はソケットを使用して接続を試みます。MySQL DB インスタンスにアクセスするときは、必ずホスト名 127.0.0.1 を使用してください。詳細については、MySQL ドキュメンテーションの Can't connect to [local] MySQL server を参照してください。
関連情報
AWS での Linux 踏み台ホスト
Amazon EC2 インスタンスを踏み台ホストとして使用して、ローカルマシンからプライベート Amazon RDS DB インスタンスに接続する