【问题标题】:AppEngine: connect with boto to AWS cloud end-point with SSL enabledAppEngine:使用 boto 连接到启用 SSL 的 AWS 云端点
【发布时间】:2017-10-16 20:43:11
【问题描述】:

我正在尝试通过 Python boto 库从 AppEngine 标准环境(或 dev_server)调用 AWS 端点。

这是一个例子:

import boto.sqs
sqs = boto.sqs.connect_to_region(constants.AWS_REGION,  
                                 aws_access_key_id = constants.AWS_KEY,
                                 aws_secret_access_key = constants.AWS_SECRET,
                                 is_secure = 1) # <- this option makes the difference!
queue = sqs.create_queue("my-new-queue")

此代码在我的本地控制台上运行良好,但当我尝试从 AppEngine 执行相同操作时,我会看到以下错误堆栈:

File "C:\Work\xxx\app\lib\boto\connection.py", line 1192, in get_object
  response = self.make_request(action, params, path, verb)
File "C:\Work\xxx\app\lib\boto\connection.py", line 1116, in make_request
  return self._mexe(http_request)
File "C:\Work\xxx\app\lib\boto\connection.py", line 1030, in _mexe
  raise ex
error: [Errno 13] Permission denied

这是我已经尝试过但没有成功的方法:

  • 使用boto3 代替boto
  • 通过环境变量GAE_USE_SOCKETS_HTTPLIB禁用urlfetch
  • 关闭is_secure。嗯,这有帮助,但仅限于某些端点。例如,STS 会拒绝大多数不安全的呼叫。

欢迎提出任何想法。

【问题讨论】:

  • 在启用urlfetch 的情况下,错误消息是不同的:Unable to fetch URL: http://sts.amazonaws.com/ Error: [Errno 10061] No connection could be made because the target machine actively refused it

标签: python amazon-web-services ssl boto google-app-engine-python


【解决方案1】:

对于这个问题,我发现最简单的解决方法是:

from boto.https_connection import CertValidatingHTTPSConnection
CertValidatingHTTPSConnection._protocol = "https"

此 hack 使 boto 的实现与基于 urlfetchgoogle.appengine.dist27.gae_override.httplib.HTTPConnection 兼容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    相关资源
    最近更新 更多