I am trying to setup CircleCI with Elasticsearch in my Rails application. I think have the image configured, but how do I connect to it in CI?
So far I have tried...
https://github.com/elastic/elasticsearch/issues/23866
Error Message
Elasticsearch::Transport::Transport::Errors::Unauthorized: [401]
Circle YAML Config
version: 2
jobs:
build:
working_directory: ~/gathrly-smartforms
docker:
- image: circleci/ruby:2.4.1-node
environment:
RAILS_ENV: continous_integration
PGHOST: 127.0.0.1
PGUSER: rails_test_user
- image: circleci/postgres:9.6.3-alpine
environment:
POSTGRES_USER: rails_test_user
POSTGRES_PASSWORD: ""
POSTGRES_DB: continous_integration
- image: redis:4.0.2
- image: docker.elastic.co/elasticsearch/elasticsearch:5.4.2
steps:
- checkout
- restore_cache:
keys:
- my-application-{{ checksum "Gemfile.lock" }}
- my-application-
- save_cache:
key: rails-demo-{{ checksum "Gemfile.lock" }}
paths:
- vendor/bundle
- run:
name: Setup Bundler and Gems
command: |
gem install bundler
gem update bundler
gem install brakeman
gem install rubocop
gem install rubocop-rspec
gem install scss_lint
gem install eslint-rails
gem install execjs
bundle config without development:test
bundle check --path=vendor/bundle || bundle install --without development test --path=vendor/bundle --jobs 4 --retry 3
- run:
name: Setup Postgres
command: |
sudo apt-get install postgresql-client
- run:
name: Setup Rails Database
command: |
RAILS_ENV=continous_integration bundle exec rake db:drop
RAILS_ENV=continous_integration bundle exec rake db:setup
- run:
name: Run Rspec
command: |
RAILS_ENV=continous_integration bundle exec rspec --format RspecJunitFormatter -o /tmp/test-results/rspec.xml
- store_test_results:
path: /tmp/test-results
Elastic Search Initializer
require 'faraday_middleware/aws_signers_v4'
if Rails.env.production? || Rails.env.staging?
Elasticsearch::Model.client = Elasticsearch::Client.new(url: ENV["AWS_ELASTICSEARCH_HOST"]) do |f|
f.request :aws_signers_v4,
credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY'], ENV['AWS_ACCESS_SECRET_KEY']),
service_name: 'es',
region: ENV['AWS_REGION']
f.adapter Faraday.default_adapter
end
else
config = {
host: "http://127.0.0.1:9200",
transport_options: {
request: { timeout: 5 }
}
}
if File.exists?("config/elasticsearch.yml")
config.merge!(YAML.load_file("config/elasticsearch.yml"))
end
Elasticsearch::Model.client = Elasticsearch::Client.new(config)
end
The official docker images from elastic come with x-pack preinstalled.
https://www.elastic.co/guide/en/elasticsearch/reference/5.4/docker.html
That means that your elasticsearch instance is running with security enabled, but you do not appear to be providing any security credentials to your elasticsearch client, and so you get an unauthorised ( 401
) error when you try to connect.
You should either turn off security in your ES instance by adding xpack.security.enabled: false
to your elasticsearch.yml
, or provide valid credentials in your request.
(Posted on behalf of the question author) .
From the other answer provided:
development: &default
host: 'http://localhost:9200/'
transport_options:
request:
timeout: !!integer 300
test:
<<: *default
staging:
<<: *default
continous_integration:
<<: *default
xpack.security.enabled: false
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.