Странное поведение AWS при запросе ElasticSearch с Запрос синтаксиса строки с использованием запросов python.
import requests
from requests_aws4auth import AWS4Auth
...
aws_auth = AWS4Auth(access_key, secret_key, region, service, session_token=token)
res = requests.request(url=url, method=method, data=query, headers={'Content-Type': 'application/json'}, auth=aws_auth)
if not res.ok:
print(res.text)
...
Когда есть только один фильтр или нет, все работает нормально.Например:
GET log_index/_doc/_search?q=country_code:US
{
"aggs": { ...}
}
=> OK
Но когда я добавляю больше запросов, это приводит к ошибке:
GET log_index/_doc/_search?q=country_code:(US OR CA)
{
"aggs": { ...}
}
или
GET log_index/_doc/_search?q=country_code:US AND os:windows
{
"aggs": { ...}
}
=> HTTP 403 Ошибка:
Рассчитанная нами подпись запроса не соответствует предоставленной вами подписи.Проверьте свой секретный ключ доступа AWS и метод подписи.За подробностями обращайтесь к сервисной документации.
У кого-нибудь есть идеи о том, как «исправить» эту проблему?
Примечание 1 : без нескольких запросов всеработает как ожидалось => это не проблема с учетными данными.
Примечание 2 : выполнение запросов в браузере или в Kibana дает ожидаемые результаты => это не проблема с запросами.
Примечание 3 : пробовал с и без url-кодировки ( urllib.parse.quote )
ОБНОВЛЕНИЕ:
- Отключение аутентификации запроса (путем удаления auth = aws_auth ) и «белого» IP-адреса помогают
- Поведение одинаково с / без тела запроса
Текущее решение / Обходной путь : После часов отладки все еще не понимаете, в чем проблема.Запросы были переписаны только для тела запроса, например:
GET log_index/_doc/_search
{
"query": { "bool": { ... } },
"aggs": { ... }
}
Все работает, как и ожидалось, но создание правильного запроса bool довольно сложно.