弹性云:API 端点 - 404 未在搜索中找到?

Elastic Cloud: API endpoint - 404 Not Found on search?

描述

我想使用 REST API 通过 API 密钥授权查询我们的弹性云实例中的数据。

采取的步骤

我尝试使用 SQL API 以及搜索 API。注意,我更喜欢使用 SQL API.

基于文档中提供的以下 curl 命令:

curl -X POST "localhost:9200/_sql?format=txt&pretty" -H 'Content-Type: application/json' -d'
{
  "query": "SELECT * FROM library WHERE release_date < \u00272000-01-01\u0027"
}
'

[source]

curl -u elastic:password https://CLUSTER_ID.REGION.PLATFORM.found.io:9243/my_index/my_type -XPOST -d '{
"title": "One", "tags": ["ruby"]
}'
{"_index":"my_index","_type":"my_type","_id":"AV3ZeXsOMOVbmlCACuwj","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"created":true}

[source]

documentation about the REST API,我尝试了以下操作:

import base64
import json
import requests

if __name__ == '__main__':
    response1 = requests.post(
        'https://{redacted-id}.northamerica-northeast1.gcp.elastic-cloud.com:9243/_sql?format=txt',
        headers={
            "Authorization": base64.standard_b64encode(bytes('{API_KEY_ID}:{API_KEY_KEY}', 'utf-8')),
            "Content-Type": 'application/json'
        },
        data={
            "query": """
                 ...
            """
        }
    )

    print('response1')
    print(response1)

    response2 = requests.get(
        'https://{redacted-id}.northamerica-northeast1.gcp.elastic-cloud.com:9243/logs-pubsub/_search',
        headers={
            "Authorization": base64.standard_b64encode(bytes('{API_KEY_ID}:{API_KEY_KEY}', 'utf-8')),
            "Content-Type": 'application/json'
        },
        data={
            "query": {
                 # ...
            }
        }
    )

    print('response2')
    print(response2)

但是两个查询的回答都是 404 - 未找到。

我错过了什么?我是否遗漏了路径的一部分,例如 /api/.../rest/...?或者这是从 403 到 404 的误导,问题是 API 键?

谢谢!

ElasticStack 的好心人为我提供了以下答案。有两个问题:

上面的URL指向的是Kibana实例,而不是ElasticCloud实例

为了得到合适的URL:

  1. 导航到 https://cloud.elastic.co/deployments/
  2. 单击您的部署:

  1. 单击 Elasticsearch 端点的复制端点:

授权 header 格式不正确

ApiKey 支持的请求的授权 header 如下:

ApiKey {B64_ENCODE('API_KEY_ID:API_KEY_KEY')}

在python中可以写成:

"ApiKey " + str(base64.standard_b64encode(bytes('API_KEY_ID:API_KEY_KEY', 'utf-8')), 'utf-8')


最后,团队还强烈建议我看看他们的 Free on-demand Elasticsearch training

希望对路过这里的人有所帮助!