Как я могу напечатать строку Canonical, которую отправляет aws-запросы-auth?
Я хочу, чтобы лямбда вызывала экземпляр Sagemaker в другом регионе. Если оба находятся в одном регионе, все работает нормально. Если это не так, я получаю следующую ошибку:
The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.
The Canonical String for this request should have been
'POST
/endpoints/foo-endpoint/invocations
host:runtime.sagemaker.us-east-1.amazonaws.com
x-amz-date:20180406T082536Z
host;x-amz-date
1234567890foobarfoobarfoobarboofoobarfoobarfoobarfoobarfoobarfoo'
The String-to-Sign should have been
'AWS4-HMAC-SHA256
20180406T082536Z
20180406/us-east-1/sagemaker/aws4_request
987654321abcdeffoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarf'
я использую aws-requests-auth
(0.4.1) с boto3 (1.5.15 - обновление до 1.7.1 ничего не изменило, журнал изменений), например так:
import requests
from aws_requests_auth.aws_auth import AWSRequestsAuth
auth = AWSRequestsAuth(aws_access_key=config['AWS']['ACCESS_KEY'],
aws_secret_access_key=(
config['AWS']['SECRET_ACCESS_KEY']),
aws_host=config['AWS']['HOST'],
aws_region=config['AWS']['REGION'],
aws_service=config['AWS']['SERVICE'])
payload = {'foo': 'bar'}
response = requests.post(post_url,
data=json.dumps(payload),
headers={'content-type': 'application/json'},
auth=auth)
печать auth
только дает <aws_requests_auth.aws_auth.AWSRequestsAuth object at 0x7f9d00c98390>
,
Есть ли способ распечатать "каноническую строку", упомянутую в сообщении об ошибке?
(Любые другие идеи, как это исправить, также приветствуются)
1 ответ
Решение
Обходной вопрос для заданного вопроса:
req = requests.request('POST', 'http://httpbin.org/get')
req.body = b''
req.method = ''
print(auth.get_aws_request_headers(req,
aws_access_key=auth.aws_access_key,
aws_secret_access_key=auth.aws_secret_access_key,
aws_token=auth.aws_token))
Однако проблема не решена. И теперь мне интересно, каков первый аргумент auth.get_aws_request_headers
является.