Как запросить сервис AWS ElasticSearch (поиск по URI) с несколькими фильтрами запросов с использованием Python - PullRequest
0 голосов
/ 07 марта 2019

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

...