[Docker] 도커로 ELK8버전 사용하기 - 컴도리돌이
이번에 회사에서 ELK를 도입을 본격적으로 시작하였습니다. 🥺 하지만 올해 초부터 책도 선물 받고 잠깐 열심히 공부했지만, 역시 저란 인간은,, 나태 그 자체였습니다. 그래서 뭐 좀 알고 사용해야 하기 때문에 일단 ELK를 설치하려고 하는데 생각보다 쉽지 않았습니다... ChatGpt는 저를 과대평가하는지 너무 두리뭉실하게 설명해 주는데 저란 인간은 그 문장 하나하나가 너무 힘들었어요. 😓 그래서 후딱후딱 설치하고 실행시켜서 제 프로젝트에 어떻게든 사용법을 터득하려고 합니다.
일단은 저는 도커에서 elk 8 버전을 사용하려고 합니다. elastic.co에서 Elasticsearch랑 kibana, logstash를 설치해서 사용해도 되지만, 계속할 때마다 에러가 발생해서 저는 다음 git에서 조금 더 쉽게 설치하였습니다.
일단은 위 깃 레포지토리를 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를 입력하여 로그인할 수 있습니다.
logstash가 작동하는지 확인하기 위해서 https://localhost:5601로 들어가서, 간단하게 input 파일을 하나 만들어, logstash를 사용해서 elastic search에 넣어보려고 합니다. 일단은 사이트에 접속해 볼까요? 아이디와 비밀번호는 위와 같이 동일해요.
간단하게 테스트 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]" 이 있어야 한다고 하네요. 키바나에 접속해서 해당 권한을 부여해 줍니다.
위와 같이 저장한 다음에 docker-compose down으로 전부 종료해 주고, 다시 docker-compose up -d로 직하여 로그스태시 컨테이너 로그를 확인해 보면 다음과 같이 정상적으로 표시될 것이에요 🙂
마지막으로 키바나를 사용해서 test인덱스를 조회해 볼게요. http://localhost:5601/app/dev_tools#/console으로 들어가서 콘솔에 다음 명령어를 치면 test에 인덱스가 잘 걸려있는 것을 확인할 수 있어요.
test 인덱스에 doc들은 무엇이 있는지 확인해 보면, 전체 값들이 4개가 있다는 것을 확인할 수 있네요. 추가적으로 test.csv에 값을 추가하면 실시간으로 Elasticsearch에 반영되는 것을 확인할 수 있답니다.