Como posso me conectar à minha instância de banco de dados do Amazon RDS usando um bastion host a partir de uma máquina Linux/macOS?

4 minuto de leitura
0

Eu tenho uma instância de banco de dados do Amazon Relational Database Service (Amazon RDS) que não está acessível publicamente. Gostaria de me conectar a ela a partir de uma máquina Linux/macOS. Como posso me conectar à minha instância de banco de dados do RDS usando um bastion host?

Breve descrição

Para se conectar a uma instância de banco de dados privada do Amazon RDS ou do Amazon Aurora, é uma prática recomendada usar uma VPN ou o AWS Direct Connect. Se você não puder usar uma VPN ou o AWS Direct Connect, a opção preferida é usar um bastion host. Você também pode usar esse método para se conectar ao Aurora Sem Servidor e ao RDS Proxy de fora da VPC. Este exemplo mostra como configurar um bastion host para se conectar a uma instância de banco de dados do RDS a partir de uma máquina Linux/macOS, mesmo que a instância de banco de dados do RDS seja privada.

Resolução

1.    Defina a instância de banco de dados do Amazon RDS como privada modificando a instância de banco de dados. Defina o parâmetro acessível publicamente como não, com sub-redes privadas (ou seja, sem gateway de Internet - igw nas tabelas de rotas). Configure o grupo de segurança para permitir o banco de dados nas portas (5432, 3306) de todos os IPs.

2.    Inicie a menor instância do EC2 disponível na mesma VPC da sua instância de banco de dados. Configure sua instância do Amazon Elastic Compute Cloud (Amazon EC2) para ser acessível pela Internet, com sub-redes públicas (ou seja, com gateway de Internet - igw nas tabelas de rotas). Configure o grupo de segurança para permitir o IP da máquina Linux/macOS a partir da qual você está tentando se conectar.

3.    Execute o comando a seguir na máquina Linux/macOS para criar um túnel para conectividade a partir da máquina:

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

Ao executar o comando acima (tunelamento SSH), você define as seguintes configurações:

  • 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.    Agora que o tunelamento SSH está pronto, você pode se conectar à sua instância de banco de dados a partir da sua máquina Linux/macOS local. O exemplo a seguir estabelece conexão com o PostgreSQL, mas você também pode usar esse método para se conectar ao MySQL ou a qualquer outro mecanismo ao qual queira se conectar.

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

Observação: o MySQL tentará se conectar usando o soquete se você usar a palavra-chave localhost ao se conectar à instância de banco de dados. Certifique-se de usar o nome de host 127.0.0.1 ao acessar uma instância de banco de dados MySQL. Para obter mais informações, consulte a documentação do MySQL para Não é possível se conectar ao servidor MySQL [local].


Informações relacionadas

Hosts bastion do Linux na AWS

Como posso me conectar a uma instância privada de banco de dados do Amazon RDS de uma máquina local usando uma instância do Amazon EC2 como bastion host?