2015-11-07 15 views
10

Używam boto3 in aws lambda do obiektu fecth w S3 zlokalizowanego w regionie Frankfurtu.Jak skonfigurować mechanizm autoryzacji wbudowany w boto3

v4 jest konieczne. inaczej następujący błąd powróci

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

Zrealizowane sposoby konfigurowania signature_version http://boto3.readthedocs.org/en/latest/guide/configuration.html

Ale ponieważ używam AWS lambda, nie mam dostępu do podstawowej konfiguracji profile

Kodeksu mojej funkcji 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 

Czy to możliwe, aby skonfigurować signature_version w tym kodzie? użyj na przykład sesji. Czy istnieje jakieś obejście tego problemu?

Odpowiedz

16

Zamiast sesję domyślną, spróbuj użyć niestandardowego sesji i konfiguracji z 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

Czy istnieje sposób, aby skonfigurować to z pliku? Pytam, ponieważ używam fragmentu kodu, w którym 'boto3' jest zależnością, więc nie mam bezpośredniego dostępu do zmiany wywołania' client() '. – bstempi

+0

można ustawić boto3.session.Session (nazwa_profilu = "profil1") gdzie profil1 to nazwa profilu zdefiniowanego w pliku .aws/credentials z kluczami AWS, tokenami, żądanym regionem i innymi niezbędnymi parametrami. – omuthu

+0

Co jeśli nie jestem używając kluczy AWS, a zamiast tego polegam na usłudze metadanych instancji EC2? – bstempi

4

Próbowałem podejście sesji, ale nie miałem problemów. Ta metoda działa lepiej dla mnie, może się wahać:

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

Trzeba będzie importować Config z botocore.client aby uczynić tę pracę. Poniżej znajduje się opis funkcjonalnej metody testowania zasobnika (obiekty listy). Zakłada używasz go od środowiska, w którym swoją uwierzytelniania zarządzanego, takich jak Amazon EC2 lub lambda z IAM Rola:

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' 

By to sprawdzić, wystarczy wywołać metodę z nazwą wiadra. Twoja rola będzie musiała nadać odpowiednie uprawnienia.

Powiązane problemy