无法在 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)

AWS EC2 上的 Apache VirtualHosts 无法正常工作

EC2 AWS 上的烧瓶

从本地机器上的 ubuntu (AWS EC2) 读取文件?