본문 바로가기

DevOps/Docker

[Docker] 도커로 ELK8버전 사용하기 - 컴도리돌이

728x90

이번에 회사에서 ELK를 도입을 본격적으로 시작하였습니다. 🥺 하지만 올해 초부터 책도 선물 받고 잠깐 열심히 공부했지만, 역시 저란 인간은,, 나태 그 자체였습니다. 그래서 뭐 좀 알고 사용해야 하기 때문에 일단 ELK를 설치하려고 하는데 생각보다 쉽지 않았습니다... ChatGpt는 저를 과대평가하는지 너무 두리뭉실하게 설명해 주는데 저란 인간은 그 문장 하나하나가 너무 힘들었어요. 😓 그래서 후딱후딱 설치하고 실행시켜서 제 프로젝트에 어떻게든 사용법을 터득하려고 합니다. 
 
일단은 저는 도커에서 elk 8 버전을 사용하려고 합니다. elastic.co에서 Elasticsearch랑 kibana, logstash를 설치해서 사용해도 되지만, 계속할 때마다 에러가 발생해서 저는 다음 git에서 조금 더 쉽게 설치하였습니다.
 

GitHub - deviantony/docker-elk: The Elastic stack (ELK) powered by Docker and Compose.

The Elastic stack (ELK) powered by Docker and Compose. - deviantony/docker-elk

github.com

 
일단은 위 깃 레포지토리를 clone을 해줬어요. 

git clone https://github.com/deviantony/docker-elk.git

 
그다음에 docker-compose.yml 파일의 값을 본인에 맞게 수정하면 되는데, 저는 Elasticsearch랑 kinana, logstash를 사용할 것이기 때문에 depends_on 부분에 kinana와 logstash를 추가했습니다. 

 
위와 같이 설정을 추가하고 다음 명령어를 입력했습니다. 

docker-compose up setup
docker-compose up -d

 
그리고 제대로 도커가 실행되었는지 다음 명령어를 입력해서 확인할 수 있어요.

docker ps

 
Running이라고 예쁘게 표시되었네요. 😊 이제 웹사이트에 가서 동작하는지 확인해 볼까요?
https://localhost:9200으로 들어가서 아이디는 elastic, 비밀번호는 changeme를 입력하여 로그인할 수 있습니다.

http://localhost:9200/

 
logstash가 작동하는지 확인하기 위해서 https://localhost:5601로 들어가서, 간단하게 input 파일을 하나 만들어, logstash를 사용해서 elastic search에 넣어보려고 합니다. 일단은 사이트에 접속해 볼까요? 아이디와 비밀번호는 위와 같이 동일해요.

http://localhost:5601/

간단하게 테스트 input 파일을 만들고, 아래와 같이 설정 파일을 생성해 줍니다. 경로는 코드 위에 명시해 놨어요 😎

#./logstash/input/test.csv
aaaaa
bbbbb
ccccc
ddddd

 

#./logstash/pipeline/test.conf
input {
  file {
    path => "/Users/sangjipark/workspace/docker-elk/logstash/input/test.csv"
    start_position => "beginning"
  }
}

filter {
}

output {
  elasticsearch {
    hosts => "elasticsearch:9200"
    user => "logstash_internal"
        password => "${LOGSTASH_INTERNAL_PASSWORD}"
    index => "test"
  }
  stdout {
    codec => rubydebug
  }
}

 

#./logstash/config/pipelines.yml
- pipeline.id: main
  path.config: "/Users/sangjipark/workspace/docker-elk/logstash/pipeline/logstash.conf"
- pipeline.id: test
  path.config: "/Users/sangjipark/workspace/docker-elk/logstash/pipeline/test.conf"

 
위에 파일들을 생성하고, 작성했으면 docker-compose.yml에서 vloume부분을 다음과 같이 수정해 줍니다.

 logstash:
    build:
      context: logstash/
      args:
        ELASTIC_VERSION: ${ELASTIC_VERSION}
    volumes:
      - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro,Z
      - ./logstash/pipeline:/usr/share/logstash/pipeline:ro,Z
      - ./logstash/config/pipelines.yml:/Users/sangjipark/workspace/docker-elk/logstash/config/pipelines.yml:ro,Z
      - ./logstash/input:/Users/sangjipark/workspace/docker-elk/logstash/input:ro,Z

 
이렇게 하고 도커를 종료시키고, 다시 올려줍니다.

docker-compose down
docker-compose up -d

 
그다음 docker ps를 통해서 로그스태시 컨테이너 ID를 확인해서 다음 명령어를 입력해 줘요.

docker exec -it 로그스태시컨테이너ID /bin/bash

 
컨테이너 내부에 들어가서 config/pipelines.yml과 input 디렉터리에서 input.csv가 잘 적용되었는지 확인해 주고, 다음 명령어를 입력해서 로그를 확인해 봅니다.

docker logs <로그스태시컨테이너ID>

 
그러면 아래와 같이 에러가 발생해요. 자세히 보면 접근 권한이 없다고 하네요. 로그 메시지를 자세히 한번 봐볼까요?

[2024-10-01T12:51:55,706][INFO ][logstash.outputs.elasticsearch][main]
[b4dd9facc5488e11de7dbe1abb606b47dccb1017f2a395d50d0a1e78eb6dd02d] 
Retrying failed action {:status=>403, :action=>["index", {:_id=>nil, :_index=>"test", :routing=>nil},
{"@timestamp"=>2024-10-01T12:48:39.236223593Z, "event"=>{"original"=>"ccccc"}, 
"@version"=>"1", "log"=>{"file"=>{"path"=>"/Users/sangjipark/workspace/docker-elk/logstash/input/test.csv"}}, "host"=>{"name"=>"e0559b832c83"}, "message"=>"ccccc"}], :error=>{"type"=>"security_exception", "reason"=>"action [indices:admin/auto_create] is unauthorized for user 
[logstash_internal] with effective roles [logstash_writer] on indices [test], 
this action is granted by the index privileges
[auto_configure,create_index,manage,all]"}}

 
"this action is grantes by the index privileges [auto_configure, create-index, manage, all]" 이 있어야 한다고 하네요. 키바나에 접속해서 해당 권한을 부여해 줍니다.

http://localhost:5601/app/management/security/roles/edit/logstash_writer

 
위와 같이 저장한 다음에 docker-compose down으로 전부 종료해 주고, 다시 docker-compose up -d로 직하여 로그스태시 컨테이너 로그를 확인해 보면 다음과 같이 정상적으로 표시될 것이에요 🙂

 
마지막으로 키바나를 사용해서 test인덱스를 조회해 볼게요. http://localhost:5601/app/dev_tools#/console으로 들어가서 콘솔에 다음 명령어를 치면 test에 인덱스가 잘 걸려있는 것을 확인할 수 있어요.

 
test 인덱스에 doc들은 무엇이 있는지 확인해 보면, 전체 값들이 4개가 있다는 것을 확인할 수 있네요. 추가적으로 test.csv에 값을 추가하면 실시간으로 Elasticsearch에 반영되는 것을 확인할 수 있답니다.