使用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 )
更新:
当前解决方案/解决方法: 经过数小时的调试,仍然不知道问题出在哪里。查询已重写为仅限请求体,例如:
GET log_index/_doc/_search
{
"query": { "bool": { ... } },
"aggs": { ... }
}
一切正常,但是构造正确的布尔查询很棘手。