无法关闭 AWS 上的 ElasticSearch 索引?

Posted

技术标签:

【中文标题】无法关闭 AWS 上的 ElasticSearch 索引?【英文标题】:Can't close ElasticSearch index on AWS? 【发布时间】:2016-01-11 20:02:49 【问题描述】:

我创建了一个新的 AWS ElasticSearch 域,用于测试。我现在在不同的主机上使用 ES,我希望迁移到 AWS。

我需要做的一件事是在我的实例上设置映射(分析器)。为此,我需要“关闭”索引,否则 ES 只会引发异常。

不过,每当我尝试关闭索引时,都会从 AWS 收到异常:

Your request: '/_all/_close' is not allowed by CloudSearch.

AWS ES documentation 明确表示在某些情况下要这样做:

 curl -XPOST 'http://search-weblogs-abcdefghijklmnojiu.us-east-1.a9.com/_all/_close'

我没有找到任何说明为什么我无法在 AWS ES 上关闭我的索引的文档,也没有找到其他有此问题的人。

我有一个 ElasticSearch 域也有点奇怪,但它给了我一个 CloudSearch 错误消息,因为我认为这些是不同的服务,尽管我认为一个是根据另一个来实现的。

谢谢!

【问题讨论】:

很好的发现,您是否就这个问题直接联系了 AWS? BMW:我在尝试向他们的论坛发帖时也遇到了一个(甚至更普遍的)错误。 :P 【参考方案1】:

AWS Elasticsearch 不支持对索引的“关闭”操作。

http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-managedomains.html

“目前,Amazon ES 不支持 Elasticsearch _close API”

【讨论】:

是的,他们更改了文档。我猜他们的文档和实施团队实际上并没有互相交谈。更奇怪的是,文档历史中没有关于这种变化的记录。 如果你想添加映射,你必须重新索引。有一些关于使用别名来做到这一点的好文章。基本步骤 - 创建读取别名和写入别名。将读取别名指向当前索引。使用新映射创建新索引。将写入别名指向新索引。然后将旧索引复制到新索引(从读取别名读取,写入写入别名)。这涉及修改现有代码以改用别名。 elastic.co/guide/en/elasticsearch/guide/current/reindex.htmlelastic.co/guide/en/elasticsearch/reference/current/… 可以确认,从这个答案开始 4 年后,AWS Elasticsearch 仍然不支持_close(至少在我昨天创建的 6.0 实例上不支持),但上面不再提到它链接的文档。我们成功地使用 reindex 来更新映射。【参考方案2】:

根据我最近找到的 AWS 文档,您必须先将您的弹性搜索域升级到 7.4 或更高版本。

https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/aes-handling-errors.html#aes-troubleshooting-close-api

【讨论】:

【参考方案3】:

由于一次关闭所有索引是一项危险的操作,因此默认情况下它可能在您的集群上被禁用。您需要确保您的 elasticsearch.yml 配置文件不包含以下内容:

action.destructive_requires_name: true

您可以在配置文件中进行设置并重新启动集群,但我强烈建议您不要这样做,因为这为各种其他破坏性操作打开了大门,例如一次删除所有索引.

action.destructive_requires_name: false

您应该做的是临时使用

更新集群设置
curl -XPUT localhost:9200/_cluster/settings -d '
    "persistent" : 
        "action.destructive_requires_name" : false
    
'

然后关闭所有索引

curl -XPOST localhost:9200/_all/_close

然后将设置重置为更安全的值:

curl -XPUT localhost:9200/_cluster/settings -d '
    "persistent" : 
        "action.destructive_requires_name" : true
    
'

【讨论】:

AWS ES 是更高级别的服务,不提供对elasticsearch.yml 的直接访问。当我尝试像这样 PUT 到 /_cluster/settings 时出现“不允许有效负载”错误。 您是否至少能够使用/your_index/_close 关闭单个索引? 你的回答给了我一个想法。我正在从我的客户端库中执行.close(index=INDEX_NAME),但由于某种原因,它似乎以/_all/_close 的形式出现在了网上。所以我尝试了curl -XPOST host/my_index/_close,AWS 报告说这也是“CloudSearch 不允许的”。该死。 你能运行这个:curl -XGET host/_cluster/settings 吗?因为这似乎是允许的。 不过,AWS Cloudsearch 与 AWS Elasticsearch 不同。你确定你打的是正确的主机吗?这是我看到的唯一解释。

以上是关于无法关闭 AWS 上的 ElasticSearch 索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 AWS 中的开发和生产环境? [关闭]

AWS 上的 Elasticsearch:如何修复未分配的分片?

AWS RED 上的 Elasticsearch 和不允许重新路由

我们在关闭日志记录的情况下通过 AWS OpenSearch 运行 ElasticSearch 7.8。我们对 log4shell 是不是安全?

AWS Fargate 集群无法使用 NAT 和 Internet 网关访问 Internet [关闭]

如何设置 SSH 隧道以连接到位于 AWS EC2 服务器上的 ElasticSearch 和 MongoDB?