Как настроить механизм авторизации с помощью 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'
Чтобы проверить это, просто вызовите метод с именем ведра. Ваша роль должна будет предоставить соответствующие разрешения.