Question:
I am currently trying to connect to my MySql database created on AWS with a python program using the library PyMySQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# !/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])) |
When I run the above code I get the following error:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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 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)") |
What am I doing wrong? The arguments I gave to the function are correct. Could it be a problem with the MySql driver?
Answer:
If you want to access your RDS from outside of AWS over internet, than it should be set to be publicly available:
Also it should be placed in a public subnet (e.g. default VPC) and have opened inbound rules in its security group (good practice is to limit access to only selected IPs or IP range, rather then using 0.0.0.0/0
):
Hope this helps.