使用boto从Google App Engine连接到Route53 API

时间:2014-02-04 15:31:36

标签: python google-app-engine boto amazon-route53

我收到以下消息:

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时,似乎存在问题。

2 个答案:

答案 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上开箱即用。