Saltar al contenido

¿Cómo puedo conectarme a mi instancia de base de datos de Amazon RDS con un host bastión desde mi máquina Linux o macOS?

4 minutos de lectura
0

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:

  1. 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.

  2. 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.

  3. 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
  4. 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?)