2015-11-07 11 views
10

Sto usando boto3 in aws lambda per il controllo dell'oggetto in S3 situato nella regione di Francoforte.Come configurare il meccanismo di autorizzazione in linea con boto3

v4 è necessario. altrimenti seguente errore tornerà

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

modi realizzati per configurare signature_version http://boto3.readthedocs.org/en/latest/guide/configuration.html

Ma dal momento che sto usando AWS lambda, non hanno accesso alla configurazione sottostante profili

Il codice della mia funzione lambda AWS

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 

È possibile configurare signature_version in questo codice? usa Session per esempio. O c'è qualche soluzione su questo?

risposta

16

Invece di usare la sessione predefinita, provare a utilizzare sessione personalizzato e Config dal 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

C'è un modo per configurare questo da un file? Sto chiedendo perché sto usando un pezzo di codice dove 'boto3' è la dipendenza, quindi non ho accesso diretto per cambiare la chiamata' client() '. – bstempi

+0

puoi impostare boto3.session.Session (profile_name = 'profile1') dove profile1 è il nome del profilo definito nel file .aws/credentials con chiavi AWS, token, regione desiderata e altri parametri necessari – omuthu

+0

Cosa succede se non lo sono utilizzando le chiavi AWS e sto invece facendo affidamento sul servizio di metadati dell'istanza EC2? – bstempi

4

ho provato l'approccio della sessione, ma ho avuto problemi. Questo metodo ha funzionato meglio per me, la tua situazione potrebbe essere diversa:

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

Sarà necessario importare Config da botocore.client al fine di fare questo lavoro. Vedi sotto per un metodo funzionale per testare un bucket (lista oggetti). Questo presuppone che si sta eseguendo da un ambiente in cui viene gestita l'autenticazione, come Amazon EC2 o Lambda con un ruolo IAM:

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' 

Per provarlo, è sufficiente chiamare il metodo con un nome secchio. Il tuo ruolo dovrà garantire permessi adeguati.