【问题标题】:Connecting to Route53 API from Google App Engine using boto使用 boto 从 Google App Engine 连接到 Route53 API
【发布时间】:2014-02-11 00:07:49
【问题描述】:

我收到以下消息:

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

如果我直接在 Python 中运行代码而不使用 App Engine SDK,那么一切正常。但是当 HTTP 请求通过 URLFetch API 时,似乎出现了问题。

【问题讨论】:

  • 您的实例上是否有出口防火墙?从错误消息看来,它只是无法到达 route53 主机。
  • 是的,我知道它看起来确实是这样,但不幸的是,事实并非如此。这很容易解决。

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


【解决方案1】:

这似乎与“google/appengine/dist27/gae_override”中的 Google 的 httplib 有关。请注意,它说它无法连接到 http://route53.amazonaws.com。

Google 的 HTTPConnection 类将 _protocol 定义为“http”,并将在 getresponse() 中使用它,除非 _url 以协议开头。在我的测试中,_url 只是主机之后的路径,所以谷歌的 httplib 使用 HTTP 而不是 HTTPS,亚马逊拒绝了。数据包跟踪证实了这一点。

如何让它与 Google 的 httplib 一起工作的问题仍然存在。当我了解更多信息时,我会更新此内容,但这至少是一个开始。

编辑:请求会删除所有内容,除了 adapters.py/HTTPAdapter/request_url 中的路径,说这是我们应该使用的所有内容,除非使用代理。我不知道为什么会这样,但我不熟悉请求。 (编辑:哦,因为它在 HTTP 请求中。Der。)

编辑 2:(一旦我弄清楚了就会清理它。现在意识流。)连接被创建为 HTTPSConnection,但由于某种原因 _protocol 保持设置为“http”。

编辑 3:在 Requests 的 connection.py 中,HTTPSConnection 继承自 HTTPConnection,而 HTTPConnection 继承自 Google 的 HTTPConnection。 Google 的 httplib 中的 HTTPSConnection 从未使用过。

编辑 4:Python 的标准 httplib 使用 self.connect() 来定义 self.sock(),这是它用来向服务器发送数据的方法。 Requests 在其连接类中覆盖这些方法。 Google 的 httplib 使用 urlfetch 在 getresponse() 中发送实际数据。这似乎使它与 Requests 的工作方式根本不兼容。

不知道如何解决这个问题。 Request 的 HTTPSConnection 类中的多重继承?手动设置 _protocol 以使用 GAE?没有什么特别好看的。

【讨论】:

  • 感谢您深入研究。我最终手动有点强迫它工作。请参阅我添加的答案。
  • 请求明确不支持 GAE。哎呀。
【解决方案2】:

我可以通过编辑 boto/connection.py 来让它工作

在connection.py中的第909行更改:

connection.request(request.method, request.path,

connection.request(request.method, "https://route53.amazonaws.com" + request.path,

这不是一个很好的解决方案。我希望 boto 的好心人会注意到这一点并找到正确修复它的方法,以便它在 GAE 上开箱即用。

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 2015-09-15
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多