Python Thrift RPC 在 EC2 上无法工作

1 投票
1 回答
930 浏览
提问于 2025-04-17 02:42

我正在尝试使用Thrift创建一个简单的客户端/服务器应用程序,这个应用程序将运行在EC2上。

我创建的示例在本地运行得非常好,但当我尝试在EC2上通过两台不同的机器进行RPC调用时(这两台机器都有各自分配的弹性IP地址),就出现了以下错误:

raceback (most recent call last):
  File "SocialQClient.py", line 25, in <module>
    transport.open()
  File "/usr/local/lib/python2.6/dist-packages/thrift/transport/TTransport.py", line 150, in open
    return self.__trans.open()
  File "/usr/local/lib/python2.6/dist-packages/thrift/transport/TSocket.py", line 90, in open
    raise TTransportException(type=TTransportException.NOT_OPEN, message=message)
thrift.transport.TTransport.TTransportException: Could not connect to <MY-ELASTIC-IP>:9090

我已经在两台机器上将安全组设置为允许0.0.0.0/0的TCP协议访问9090端口。我也尝试过UDP,但没有解决问题。我到底哪里出错了呢?

更新:

1 个回答

4

我猜测,当你的一个EC2实例(“node1”)尝试向另一个EC2实例(“node2”)发起RPC调用时,node2返回的是它的内部IP地址。

参考链接 - http://alestic.com/2009/06/ec2-elastic-ip-internal

引用:

这个最后的选项使用了亚马逊EC2实现的弹性IP地址系统中的一个鲜为人知的功能:

当一个EC2实例查询弹性IP的外部DNS名称时,EC2的DNS服务器会返回当前分配给该弹性IP的实例的内部IP地址。

这里有一些例子,说明了在不同情况下,使用dig命令返回的值是如何不同的:比如用外部机器去ping一个EC2实例,和用一个EC2实例去ping另一个EC2实例的对比:

这是该弹性IP地址的永久外部DNS名称,无论你将其分配给哪个实例,这个名称都不会改变。如果你从EC2外部查询这个DNS名称,它会解析为上面显示的外部IP地址:

$ dig +short ec2-75-101-137-243.compute-1.amazonaws.com
75.101.137.243

然而,如果你从一个EC2实例内部查询这个DNS名称,它会解析为当前分配给该弹性IP的实例的内部IP地址:

$ dig +short ec2-75-101-137-243.compute-1.amazonaws.com
10.254.171.132

撰写回答