你如何使用 boto3 的 HTTP/HTTPS 代理?

How do you use an HTTP/HTTPS proxy with boto3?

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

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

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"

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

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

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

从这个 link,我们最终在:

    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 class 中调用。

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

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

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

这是我推荐猴子补丁的罕见情况之一,至少在 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

从至少版本 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