web-dev-qa-db-fra.com

Comment utilisez-vous un proxy HTTP / HTTPS avec boto3?

Sur l'ancienne bibliothèque boto, il était assez simple d'utiliser les proxy, proxy_port, proxy_user et proxy_pass paramètres lorsque vous ouvrez une connexion. Cependant, je n'ai trouvé aucun moyen équivalent de définir par programme les paramètres de proxy sur boto3. :(

16
asieira

Depuis au moins la version 1.5.79, botocore accepte un argument proxies dans la configuration botocore.

par exemple.

import boto3
from botocore.config import Config

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

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

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

16
cblakkan

Si votre serveur proxy utilisateur n'a pas de mot de passe, essayez comme ci-dessous

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

si votre serveur proxy utilisateur a un mot de passe, essayez comme ci-dessous

import os
os.environ["HTTP_PROXY"] = "http://user:[email protected]:port"
os.environ["HTTPS_PROXY"] = "https://user:[email protected]:port"
10
user881703

Outre la modification de la variable d'environnement, je présenterai ce que j'ai trouvé dans le code.

Puisque boto3 utilise botocore, j'ai jeté un œil au code source:

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

De ce lien, on se retrouve à:

    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)

... qui est appelée par proxies = self._get_proxies(final_endpoint_url) dans la classe EndpointCreator.

Pour faire court, si vous utilisez python2, il utilisera la méthode getproxies d'urllib2 et si vous utilisez python3, il utilisera urllib3.

get_environ_proxies Attend un dict contenant {'http:' 'url'} (Et je suppose que https aussi).

Vous pouvez toujours patch le code, mais c'est une mauvaise pratique.

1
Mani

C'est l'une des rares occasions où je recommanderais le patch de singe, au moins jusqu'à ce que les développeurs Boto autorisent les paramètres de proxy spécifiques à la connexion:

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
someben