Actualmente estoy tratando de conectarme a mi base de datos MySql creada en AWS con un programa python usando la biblioteca PyMySQL
# !/usr/bin/env python # -*- coding: utf-8 -*- import pymysql host = 'admin.cjp8hsqu4je0.us-east-2.rds.amazonaws.com' user = 'admin' password = '12345678' database = 'admin' connection = pymysql.connect(host, user, password, database) with connection: cur = connection.cursor() cur.execute("SELECT VERSION()") version = cur.fetchone() print("Database version: {} ".format(version[0]))Cuando ejecuto el código anterior me sale el siguiente error:
Traceback (most recent call last): File "C:\Users\SuperPC\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymysql\connections.py", line 581, in connect sock = socket.create_connection( File "C:\Users\SuperPC\AppData\Local\Programs\Python\Python38-32\lib\socket.py", line 808, in create_connection raise err File "C:\Users\SuperPC\AppData\Local\Programs\Python\Python38-32\lib\socket.py", line 796, in create_connection sock.connect(sa) socket.timeout: timed out During handling of the above exception, another exception occurred: Traceback (most recent call last): File "bot.py", line 10, in <module> connection = pymysql.connect(host, user, password, database) File "C:\Users\SuperPC\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymysql\__init__.py", line 94, in Connect return Connection(*args, **kwargs) File "C:\Users\SuperPC\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymysql\connections.py", line 325, in __init__ self.connect() File "C:\Users\SuperPC\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymysql\connections.py", line 630, in connect raise exc pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'admin.cjp8hsqu4je0.us-east-2.rds.amazonaws.com' (timed out)")¿Qué estoy haciendo mal? Los argumentos que le di a la función son correctos. ¿Podría ser un problema con el controlador MySql?
Si desea acceder a su RDS desde fuera de AWS a través de Internet, debe configurarse para que esté disponible públicamente :
También debe colocarse en una subred pública (p. ej., VPC predeterminada) y tener reglas de entrada abiertas en su grupo de seguridad ( una buena práctica es limitar el acceso solo a las IP seleccionadas o al rango de IP, en lugar de usar 0.0.0.0/0 ):
Espero que esto ayude.
Se agotó el tiempo de espera de esta solicitud, lo que indica que no puede conectarse debido a una regla de firewall.
Si está ejecutando esto en una instancia o contenedor EC2, entonces:
Si está ejecutando esto externamente, entonces necesitará:
Si está utilizando un Lambda, se debe hacer lo siguiente:
En este documento encontrará más información sobre la configuración de Lambda dentro de una VPC.
Finalmente llego a la solución definitiva:
Si tiene una instancia EC2 que está correctamente conectada a la instancia RDS, puede abrir un túnel ssh entre ellas y usar pymysql (biblioteca de python).
¡Aquí está el increíble código que salva el día! (Agregué un código y comentarios, pero puede obtener el código original usando el enlace a continuación) Enlace al github del salvador
En primer lugar, instale estas bibliotecas:
!pip instalar sshtunnel
!pip instalar PyMySQL
# Import libraries from sshtunnel import SSHTunnelForwarder import pymysql # SSH (ec2_public_dns, ec2_user, pem_path, remote_bind_address=(rds_instance_access_point, port)) with SSHTunnelForwarder(('ec2-52-202-194-76.public-ec2-instance.amazonaws.com'), ssh_username="ec2-user", ssh_pkey="~/ssh-tunnel-rds.pem", remote_bind_address=('private-rds-instance.ckfkidfytpr4.us-east-1.rds.amazonaws.com', 3306)) as tunnel: print("****SSH Tunnel Established****") db = pymysql.connect( host='127.0.0.1', user="rdsuser",password="rdspassword", port=tunnel.local_bind_port, database="dbName" ) # Run sample query in the database to validate connection try: # Print all the databases with db.cursor() as cur: # Print all the tables from the database cur.execute('SHOW TABLES FROM dbName') for r in cur: print(r) # Print all the data from the table cur.execute('SELECT * FROM table_name') for r in cur: print(r) finally: db.close() print("YAYY!!")