Не удалось отправить сообщение Amazon SQS FIFO Queue - PullRequest
0 голосов
/ 28 июня 2018

Мы пытаемся отправить сообщение в очередь 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.

1 Ответ

0 голосов
/ 28 июня 2018

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

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-адресов от ключей и значений.

...