Как запросить AWS ElasticSearch Service (поиск по URI) с помощью нескольких фильтров запросов с использованием Python

#python #amazon-web-services #elasticsearch #python-requests

#python #amazon-веб-сервисы #elasticsearch #python-запросы

Вопрос:

Странное поведение 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-запрос сложно.

Комментарии:

1. Вы правильно запустили aws configure ?

2. @Rubens_Z: Учетные данные AWS верны, аутентификация в ES Service и в других сервисах работает без проблем