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