【问题标题】:How do you use an HTTP/HTTPS proxy with boto3?如何在 boto3 中使用 HTTP/HTTPS 代理?
【发布时间】:2016-02-02 11:35:59
【问题描述】:

在旧的boto 库上,在打开连接时使用proxyproxy_portproxy_userproxy_pass 参数非常简单。但是,我找不到任何等效的方式以编程方式在 boto3 上定义代理参数。 :(

【问题讨论】:

  • 目前,我不得不使用类似:import os ;os.environ["HTTP_PROXY"] = "http://yourproxy.com:1234"; os.environ["HTTPS_PROXY"] = "https://yourproxy1.com:1234"
  • 我没有在文档中找到任何关于这将起作用的信息。例如,在 boto 上使用 HTTPS_PROXY 将不起作用,只有 HTTP_PROXY
  • 无论如何,在 boto3 GitHub 存储库中打开了一个问题:github.com/boto/boto3/issues/338
  • 似乎开发人员认为设置环境是值得替代的(我不这样做)。
  • 他们现在已将此作为功能请求添加!

标签: proxy boto3


【解决方案1】:

至少从 1.5.79 版开始,botocore 接受 botocore 配置中的 proxies 参数。

例如

import boto3
from botocore.config import Config

boto3.resource('s3', config=Config(proxies={'https': 'foo.bar:3128'}))

boto3 资源 https://boto3.readthedocs.io/en/latest/reference/core/session.html#boto3.session.Session.resource

botocore 配置 https://botocore.readthedocs.io/en/stable/reference/config.html#botocore.config.Config

【讨论】:

  • 我正在使用 boto3==1.4.6,botocore==1.6.6,但这似乎对我不起作用。您能否提供一个将文件加载到存储桶或类似内容的完整示例?
  • 由于 AWS 对所有端点使用 HTTPS,请尝试以下配置:boto3.resource('s3', config=Config(proxies={'https': 'foo.bar:3128'}))(注意是 https
  • 我在使用 STS 时遇到了同样的问题。我已经将该配置放入客户端并且它有效,以防其他人需要:conn = boto3.client('sts', config=Config(proxies={'http': 'myproxy', 'https': 'myproxy'}))
【解决方案2】:

如果您的用户代理服务器没有密码 尝试以下方法:

import os
os.environ["HTTP_PROXY"] = "http://proxy.com:port"
os.environ["HTTPS_PROXY"] = "https://proxy.com:port"

如果您的用户代理服务器有密码 尝试以下方法:

import os
os.environ["HTTP_PROXY"] = "http://user:password@proxy.com:port"
os.environ["HTTPS_PROXY"] = "https://user:password@proxy.com:port"

【讨论】:

  • 尽管确保您正确地引用了您的环境值。这个答案在代理的开头缺少它们
  • 这可行,但更改环境变量很麻烦。如果在您的程序中您需要向其他服务器执行 http 请求,则此类请求将通过 s3 代理服务器进行路由,这不是您想要的。您可以通过在完成查询 s3 后将两个 env 变量恢复为其原始值来解决此问题,但我希望有更好的解决方案。
  • @albarji,这取决于您如何设计应用程序,这是将环境值与主应用程序隔离的基本原则。那么你可能有 s3_proxy.config, serverA_proxy.config
【解决方案3】:

除了更改环境变量,我将展示我在代码中找到的内容。

由于boto3使用了botocore,所以我看了一下源码:

https://github.com/boto/botocore/blob/66008c874ebfa9ee7530d944d274480347ac3432/botocore/endpoint.py#L265

从这个链接,我们最终到达:

    def _get_proxies(self, url):
        # We could also support getting proxies from a config file,
        # but for now proxy support is taken from the environment.
        return get_environ_proxies(url)

...由proxies = self._get_proxies(final_endpoint_url)EndpointCreator 类中调用。

长话短说,如果您使用的是 python2,它将使用来自 urllib2 的 getproxies 方法,如果您使用的是 python3,它将使用 urllib3。

get_environ_proxies 期待一个包含 {'http:' 'url'} 的字典(我猜也是 https)。

您总是可以patch 代码,但这是不好的做法。

【讨论】:

    【解决方案4】:

    这是我推荐猴子补丁的少数情况之一,至少在 Boto 开发人员允许连接特定的代理设置之前:

    import botocore.endpoint
    def _get_proxies(self, url):
        return {'http': 'http://someproxy:1234/', 'https': 'https://someproxy:1234/'}
    botocore.endpoint.EndpointCreator._get_proxies = _get_proxies
    import boto3
    

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2015-07-23
      • 2020-02-06
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      相关资源
      最近更新 更多