Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is elasticserach-rails suddenly raising Faraday::ConnectionFailed (execution expired)?

I'm using Elasticsearch in a Rails app via the elasticsearch-model and elasticsearch-rails gems.

Everything was previously working fine, but after some updates I am now getting a Connection Failed error whenever I attempt to interact with the remote cluster (AWS Elasticsearch).

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

I'm struggling to work out what is causing this connection error. After searching for similar issues, I've adjusted timeouts and tried various combinations of http, https and naked urls, but no success.

What is a sensible way to debug this connection error?

My Elasticsearch is initialized like this.

#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
like image 939
Andy Harvey Avatar asked Dec 18 '22 16:12

Andy Harvey


2 Answers

It turns out that there were two parts to this issue.

First, the Elasticsearch::Client, as configured above, was using the default ES port 9200. My ES is hosted on AWS, which appears to not expose this port.

After fixing this, I ran into the second issue (which I suspect is more specific to this app). I started getting a Faraday::ConnectionFailed (end of file) error. I don't know what caused this, but configuring the client with host and scheme fixed it.

My final config is as follows:

#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|
# ...

N.B. AWS_ELASTICSEARCH_URL must return a URL without protocol.

like image 199
Andy Harvey Avatar answered May 12 '23 09:05

Andy Harvey


This is because of version issue. Use this gem 'elasticsearch-model', '~> 5'

like image 42
Parakh Garg Avatar answered May 12 '23 09:05

Parakh Garg