ELK Stack (on Docker) 개발 환경 셋팅 및 CSV 데이터 추출 파이프라인 구축하기

bradley·2022년 5월 28일
4

ELK

목록 보기
1/8

ELK Stack이란?

ELKElasticsearch, Logstash, Kibana를 말한다. ELK는 log 분석을 하기 위해 세계적으로 사용하는 인기있는 log 관리 platform 중 하나다. ELK 중 Logstash는 input source으로부터 logging data나 다른 event들을 추출한다. Logstash는 그 event들을 처리하고 그 data들을 Elasticsearch에 저장한다.

Kibana는 Elasticsearch의 log에 access하는 시각화 Tool이다. 그리고 user에게 선 그래프, 바 그래프, 파이 차트 등의 형태로 보여준다.

ELK Stack의 기본 흐름

Logstash는 log가 쌓여있는 모든 원격 source로부터 데이터를 수집하고, Elasticsearch로 push한다.

Elasticsearch는 수집된 data의 database 역할을 한다.
Kibana는 Elasticsearch로부터 그 data를 사용해 사용자에게 바 그래프, 파이 차트, 히트맵과 같은 형태로 표현한다.

ELK stack Image를 활용하여 CSV 데이터 가져오기

1. Directory Tree

Directory 구조와 config 파일들은 다음과 같다. 해당 Directory는 아래 경로에서 받을 수 있다.
https://github.com/jeongseok912/ELK

하지만 지금 다른 directory 및 file은 살펴보지 않고, docker-elk 디렉토리 구조에 대해 살펴본다.

어떻게 동작할지 정의하고 사용하는 Directory와 File은 다음과 같다.

docker-elk						: ELK config 파일 및 Docker 관련 설정 Directory
├── elasticsearch				: Elasticsearch config 파일 및 Docker Image 설정 directory
│   ├── config
│   │   └── elasticsearch.yml	: Elasticsearch config 파일
│   └── Dockerfile 				: Elasticsearch Docker Image를 빌드하기 위한 파일
├── kibana 						: Kibana config 파일 및 Docker Image 설정 Directory
│   ├── config
│   │   └── kibana.yml` 		: Kibana config 파일
│   └── Dockerfile 				: Kibana Docker Image를 빌드하기 위한 파일
├── logstash 					: Logstash config 파일, pipeline, data, Docker Image 설정 Directory
│   ├── config
│   │   └── logstash.yml 		: Logstash config 파일
│   ├── input_data 				: Logstash로 추출 및 처리할 입력 데이터 Directory
│   ├── pipeline 				: Logstash pipeline들을 정의하는 Directory
│   │   └── logstash.conf 		: Pipeline 정의 File
│   └── Dockerfile 				: Logstash Docker Image를 빌드하기 위한 파일
└── docker-compose.yml 			: ELK Docker Image를 빌드하고, container 설정을 정의하는 File

2. ELK config 파일 및 Docker 관련 파일 정의

elasticsearch.yml

## Default Elasticsearch configuration from Elasticsearch base image.
## https://github.com/elastic/elasticsearch/blob/master/distribution/docker/src/docker/config/elasticsearch.yml
#
cluster.name: "docker-cluster"
network.host: 0.0.0.0

## X-Pack settings
## see https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-xpack.html
#
xpack.license.self_generated.type: trial
xpack.security.enabled: true
xpack.monitoring.collection.enabled: true

Dockerfile (in elasticsearch)

ARG ELK_VERSION

# https://www.docker.elastic.co/
FROM docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}

# Add your elasticsearch plugins setup here
# Example: RUN elasticsearch-plugin install analysis-icu

Kibana.yml

## Default Kibana configuration from Kibana base image.
## https://github.com/elastic/kibana/blob/master/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.js
#
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true

## X-Pack security credentials
#
elasticsearch.username: elastic
elasticsearch.password: changeme

Dockerfile (in kibana)

ARG ELK_VERSION

# https://www.docker.elastic.co/
FROM docker.elastic.co/kibana/kibana:${ELK_VERSION}

# Add your kibana plugins setup here
# Example: RUN kibana-plugin install <name|url>

logstash.yml

## Default Logstash configuration from Logstash base image.
## https://github.com/elastic/logstash/blob/master/docker/data/logstash/config/logstash-full.yml
#
http.host: "0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]

## X-Pack security credentials
#
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: changeme

logstash.conf

input {
    tcp {
		port => 5000
	}
    file {
        path => "/usr/share/logstash/input_data/covid-19-all.csv"
        start_position => "beginning"
        sincedb_path => "NUL"
    }
}
filter {
    csv {
        separator => ","
        columns => ["Region","Province","Latitude","Longitude","Confirmed","Recovered","Deaths","Date"]
    }
    date {
        match => ["Date", "YYYY-MM-dd"]
        target => "Date"
    }
    mutate {
        convert => {"Confirmed" => "float"}
        convert => {"Recovered" => "float"}
        convert => {"Deaths" => "float"}
        convert => {"Longitude" => "float"}
        convert => {"Latitude" => "float"}
    }
    mutate {
        rename => {
            "Longitude" => "[location][lon]"
            "Latitude" => "[location][lat]"
        }
    }
}
output {
    elasticsearch {
        hosts => "elasticsearch:9200"
		user => "elastic"
		password => "changeme"
        index => "covid-19-all-%{+dd.MM.YYYY}"
    }
    stdout {codec => json_lines}
}

Dockerfile (in logstash)

ARG ELK_VERSION

# https://www.docker.elastic.co/
FROM docker.elastic.co/logstash/logstash:${ELK_VERSION}

# Add your logstash plugins setup here
# Example: RUN logstash-plugin install logstash-filter-json

docker-compose.yml

version: '3.2'

services:
  elasticsearch:
    build:
      context: elasticsearch/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./elasticsearch/config/elasticsearch.yml
        target: /usr/share/elasticsearch/config/elasticsearch.yml
        read_only: true
      - type: volume
        source: elasticsearch
        target: /usr/share/elasticsearch/data
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      ES_JAVA_OPTS: "-Xmx256m -Xms256m"
      ELASTIC_PASSWORD: changeme
      # Use single node discovery in order to disable production mode and avoid bootstrap checks
      # see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
      discovery.type: single-node
    networks:
      - elk

  logstash:
    build:
      context: logstash/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./logstash/config/logstash.yml
        target: /usr/share/logstash/config/logstash.yml
        read_only: true
      - type: bind
        source: ./logstash/pipeline
        target: /usr/share/logstash/pipeline
        read_only: true
      - type: bind
        source: ./logstash/input_data
        target: /usr/share/logstash/input_data
    ports:
      - "5000:5000/tcp"
      - "5000:5000/udp"
      - "9600:9600"
    environment:
      LS_JAVA_OPTS: "-Xmx256m -Xms256m"
    networks:
      - elk
    depends_on:
      - elasticsearch

  kibana:
    build:
      context: kibana/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./kibana/config/kibana.yml
        target: /usr/share/kibana/config/kibana.yml
        read_only: true
    ports:
      - "5601:5601"
    networks:
      - elk
    depends_on:
      - elasticsearch

networks:
  elk:
    driver: bridge

volumes:
  elasticsearch:

3. ELK 서비스 실행 및 CSV 추출 데이터 확인

1) docker-compose를 이용한 ELK container 구동

docker-compose.yml 파일이 있는 docker-elk Directory에서 아래 명령어 실행

docker-compose up --build
# or
docker-compose up -d --build 
  • -d 옵션을 쓰면 elasticsearch, logstash, kibana container가 구동되다가 중단되는 경우의 container 에러를 찾기 어렵다.
  • --build 이미지를 문제없이 한 번 빌드했다면 굳이 이 옵션을 추가할 필요는 없다.

docker ps 명령으로 container 정상 동작 확인

각 서비스가 docker-compose 명령으로 실행 후 아래와 같이 3개 container가 구동되어야 하지만 config 파일 등의 설정을 잘못하면 중간에 container가 종료되기도 한다.

2) Elasticsearch 서비스 실행 확인

인터넷 브라우저에서 localhost:9200 로 이동

계정은 config 파일을 바꾸지 않았다면 아래와 같다.

사용자 이름 : elastic

암호 : changeme

정상적으로 구동되면 다음과 같은 화면을 볼 수 있다.

3) Logstash pipeline을 통해 CSV에서 추출한 데이터 확인

Logstash pipeline을 통해 추출한 데이터를 확인한다는 것은 결국 Elasticsearch에 데이터가 잘 저장되어 있는지 확인하는 작업이다.

localhost:9200/_cat/indices 로 이동한다.

logstash.conf 파일 정의에 보면 path => "/usr/share/logstash/input_data/covid-19-all.csv" 를 통해 covid-19-all.csv 파일을 가져오고, index => "covid-19-all-%{+dd.MM.YYYY}" 를 통해 Elasticsearch에 뒤에 날짜를 붙인 이름으로 index를 생성하였다.

Elasticsearch에 데이터가 저장된 걸 확인할 수 있다(노란색 마킹)

localhost:9200/[index 이름]으로 이동하면 어떻게 저장되었는지 index의 상세 정보를 확인할 수 있다.

4) Kibana 서비스 실행 확인

http://localhost:5601 로 이동하여 Log in을 해준다.

계정은 config 파일을 변경하지 않으면 위에서 보았던 계정과 동일하다.

Username : elastic

Password : changeme

5) Logstash를 통해 CSV에서 추출한 데이터 Kibana에서 확인

왼쪽 네비게이션에서 [Management] - [Index Management]에 들어가면 CSV에서 추출한 데이터로 저장한 index가 보이는 걸 확인할 수 있다.

profile
데이터 엔지니어링에 관심이 많은 홀로 삽질하는 느림보

1개의 댓글

comment-user-thumbnail
2023년 7월 24일

감사합니다 많은 도움이 되었습니다~!

답글 달기