无法在 AWS 上的 EC2 与 Python 中的 SSHTunnelForwarder 之间进行连接
Posted
技术标签:
【中文标题】无法在 AWS 上的 EC2 与 Python 中的 SSHTunnelForwarder 之间进行连接【英文标题】:Unable to connect between EC2 on AWS with SSHTunnelForwarder in Python 【发布时间】:2020-12-29 13:54:56 【问题描述】:前提
我正在使用两个 AWS 账户构建 EC2。我们称一个 A 和另一个 B。 RDS也是内置在B中的,目的是从A启动Python,以B为垫脚石连接RDS。
在每个入站规则和出站规则中,端口号 22 和 3306、443 和 80 都设置为 0.0.0.0/0。问题消失后我会解决的。
源代码
import mysql.connector
from sshtunnel import SSHTunnelForwarder
try:
sshtunnel.SSH_TIMEOUT = 10.0
with sshtunnel.SSHTunnelForwarder(
('IP address of B', 22),
ssh_host_key=None,
ssh_username='ec2-user',
ssh_password=None,
ssh_pkey='./XXXXXXXXX.pem',
remote_bind_address=('RDS address of B', 3306),
local_bind_address=('0.0.0.0', 3306)
) as tunnel:
conn = mysql.connector.connect(
host='127.0.0.1',
port=3306,
user='admin',
db='XXXXXX',
passwd='XXXXXX',
charset="utf8"
)
c = conn.cursor()
print(c)
c.execute("SELECT * FROM XXXXXX ORDER BY Rand() LIMIT 50")
except Exception as e:
print(e)
错误信息
Could not establish connection from ('IP address of B', 3306) to remote side of the tunnel
我尝试了什么
把对应源码的host=
改成A的IP地址,还是出现同样的错误。
我把remote_bind_address=
和local_bind_address=
的端口号划分为3306和3305,并根据local_bind_address设置port=
,但是没有用。
我使用 B 作为此来源的垫脚石,确认了从本地 PC 到 RDS 的连接。
最后,我觉得英文不好,看不懂,谢谢大家的阅读。
【问题讨论】:
在 Acc A 和 B 之间使用 VPC 对等不是更容易吗? VPC 对等互连更好吗?客户的要求就是我现在问的方法,所以我就这样处理。 很公平。您可以使用ssh
命令行程序手动设置ssh 隧道,而无需Python?通过这种方式,您可以确定问题是否特定于 Python。
ssh -f -i AAAA.pem -N -L 3306:AAAAAA.ap-northeast-1.rds.amazonaws.com:3306 -p 22 ec2-user@A.A.A.A
我已经用这个命令建立了隧道连接。另外,我可以用 mysql 确认到 RDS 的连接。
在 MySQL 连接中,您必须使用 port = tunnel.local_bind_port
而不是 port = 3306
。
【参考方案1】:
唯一缺少的部分是调整 MySQL 连接中的端口,如下所示。
import mysql.connector
from sshtunnel import SSHTunnelForwarder
try:
sshtunnel.SSH_TIMEOUT = 10.0
with sshtunnel.SSHTunnelForwarder(
('ec2-**-**-***-***.eu-central-1.compute.amazonaws.com', 22),
ssh_host_key=None,
ssh_username='ubuntu',
ssh_password=None,
ssh_pkey='./XXXXXXXXX.pem',
remote_bind_address=('127.0.0.1', 3306)
) as tunnel:
conn = mysql.connector.connect(
host='127.0.0.1',
port=tunnel.local_bind_port,
user='admin',
db='XXXXXX',
passwd='XXXXXX',
charset="utf8"
)
c = conn.cursor()
print(c)
c.execute("SELECT * FROM XXXXXX ORDER BY Rand() LIMIT 50")
except Exception as e:
print(e)
【讨论】:
以上是关于无法在 AWS 上的 EC2 与 Python 中的 SSHTunnelForwarder 之间进行连接的主要内容,如果未能解决你的问题,请参考以下文章
无法从 S3 读取 csv 到 AWS 上 EC2 实例上的 pyspark 数据帧
如何处理我的 AWS EC2 实例上的多个 Python 请求?
ClientConnectorCertificateError:无法连接到主机 discordapp.com:443,AWS 上的认证错误。(ec2)