Tengo una instancia de base de datos de Amazon Relational Database Service (Amazon RDS) a la que no se puede acceder públicamente. Quiero conectarme a ella desde mi máquina Linux o macOS.
Descripción corta
Para conectarte a una instancia de base de datos privada de Amazon RDS o Amazon Aurora, se recomienda utilizar una VPN o AWS Direct Connect. Si no puedes usar una VPN ni AWS Direct Connect, puedes usar un host bastión en su lugar. También puedes usar este método desde una máquina Linux o macOS para conectarte a Amazon Aurora sin servidor y Amazon RDS Proxy desde fuera de la nube virtual privada (VPC) de la instancia.
Resolución
Para usar un host bastión para conectarte a tu instancia de base de datos de Amazon RDS desde una máquina Linux o macOS, sigue estos pasos:
-
Configura la instancia de base de datos de Amazon RDS como privada. Para ello, modifica la instancia de base de datos con los siguientes parámetros:
Establece el parámetro publicly accessible en no y utiliza subredes privadas.
No utilices Internet gateway - igw en tus tablas de enrutamiento.
Establece el grupo de seguridad para permitir el acceso a la base de datos por los puertos 5432 y 3306 desde todas las direcciones IP.
-
Inicia la instancia de EC2 más pequeña disponible en la misma VPC que la instancia de base de datos:
Utiliza Internet gateway - igw en tus tablas de enrutamiento. Este valor abre tu instancia de Amazon Elastic Compute Cloud (Amazon EC2) a Internet cuando está en una subred pública.
Configura el grupo de seguridad para que permita la dirección IP de la máquina Linux o macOS desde la que deseas conectarte.
-
Para crear un túnel de conectividad, ejecuta el siguiente comando desde tu máquina Linux o 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
Al ejecutar este comando para la tunelización SSH, configura los siguientes ajustes con estos valores:
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 5432:RDS_Instance_Endpoint:5432 ec2-user@EC2-Instance_Endpoint -v
Example command:
ssh -i "private.pem" -f -N -L
5432:pg115.xxxx.us-east-2.rds.amazonaws.com:5432
ec2-user@ec2-xxxx-xxx9.us-east-2.compute.amazonaws.com -v
-
Ahora puedes conectarte a la instancia de base de datos desde tu máquina local. El siguiente comando de ejemplo se conecta a PostgreSQL, pero puedes usar este mismo método para conectarte a MySQL o a cualquier otro motor:
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 who wants 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
Nota: Si usas la palabra clave localhost cuando te conectas a la instancia de base de datos, MySQL intentará usar el socket para conectarse. Asegúrate de usar el nombre de host 127.0.0.1 para acceder a una instancia de base de datos MySQL. Para obtener más información, consulta Can't connect to [local] MySQL server (No se puede conectar al servidor MySQL\ [local]) en el sitio web de MySQL.
Información relacionada
Linux bastion hosts on AWS (Hosts bastión de Linux en AWS)
How can I connect to a private Amazon RDS DB instance from a local machine using an Amazon EC2 instance as a bastion host? (¿Cómo puedo conectarme a una instancia de base de datos privada de Amazon RDS desde un equipo local con una instancia de Amazon EC2 que actúe como un host bastión?)