Ошибка отправки сообщения очереди Amazon SQS FIFO

Мы пытаемся отправить сообщение в очередь AWS FIFO. У нас уже есть рабочая версия кода, отправляющего сообщение в стандартную очередь SQS.

Код Python (наше требование - не использовать SDK): Примеры полного процесса подписания версии 4 (Python)

Для стандартной очереди мы использовали следующие параметры

    method = 'GET'
    service = 'sqs'
    host = 'sqs.us-west-2.amazonaws.com'
    region = 'us-west-2'
    endpoint = 'https://sqs.us-west-2.amazonaws.com/xxxxxx/TestQueue'
    request_parameters = 'Action=SendMessage&MessageBody=mytest&Version=2012-11-05'
    canonical_uri = '/xxxxxx/TestQueue'

Для очереди FIFO мы использовали тот же код и дополнительно изменили его следующим образом

method = 'GET'
service = 'sqs'
host = 'sqs.us-west-2.amazonaws.com'
region = 'us-west-2'
endpoint = 'https://sqs.us-west-2.amazonaws.com/xxxxxxx/Test.fifo'
request_parameters = 'Action=SendMessage&MessageBody=mytest&MessageGroupId=test&MessageDeduplicationId=ttte&Version=2012-11-05'
canonical_uri = '/xxxxxxx/Test.fifo'

Но это не удалось. Мы что-то упускаем, может ли кто-нибудь нам помочь?

Response code: 403

<?xml version="1.0"?><ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/"><Error><Type>Sender</Type><Code>SignatureDoesNotMatch</Code><Message>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.

person Tamil Kp    schedule 28.06.2018    source источник
comment
Не уверен, почему это было отклонено - это хороший, четкий вопрос, на который можно дать ответ, с попыткой и ожидаемым и наблюдаемым поведением. Ответ просто так закопан в документации. Хотел бы я видеть больше подобных вопросов.   -  person Krease    schedule 03.07.2018


Ответы (1)


Алгоритм подписи требует, чтобы вы лексически отсортировали свои параметры перед подписанием. Это отчасти объясняет, почему термин канонический используется при описании «канонической строки запроса». Их необязательно отправлять на сервер в отсортированном виде в фактическом запросе, но они должны быть отсортированы для подписания для получения правильного результата.

MessageGroupId должен быть после MessageDeduplicationId, а не до.

Это упоминается в примере кода на странице, на которую вы ссылаетесь:

# Step 3: Create the canonical query string. In this example (a GET request),
# request parameters are in the query string. Query string values must
# be URL-encoded (space=%20). The parameters must be sorted by name.
# For this example, the query string is pre-formatted in the request_parameters variable.

Лучшая реализация, чем этот упрощенный пример, могла бы взять параметры в качестве словаря и отсортировать их для построения канонической строки запроса. Лучшая реализация может также автоматически обрабатывать экранирование URL-адресов ключей и значений.

person Michael - sqlbot    schedule 28.06.2018