2015-11-07 2 views
10

J'utilise boto3 dans aws lambda pour fecth objet dans S3 situé dans la région de Francfort.Comment configurer le mécanisme d'autorisation en ligne avec boto3

v4 est nécessaire. sinon l'erreur suivante retournera

"errorMessage": "An error occurred (InvalidRequest) when calling 
the GetObject operation: The authorization mechanism you have 
provided is not supported. Please use AWS4-HMAC-SHA256." 

moyens réalisés pour configurer signature_version http://boto3.readthedocs.org/en/latest/guide/configuration.html

Mais depuis que je suis en utilisant AWS lambda, je n'ai pas les profils d'accès à la configuration sous-jacente

Le code de ma fonction AWS lambda Est-ce possible de configurer signature_version dans ce code?

from __future__ import print_function 
import boto3 


def lambda_handler (event, context): 
    input_file_bucket = event["Records"][0]["s3"]["bucket"]["name"] 
    input_file_key = event["Records"][0]["s3"]["object"]["key"] 
    input_file_name = input_file_bucket+"/"+input_file_key 

    s3=boto3.resource("s3") 
    obj = s3.Object(bucket_name=input_file_bucket, key=input_file_key) 
    response = obj.get() 
    return event #echo first key valuesdf 

Est-ce possible de configurer signature_version dans ce code? utilisez Session par exemple. Ou y a-t-il une solution de contournement?

Répondre

16

Au lieu d'utiliser la session par défaut, essayez d'utiliser la session personnalisée et configuration de boto3.session

import boto3 
import boto3.session 
session = boto3.session.Session(region_name='eu-central-1') 
s3client = session.client('s3', config= boto3.session.Config(signature_version='s3v4')) 
s3client.get_object(Bucket='<Bkt-Name>', Key='S3-Object-Key') 
+0

Y at-il un moyen de configurer cela à partir d'un fichier? Je demande parce que j'utilise un morceau de code où 'boto3' est la dépendance, donc je n'ai pas d'accès direct pour changer l'appel' client() '. – bstempi

+0

vous pouvez définir boto3.session.Session (nom_profil = 'profile1') où profile1 est le nom du profil défini dans le fichier .aws/credentials avec les clés AWS, les jetons, la région souhaitée et les autres paramètres nécessaires – omuthu

+0

Que faire si je ne suis pas en utilisant les clés AWS et je me base plutôt sur le service de métadonnées de l'instance EC2? – bstempi

4

J'ai essayé l'approche de la session, mais j'eu des problèmes. Cette méthode a fonctionné mieux pour moi, votre kilométrage peut varier:

s3 = boto3.resource('s3', config=Config(signature_version='s3v4')) 

Vous devez importer Config de botocore.client pour faire ce travail. Voir ci-dessous pour une méthode fonctionnelle pour tester un bucket (liste d'objets). Ce que vous utilisez, il assume à partir d'un environnement dans lequel votre authentification est géré, comme Amazon EC2 ou Lambda avec un IAM Rôle:

import boto3 
from botocore.client import Config 
from botocore.exceptions import ClientError 

def test_bucket(bucket): 
    print 'testing bucket: ' + bucket 
    try: 
     s3 = boto3.resource('s3', config=Config(signature_version='s3v4')) 
     b = s3.Bucket(bucket) 
     objects = b.objects.all() 

     for obj in objects: 
      print obj.key 
     print 'bucket test SUCCESS' 
    except ClientError as e: 
     print 'Client Error' 
     print e 
     print 'bucket test FAIL' 

Pour le tester, il suffit d'appeler la méthode avec un nom de seau. Votre rôle devra accorder les autorisations appropriées.