如何使用Python连接AWS RDS MySql数据库

Ker*_*ger 9 mysql amazon-web-services amazon-rds python-3.x pymysql

我目前正在尝试使用 PyMySQL 库通过 python 程序连接到在 AWS 上创建的 MySql 数据库

# !/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]))

Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,出现以下错误:

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)")
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我给函数的参数是正确的。难道是MySql驱动的问题?

Mar*_*cin 8

如果您想通过互联网从 AWS 外部访问 RDS,则应将其设置为公开可用

在此输入图像描述

此外,它还应该放置在公共子网(例如默认 VPC)中,并在其安全组中打开入站规则(好的做法限制仅访问选定的 IP 或 IP 范围,而不是使用0.0.0.0/0):

在此输入图像描述

希望这可以帮助。


Chr*_*ams 4

此请求超时,这表明您由于防火墙规则而无法连接。

如果您在 EC2 实例或容器上运行此程序,则:

  • 确保 RDS 实例配置为允许使用其安全组在端口 3306 上对实例/容器的子网范围进行入站访问。

如果您在外部运行此程序,那么您将需要:

  • 通过 VPN 连接到您的 VPC 并更新 RDS 的安全组以将您的本地 CIDR 范围列入白名单
  • 如果您无法使用 VPN,则需要创建 RDS,以便通过安全组将您的公共 IP 地址的入站访问列入白名单来公开访问。

如果您使用 Lambda,则应执行以下操作:

  • 将您的 Lambda 迁移到 VPC,为其附加一个安全组以允许出站访问(默认情况下,它应允许对所有内容进行出站访问)。它应该位于私有子网中
  • 更新 RDS 数据库的安全组,以允许端口 3306 上对 LAmbda 子网或附加到 Lambda 的安全组的入站访问。

有关在 VPC 内配置 Lambda 的更多信息,请参阅本文档