Linux/macOS マシンから要塞ホストを使用して Amazon RDS DB インスタンスに接続するにはどうすればよいですか。

最終更新日: 2022 年 1 月 11 日

パブリックにアクセスできない 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 プロキシに接続することもできます。この例では、RDS DB インスタンスがプライベートであっても、Linux/macOS マシンから RDS DB インスタンスに接続するように要塞ホストを設定する方法を示します。

解決方法

1.    DB インスタンスを変更して、Amazon RDS DB インスタンスをプライベートに設定します。プライベートサブネットを使用して、パブリックにアクセス可能なパラメータを no に設定します (つまり、ルートテーブル内にインターネットゲートウェイ - igw はありません)。DB がすべての IP からポート (54323306) に許可されるようにセキュリティグループを設定します。

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: リモートアドレス 172.31.39.62:5432 に転送される LOCALHOST: 5432 へのローカル接続
  • debug1: 127.0.0.1 ポート 5432 でリッスンするローカル転送です。
  • debug1: チャネル 0: 新規 [ポートリスナー]
  • debug1: ።1 ポート 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 サーバーに接続できないの MySQL ドキュメントを参照してください。