2017-09-05 1 views
0

Je tente de me connecter à un compartiment S3 (un tiers est le propriétaire, donc je ne peux pas y accéder via la console AWS). En utilisant CyberDuck, je peux me connecter et télécharger des fichiers sans problème. Cependant, j'ai essayé plusieurs bibliothèques pour se connecter au seau, ce qui rend un 403 interdit. Je poste ici dans l'espoir que quelqu'un puisse voir ce que je fais de façon incorrecte.Je peux utiliser CyberDuck pour me connecter à S3 Bucket, mais je ne peux pas me connecter par programmation

def send_to_s3(file_name): 
     csv = open("/tmp/" + file_name, 'rb') 
     conn = tinys3.Connection("SECRET", 
           "SECRET", 
           tls=True, 
           endpoint="s3.amazonaws.com") 
     conn.upload("MDA-Data-Ingest/input/" + file_name, csv, bucket="gsext-69qlakrroehhgr0f47bhffnwct") 


    def send_via_ftp(file_name): 
     cnopts = pysftp.CnOpts() 
     cnopts.hostkeys = None 
     srv = pysftp.Connection(host="gsext-69qlakrroehhgr0f47bhffnwct.s3.amazonaws.com", 
           username="SECRET", 
           password="SECRET", 
           port=443, 
           cnopts=cnopts) 

     with srv.cd('\MDA-Data-Ingest\input'): 
      srv.put('\\tmp\\'+file_name) 

     # Closes the connection 
     srv.close() 

    def send_via_boto(file_name): 
     access_key = 'SECRET' 
     secret_key = 'SECRET' 

     conn = boto.connect_s3(
      aws_access_key_id=access_key, 
      aws_secret_access_key=secret_key, 
      host='s3.amazonaws.com', 
      # is_secure=False,    # uncomment if you are not using ssl 
      calling_format=boto.s3.connection.OrdinaryCallingFormat(), 
     ) 

Toutes ces fonctions renvoient un 403 interdit comme indiqué ci-dessous:

HTTPError: 403 Erreur du client: Interdit aux URL: https://gsext-69qlakrroehhgr0f47bhffnwct.s3.amazonaws.com/MDA-Data-Ingest/input/accounts.csv

Cependant quand j'utilise CyberDuck je peux me connecter très bien:

enter image description here

+0

Modifier: À un moment l'envoi via ftp a montré le 403 (je ne me souviens pas à quoi il ressemblait quand il envoyait un 403) comme il se trouve au-dessus de l'erreur qu'il crache est: SSHException: Erreur lors de la lecture de la bannière de protocole SSH [Errno 54] Connexion réinitialisée par le pair –

Répondre

0

la méthode la plus simple serait d'utiliser le AWS Command-Line Interface (CLI), qui u ses boto3 pour accéder aux services AWS.

Par exemple:

aws s3 ls s3://bucket-name --region us-west-2 

aws s3 cp s3://gsext-69qlakrroehhgr0f47bhffnwct/MDA-Data-Ingest/input/accounts.csv accounts.csv 

Vous exécutez d'abord aws configure de fournir vos informations d'identification et une région par défaut, mais la syntaxe ci-dessus vous permet de spécifier la région particulière que le godet se trouve. (Il est possible que votre code Python a échoué en raison de l'appel de la mauvaise région.)

+0

Avec une ligne de code presque identique, j'ai réussi à le faire fonctionner en passant de boto à boto3. –