我正在通过elasticsearch-model和elasticsearch-rails gems在Rails应用程序中使用Elasticsearch。
以前一切正常,但是经过一些更新后,每当我尝试与远程集群(AWS Elasticsearch(交互时,我现在都会收到连接失败错误。
> MyModel.__elasticsearch__.create_index! force: true
=> Faraday::ConnectionFailed (execution expired)
我正在努力找出导致此连接错误的原因。在搜索类似问题后,我调整了超时并尝试了 http、https 和裸网址的各种组合,但没有成功。
调试此连接错误的明智方法是什么?
我的 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
事实证明,这个问题有两个部分。
首先,Elasticsearch::Client,如上所述,使用默认的ES端口9200。我的 ES 托管在 AWS 上,它似乎不会公开此端口。
解决此问题后,我遇到了第二个问题(我怀疑它更特定于此应用程序(。我开始收到Faraday::ConnectionFailed (end of file)
错误。我不知道是什么原因造成的,但是使用host
配置客户端并scheme
修复它。
我的最终配置如下:
#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。
版本问题。使用此gem 'elasticsearch-model', '~> 5'