2015-11-02 1 views
11

Sur la vieille bibliothèque boto était assez simple d'utiliser les paramètres proxy, proxy_port, proxy_user et proxy_pass lorsque vous ouvrez une connexion. Cependant, je n'ai pas trouvé de moyen équivalent de définir par programme les paramètres du proxy sur boto3. :(Comment utilisez-vous un proxy HTTP/HTTPS avec boto3?

+1

En ce moment, je vais avoir à utiliser quelque chose comme: 'import os; os.environ [ » HTTP_PROXY "] =" http://yourproxy.com:1234 "; os.environ ["HTTPS_PROXY"] = "https://yourproxy1.com:1234" ' – Mani

+0

Je n'ai trouvé aucune mention dans la documentation que cela fonctionnerait. Par exemple, sur boto en utilisant 'HTTPS_PROXY' ne fonctionnerait pas, seulement' HTTP_PROXY'. – asieira

+0

Quoi qu'il en soit, a ouvert un problème sur le dépôt GitoHub boto3: https://github.com/boto/boto3/issues/338 – asieira

Répondre

5

Comme d'au moins la version 5.1.79, botocore accepte un argument proxies dans la config botocore.

par exemple.

import boto3 
from botocore.config import Config 

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

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

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

+0

J'utilise boto3 == 1.4.6, botocore == 1.6.6, mais cela ne semble pas fonctionner pour moi. Pourriez-vous s'il vous plaît fournir un exemple complet de chargement d'un fichier dans un seau, ou quelque chose de similaire? – albarji

+0

Depuis AWS utilise HTTPS pour tous les points de terminaison, essayez cette configuration: 'boto3.resource ('s3', config = Config (proxies = {'https': 'foo.bar:3128'}))' (Notez que c'est http ** s **) – Brad

9

Si votre serveur proxy utilisateur n'a pas le mot de passe essayer 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 Mot de passe essayer comme ci-dessous

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

Bien que vous vous assurez d'inclure correctement les citations autour de vos valeurs envirion. Cette réponse les a manquantes au début du proxy – mightymephisto

+0

merci de signaler – user881703

+0

Cela fonctionne, mais changer une variable d'environnement est gênant. Si le long de votre programme vous devez effectuer une requête http vers un autre serveur, cette requête sera acheminée via le serveur proxy s3, ce qui n'est pas ce que vous voulez. Vous pouvez résoudre ce problème en restaurant les deux variables env à leurs valeurs d'origine après avoir fini d'interroger s3, mais j'aurais aimé qu'il y ait une meilleure solution. – albarji

1

En plus de modifier la variable d'environnement , Je vais présenter ce que j'ai trouvé dans le code

Depuis boto3 utilise botocore, j'ai jeté un oeil à travers le code source:

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

De ce lien, on finit à:

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é par proxies = self._get_proxies(final_endpoint_url) dans la classe EndpointCreator. En bref, si vous utilisez python2, il utilisera la méthode getproxies de urllib2 et si vous utilisez python3, il utilisera urllib3.

get_environ_proxies attend une dict contenant {'http:' 'url'} (et je devine https aussi).

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

1

Ceci est l'une des rares occasions où je recommande ragréage de singe, au moins jusqu'à ce que les développeurs Boto permettent des réglages 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