为什么Elasticserach-rails突然升高Faraday :: ConnectionFailed(执行到期)?

时间:2019-06-10 07:20:01

标签: ruby-on-rails elasticsearch

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

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

> MyModel.__elasticsearch__.create_index! force: true
=> Faraday::ConnectionFailed (execution expired)

我正在努力找出导致此连接错误的原因。在搜索了类似的问题之后,我调整了超时时间,并尝试了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

2 个答案:

答案 0 :(得分:0)

这是因为版本问题。 使用此gem 'elasticsearch-model', '~> 5'

答案 1 :(得分:0)

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

首先,如上所述,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|
# ...

AWS_ELASTICSEARCH_URL必须返回不带协议的URL。