从 boto3 生成 AWS HTTP 签名

Generate the AWS HTTP signature from boto3

我正在使用 boto3 尚不支持的 AWS Transcribe streaming 服务,因此要发出 HTTP/2 请求,我需要手动设置 authorization header “AWS 签名版本 4”

我找到了一些示例 implementation,但我希望只调用 boto3/botocore 使用相同配置 object 实现的任何函数 object。

类似

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

有这方面的指示吗?

我还没有对此进行测试,但您可以通过遵循此 SigV4 单元测试来完成此操作:

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

请注意,这会使用 botocore.awsrequest.AWSRequest 助手构造一个请求。您可能需要深入研究如何发送实际的 HTTP 请求(可能使用 httpsession.py

你检查过这个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

与大多数其他编程语言的 AWS SDK 不同,boto3/botocore 不提供使用“AWS 签名版本 4”签署任意请求的功能。但是至少已经有一个开放的功能请求:https://github.com/boto/botocore/issues/1784

在此功能请求中,还讨论了现有的替代方案。一个是第三方 Python 库 aws-requests-auth,它提供了一个围绕 botocorerequests 的瘦包装器来签署 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)

功能请求中提出的另一种选择是自行实施必要的粘合代码,如以下要点所示:https://gist.github.com/rhboyd/1e01190a6b27ca4ba817bf272d5a5f9a.