我收到以下消息:
2014-02-04 09:55:10.515 encountered error exception, reconnecting
2014-02-04 09:55:10.515 establishing HTTPS connection: host=route53.amazonaws.com, kwargs={'port': 443, 'timeout': 70}
它继续重试一段时间,然后我看到错误:
error: An error occured while connecting to the server: Unable to fetch URL: http://route53.amazonaws.com/2012-02-29/hostedzone Error: [Errno 61] Connection refused
这是使用python boto 2.24.0,我在本地使用SDK进行测试,并在GAE上部署。
我正在使用的代码中断:
zone = conn.get_zone("myzonename.com.")
这一定很简单。我试着回去使用旧版本的boto,看看它是否是一个回归,但没有这样的运气。 AWS凭证在app.yaml中定义为环境变量。 SSL库也启用了:
- name: ssl
version: latest
如果我在不使用App Engine SDK的情况下直接在Python中运行代码,一切正常。但是,当HTTP请求通过URLFetch API时,似乎存在问题。
答案 0 :(得分:1)
这似乎与谷歌的httplib在“google / appengine / dist27 / gae_override”中有关。请注意,它表示无法连接到 http ://route53.amazonaws.com。
Google的HTTPConnection类将_protocol定义为“http”,并将在getresponse()中使用它,除非_url以协议开头。在我的测试中,_url只是主机之后的路径,因此Google的httplib使用HTTP而不是HTTPS,而亚马逊拒绝使用。数据包跟踪证实了这一点。
如何让它与Google的httplib一起使用仍然存在问题。我会更新这个,因为我了解更多,但这至少是一个开始。
编辑:请求除了adapters.py/HTTPAdapter/request_url中的路径之外的所有内容,除非使用代理,否则我们应该使用它。我不知道为什么会这样,但我不熟悉请求。 (编辑:哦,因为它在HTTP请求中.Der。)
编辑2 :(一旦我弄清楚这一点就会清理它。现在意识流。)连接正在创建为HTTPSConnection,但由于某种原因_protocol保持设置为“http”。
编辑3:在Requests的connection.py中,HTTPSConnection继承自HTTPConnection,后者继承自Google的HTTPConnection。从未使用过谷歌httplib的HTTPSConnection。
编辑4:Python的标准httplib使用self.connect()来定义self.sock(),它用于将数据发送到服务器。请求会在其连接类中覆盖这些方法。 Google的httplib使用urlfetch在getresponse()中发送实际数据。这似乎使它与Requests的工作方式根本不兼容。
不确定如何解决这个问题。 Request的HTTPSConnection类中有多重继承?手动设置_protocol以使用GAE?没有什么特别漂亮的想法。
答案 1 :(得分:1)
我可以通过编辑boto / connection.py
来让它工作在connection.py更改的第909行:
connection.request(request.method, request.path,
到
connection.request(request.method, "https://route53.amazonaws.com" + request.path,
这不是一个很好的解决方案。我希望boto的好心人会注意到这一点并找到一种方法来正确修复它,以便它在GAE上开箱即用。