Comment me connecter à mon instance de base de données Amazon RDS à l'aide d'un hôte bastion depuis ma machine Linux/macOS ?

Date de la dernière mise à jour : 23/09/2020

Je dispose d'une instance de base de données Amazon Relational Database Service (Amazon RDS) qui n'est pas accessible publiquement. Je voudrais me connecter à partir de ma machine Linux/macOS. Comment me connecter à mon instance DB RDS en utilisant un hôte bastion ?

Brève description

Pour vous connecter à une instance de base de données Amazon RDS ou Amazon Aurora privée, il est préférable d'utiliser VPN ou AWS Direct Connect. Si vous ne pouvez pas utiliser un VPN ou AWS Direct Connect, il est préférable d'utiliser l'option préférée est d'utiliser un hôte bastion. Vous pouvez également utiliser cette méthode pour vous connecter à Aurora Serverless et RDS Proxy à l'extérieur du VPC. Cet exemple montre comment configurer un hôte bastion pour se connecter à votre instance de base de données RDS à partir d'une machine Linux/macOS, même si l'instance de base de données RDS est privée.

Solution

1.  Indiquez que votre instance de base de données Amazon RDS est privée en la modifiant. Affectez au paramètre publicly accessible (accessible au public ) la valeur no (non), avec des sous-réseaux privés (c'est-à-dire pas de passerelle Internet - igw dans les tables de routage). Définissez le groupe de sécurité pour autoriser la base de données sur le port (5432, 3306) à partir de toutes les adresses IP.

2.  Lancez la plus petite instance EC2 disponible dans le même VPC que votre instance de base de données. Définissez votre instance Amazon Elastic Compute Cloud (Amazon EC2) pour qu'elle soit accessible à partir d'Internet, avec des sous-réseaux publics (c'est-à-dire qu'elle a une passerelle Internet - igw dans les tables de routage). Définissez le groupe de sécurité pour autoriser l'adresse IP de la machine Linux/macOS à partir de laquelle vous essayez de vous connecter.

3.  Exécutez la commande suivante à partir de votre machine Linux/macOS pour créer un tunnel pour la connectivité à partir de votre machine :

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

Lorsque vous exécutez la commande ci-dessus (tunnel SSH), vous définissez les paramètres suivants :

  • debug1 : Connexions locales à LOCALHOST:5432 transféré à l'adresse distante 172.31.39.62:5432
  • debug1 : écoute de transfert local sur 127.0.0.1 port 5432.
  • debug1 : canal 0 : nouveau [écouteur de port]
  • debug1 : transfert local écoute sur ::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. Maintenant que le tunneling SSH est en place, vous pouvez vous connecter à votre instance de base de données à partir de votre machine Linux/macOS locale. L'exemple suivant permet de se connecter à PostgreSQL, mais vous pouvez également utiliser cette méthode pour vous connecter à MySQL ou à un autre moteur.
Syntax -

psql -hlocalhost -Upostgres -p -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  

Remarque : MySQL essaie de se connecter à l'aide du socket si vous utilisez le mot-clé localhost lors de la connexion à une instance de base de données. Veillez à utiliser le nom d'hôte 127.0.0.1 lors de l'accès à une instance de base de données MySQL. Pour plus d'informations, consultez la documentation MySQL Connexion impossible au serveur MySQL [local].