Я работаю со службой AWS Transcribe streaming, которая boto3 еще не поддерживает, поэтому для выполнения запросов HTTP / 2 мне нужно вручную настроить заголовок authorization с "AWS Signature Version 4"

Я нашел пример реализации , но я надеялся просто вызвать любую функцию, реализованную в boto3 / botocore, используя тот же объект конфигурации.

Что-то типа

    session = boto3.Session(...)
    auth = session.generate_signature('POST', '/stream-transcription', ...)

Есть указатели в этом направлении?

3
JBernardo 29 Июл 2020 в 16:31

3 ответа

Лучший ответ

Вы проверяли этот SDK? Кажется, совсем недавно, но может сделать то, что вам нужно.

https://github.com/awslabs/amazon-transcribe-streaming-sdk/tree/master

Похоже, он обрабатывает подписание: https: //github.com/awslabs/amazon-transcribe-streaming-sdk/blob/master/amazon_transcribe/signer.py

2
paulopontesm 29 Июл 2020 в 16:33

Я не тестировал это, но вы, вероятно, можете добиться этого, выполнив вместе с этим модульным тестом SigV4:

https://github.com/boto/botocore/blob/master/tests/unit/test_auth_sigv4.py

Обратите внимание: при этом создается запрос с помощью помощника botocore.awsrequest.AWSRequest. Вам, вероятно, придется покопаться, чтобы выяснить, как отправить фактический HTTP-запрос (возможно, с помощью httpsession.py)

1
brianz 29 Июл 2020 в 16:30

В отличие от AWS SDK для большинства других языков программирования, boto3 / botocore пока не предлагают функции для подписи произвольных запросов с помощью «AWS Signature Version 4». Однако, по крайней мере, для этого уже есть открытый запрос функции: https://github.com/boto / botocore / вопросы / 1784

В этом запросе функции также обсуждаются существующие альтернативы. Одна из них - это сторонняя библиотека Python aws-requests-auth, которая обеспечивает тонкий обертка вокруг botocore и requests для подписи HTTP-запросов. Это выглядит так:

import requests
from aws_requests_auth.boto_utils import BotoAWSRequestsAuth

auth = BotoAWSRequestsAuth(aws_host="your-service.domain.tld",
                           aws_region="us-east-1",
                           aws_service="execute-api")
response = requests.get("https://your-service.domain.tld",
                        auth=auth)

Другой альтернативой, представленной в запросе функции, является реализация необходимого связующего кода самостоятельно, как показано в следующей сущности:

Dunedan 29 Июл 2020 в 16:40