LogstashがElasticsearchにつながらない

以下のdockerfileとdocker-compose、logstash.ymlの設定でdocker-compose upをしたところ、

"Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore::ResolutionFailure] elasticsearch: Name or service not known"

でエラーになります。logstash.ymlのhostsで指定したlocalhostのポートに対してouputが行えないのはなぜでしょうか。

dockerfile

FROM docker.elastic.co/logstash/logstash:7.4.2
ADD config/logstash.yml /usr/share/logstash/config

docker-compose

logstash:
build: logstash
container_name: logstash
ports:
- 5000:5000

logstash.yml

input {
file {
mode => "tail"
path => ["../../../packages/registerer/client/yukoyuko/csv/items-dev.csv"]
start_psotion => "beginning"
codec => plain {
charset => "UTF-8"
}
}
}
filter {
csv {
columns => ["id","title","price","ReviewTotal","group","prefecture","HotelRank","area","onsen","RoomType","DinnerReview","reviews","rotenburo","IsExistOnsen","MealPlace","Meal","Pouring","PriceTaxInclude","ImageUrl","UnUsed","StockFlag","DisplayFlag","StartFrom","EndTo"]
convert => {
"id" => "integer"
}
skip_header => true
}
date {
match => ["StartFrom","yyyy-MM-dd"]
match => ["EndTo","yyyy-MM-dd"]
}
}
output {
elasticsearch {
hosts => ["localhost:9600"]
index -> "test-onsen
}
}

Logstashの問題ではなく、Dockerの、特にネットワークの設定の問題ではないでしょうか。

Logstashのoutputでelasticsearchがあり、そこでlocalhostと指定されています。
ここでいうlocalhostはlogstashコンテナのlocalhostになります。
なので、logstashコンテナ内ではElasticsearchが動いていないので、接続できないというエラーになると考えます。

従って、outputのhostにはLogstashが動くコンテナから見てElasticsearchがたっている場所を示す必要があります。

Elasticsearchもコンテナだと仮定しますと、このようなイメージです。(linksの箇所を参照)
dockerコマンドだと、 --linkを使うイメージですね。

version: '2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.4.2
    container_name: elasticsearch
    environment:
      - cluster.name=docker-cluster
      - discovery.type=single-node
      - bootstrap.memory_lock=true
    # 中略
    ports:
      - 9200:9200
    networks:
      - esnet
  logstash:
    image: docker.elastic.co/logstash/logstash:7.4.2
    container_name: logstash
    depends_on:
      - elasticsearch
    links:
      # elasticsearchコンテナを名前`elasticsearch`でアクセスできるようにしておく
      - elasticsearch:elasticsearch  
    networks:
      - esnet
networks:
  esnet:

そして、logstashの設定で、hostsをこうしておきます。

elasticsearch {
    hosts => ["http://elasticsearch:9200"]
}
1 Like

返信が遅くなってしまい、申し訳ありません。
Dockerの設定のご説明丁寧にご教示いただきありがとうございます。
自分の環境で試して後ほど経過をお伝え致します。