2017-10-04 5 views
0

J'ai un script boto3 qui télécharge avec succès des fichiers dans un compartiment S3, en utilisant AccessKeyId et SecretAccessKey de mon compte. Cela fonctionne bien.Je suis supposé utiliser boto3 pour écrire dans un compartiment S3 avec uniquement un profil d'instance IAM, mais comment?

Mais je suis supposé supprimer mes informations d'identification de cette instance et utiliser uniquement le rôle IAM attaché à l'instance. J'ai fait diverses tentatives, mais ne l'ai pas obtenu cela fonctionne, habituellement avec:

botocore.exceptions.ClientError: An error occurred (InvalidToken) when 
calling the PutObject operation: The provided token is malformed or 
otherwise invalid. 

Mon code:

!/usr/bin/env python 

import datetime 
import sys 
import os 
import ConfigParser 
import boto3 

s3 = boto3.resource('s3') 

config = ConfigParser.ConfigParser() 
configfile = config.read('edi.config') 

s3bucket = config.get('default', 's3bucket') 

s3bucket = s3bucket.strip() 

print 's3bucket: ', s3bucket 

today = datetime.date.today() 

todaystr = today.strftime('%m_%d_%Y') 
os.chdir(todaystr) 
try: 
    os.mkdir('uploaded') 
except: 
    pass 

for f in os.listdir('.'): 
    if not os.path.isfile(f): 
     continue 

print 'uploading', f 
data = open(f) 

s3.Bucket('ustc-submissions-non-prod').put_object(Key='closewatch/incoming/%s' % f, Body=data) 
os.rename(f,'uploaded/%s' % f) 

J'ai trouvé une note d'ailleurs que je dois assumer le rôle IAM au sein boto3 , mais (a) je n'ai pas la permission de le faire et (b) je n'ai pas la permission de me donner la permission et (c) mon collègue pense que cela ne devrait pas être nécessaire de toute façon.

Quelqu'un at-il un exemple complet de ce genre de chose?

+0

Sans code, c'est un peu difficile à deviner mais dans tous les cas, vous ne devez rien passer. Voir [Références boto3] (http://boto3.readthedocs.io/en/latest/guide/configuration.html) pour plus d'informations. Votre cas d'utilisation est le point 8. – stdunbar

+0

Vous devez modifier votre message pour inclure votre code (moins les informations d'identification) afin que nous puissions voir où vous tombez. Vous n'avez * certainement * pas besoin de clés d'accès si l'instance a le bon rôle IAM. –

+0

Pouvez-vous 'aws s3 cp foo.txt s3: // seau /' sur la ligne de commande? ('pip install awscli' si la commande' aws' n'est pas trouvée) –

Répondre

0

Il semble que le problème soit dû à un bogue dans la dernière version de boto3.

Je l'ai essayé en Ruby:

require 'aws-sdk-s3' 

s3 = Aws::S3::Resource.new(region:'us-west-2') 
obj = s3.bucket('bucket-name').object('key') 
obj.upload_file('/path/to/source/file') 

Cela a fonctionné en utilisant uniquement le rôle IAM que je avais besoin!

+0

Je pense que vous avez maintenant assez d'informations pour ouvrir un problème ici: https://github.com/boto/boto3/issues –

0

Suggestions:

  1. Mise à niveau et/ou réinstaller les versions actuelles des packages et dépendances nécessaires:

    pip install --upgrade --ignore-installed botocore boto3 awscli 
    
  2. Vérifiez que aws configure list montre iam-role sous Type:

    access_key  ****************DFAB   iam-role 
    secret_key  ****************zxQ4   iam-role 
    
  3. Simplifiez votre code Si tout ce que vous voulez faire est de télécharger un fichier, vous prenez une route très longue et pittoresque! Essayez cette MCVE:

    import boto3 
    with open('example.txt', 'w') as f: 
        f.write('This is an example.') 
    s3 = boto3.client('s3') 
    s3.upload_file(Filename='example.txt', 
           Bucket='ustc-submissions-non-prod', 
           Key='example.txt') 
    
  4. Une fois votre problème de rôle est résolu: si votre besoin d'affaires est de synchroniser un répertoire local avec un seau S3 en téléchargeant de nouveaux fichiers comme ils viennent, utilisez la commande aws s3 sync existant au lieu d'un script personnalisé.

+0

Merci pour les suggestions; J'ai créé une nouvelle instance avec le même rôle (FullS3AccessToEC2) mais en essayant le script que vous listez ci-dessus, j'obtiens à nouveau l'erreur 'token': oto3.exceptions.S3UploadFailedError: Impossible de télécharger example.txt à ustc-submissions-non-prod/exemple.txt: Une erreur s'est produite (InvalidToken) lors de l'appel de l'opération PutObject: Le jeton fourni est incorrect ou invalide. –

+0

Voyez-vous la même erreur lors de l'exécution de 'aws s3 ls' à l'invite bash? –

+0

Oui! Je me demande si je devrais essayer boto2? –