Как настроить механизм авторизации с помощью boto3

Я использую boto3 в объекте aws lambda для fecth в S3, расположенном во Франкфурте.

v4 необходимо. в противном случае следующая ошибка вернет

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

Реализованные способы настройки signature_version http://boto3.readthedocs.org/en/latest/guide/configuration.html

Но поскольку я использую лямбда AWS, у меня нет доступа к базовым профилям конфигурации

Код моей лямбда-функции 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

Возможно ли настроить подпись в этом коде? например, использовать сеанс. Или есть ли какое-либо обходное решение?

Ответ 1

Вместо использования сеанса по умолчанию попробуйте использовать пользовательский сеанс и Config из 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')

Ответ 2

Я пробовал сеансовый подход, но у меня были проблемы. Этот метод работал лучше для меня, ваш пробег может варьироваться:

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

Вам нужно будет импортировать Config из botocore.client, чтобы сделать эту работу. См. Ниже функциональный метод проверки ведра (объекты списка). Предполагается, что вы запускаете его из среды, где управляется ваша аутентификация, например Amazon EC2 или Lambda с ролью 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'

Чтобы проверить это, просто вызовите метод с именем ведра. Ваша роль должна будет предоставить соответствующие разрешения.