为什么 elasticserach-rails 突然提高 Faraday::ConnectionFailed(执行过期)?

And*_*vey 4 ruby-on-rails elasticsearch

我通过 elasticsearch-model 和 elasticsearch-rails gems 在 Rails 应用程序中使用 Elasticsearch。

以前一切正常,但经过一些更新后,每当我尝试与远程集群(AWS Elasticsearch)交互时,我都会收到连接失败错误。

> MyModel.__elasticsearch__.create_index! force: true
=> Faraday::ConnectionFailed (execution expired)
Run Code Online (Sandbox Code Playgroud)

我正在努力找出导致此连接错误的原因。在搜索类似问题后,我调整了超时并尝试了 http、https 和裸 URL 的各种组合,但没有成功。

调试此连接错误的明智方法是什么?

我的 Elasticsearch 是这样初始化的。

#initializers/elasticsearch.rb


require 'faraday_middleware'
require 'faraday_middleware/aws_sigv4'

credentials = Aws::Credentials.new(
  ENV.fetch('AWS_ACCESS_KEY_ID'),
  ENV.fetch('AWS_SECRET_ACCESS_KEY')
)

config = {
  url: ENV.fetch('AWS_ELASTICSEARCH_URL'),
  retry_on_failure: true,
  transport_options: {
    request: { timeout: 10 }
  }
}


client = Elasticsearch::Client.new( config ) do |f|
  f.request :aws_sigv4, credentials: credentials, service: 'es', region: ENV.fetch('AWS_ELASTICSEARCH_REGION')
end


Elasticsearch::Model.client = client
Run Code Online (Sandbox Code Playgroud)

And*_*vey 10

事实证明,这个问题有两个部分。

首先,上面配置的 Elasticsearch::Client 使用默认的 ES 端口 9200。我的 ES 托管在 AWS 上,它似乎没有公开这个端口。

解决这个问题后,我遇到了第二个问题(我怀疑这更特定于这个应用程序)。我开始Faraday::ConnectionFailed (end of file)出错。我不知道是什么原因造成的,但是配置客户端hostscheme修复它。

我的最终配置如下:

#initializers/elasticsearch.rb


# ...

config = {
  host: ENV.fetch('AWS_ELASTICSEARCH_URL'),
  port: 443,
  scheme: "https",
  retry_on_failure: true,
  transport_options: {
    request: { timeout: 10 }
  }
}

client = Elasticsearch::Client.new( config ) do |f|
# ...
Run Code Online (Sandbox Code Playgroud)

NBAWS_ELASTICSEARCH_URL必须返回一个没有协议的 URL。

  • 将端口添加到我的 AWS Elasticsearch URL 也为我解决了这个问题。谢谢! (2认同)