如何使用Python使用多个查询过滤器查询AWS ElasticSearch Service(URI搜索)

时间:2019-03-07 10:37:09

标签: python amazon-web-services elasticsearch python-requests

使用python的请求通过Query String Syntax查询ElasticSearch时AWS的奇怪行为。

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": { ...}
}

=>确定

但是当我添加更多查询时,它会因错误而中断:

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 Secret Access密钥和签名方法。有关详细信息,请查阅服务文档。

有人对如何“解决”此问题有任何想法吗?

注释1 :如果没有多个查询,一切都会按预期进行=>凭据不是问题。

注释2 :在浏览器或Kibana中运行查询可提供预期的结果=>查询不是问题。

注释3 :尝试使用和不使用url编码( urllib.parse.quote


更新:

  • 禁用请求身份验证(通过删除auth = aws_auth )并将IP列入白名单有助于
  • 有/没有请求正文的行为都是相同的

当前解决方案/解决方法: 经过数小时的调试,仍然不知道问题出在哪里。查询已重写为仅限请求体,例如:

GET log_index/_doc/_search
{
  "query": { "bool": { ... } },
  "aggs": { ... }
}

一切正常,但是构造正确的布尔查询很棘手。

0 个答案:

没有答案