Introduction
현재 운영중인 서비스의 다양한 로그들을 모으고, 활용하기 위한 첫번째 단계로 ELK (ElasticSearch-Logstash-Kibana) 스택을 구축하게 되었다. Ubuntu 18.04 EC2 Instance에 ELK Stack을 구축하는 방식으로 기록한다.
우선 목표는, 구축된 ELK 스택을 통해, Amazon S3에 적재되고 있는 Load Balance의 Access Log를 Kibana에서 확인하는 것이다.
Prerequisites
ELK 스택 구축에 앞서, Ubuntu 18.04 EC2 인스턴스를 생성하고, 해당 인스턴스에 Oracle Java 8 버전을 설치한다.
(참고 : How to install Java on Ubuntu 18.04 Bionic Beaver Linux)
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-set-default
$ java --version # Java 설치 확인Install and Configure the ElasticSearch
ElasticSearch는 현재 Ubuntu 공식 패키지 저장소에서 제공되지 않는다. 따라서, Debian Package를 직접 다운받아 설치하는 것과, Elastic의 Source List를 추가하여, apt를 통해 설치하는 방법이 있다. 패키지 관리의 편의성을 위해 apt를 통해 설치하는 방법을 사용한다.
우선은, ElasticSearch GPG key를 임포트 한다.
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
OKElastic의 Source List를 sources.list.d 폴더에 추가한다.
$ echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
deb https://artifacts.elastic.co/packages/6.x/apt stable mainAPT 업데이트 및 elasticsearch를 설치
$ sudo apt update
$ sudo apt install elasticsearchElastic Search에 대한 외부 Access를 제한하기 위해, Elastic Search의 Configuration 파일의 network.host 값을 아래와 같이 수정한다.
network.host: localhostSystemctl을 통해 elasticsearch 서비스를 실행하고, 서버 부팅 시 자동 실행되도록 한다.
$ sudo systemctl start elasticsearch
$ sudo systemctl enable elasticsearch
Synchronizing state of elasticsearch.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable elasticsearch
Created symlink /etc/systemd/system/multi-user.target.wants/elasticsearch.service → /usr/lib/systemd/system/elasticsearch.service.Curl 명령어를 통해, elasticsearch의 동작 여부를 확인한다.
$ curl -X GET "localhost:9200"
{
"name" : "-cBxsVl",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "zYITLxSjTo2Y_S6kUOvc6Q",
"version" : {
"number" : "6.7.1",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "2f32220",
"build_date" : "2019-04-02T15:59:27.961366Z",
"build_snapshot" : false,
"lucene_version" : "7.7.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}Install and Configure the Kibana Dashboard
Install Kibana
이전에 추가한 Elastic 패키지의 Source를 통해, kibana를 설치할 수 있다. elasticsearch와 마찬가지로, systemctl을 통해 서비스를 실행하고, 서버 부팅시 자동 실행되도록 한다.
$ sudo apt install kibana
$ sudo systemctl start kibana
$ sudo systemctl enable kibanaInstall and Configure Nginx
Kibana Dashboard를 Nginx를 통해 서빙할 것이므로, Nginx를 설치한다. 간단한 인증 기능을 함께 추가하기 위해 apache2-utils 패키지도 함께 설치한다. Nginx에서 사용될 ID/Password를 설정한다.
$ sudo apt-get install -y nginx apache2-utils
$ sudo htpasswd -c /etc/nginx/htpasswd.users adminNginx의 Reverse Proxy를 설정한다. (여기서는 example.com 이라는 호스트명을 가정한다.)
$ sudo vi /etc/nginx/site-available/example.com
/etc/nginx/site-available/example.com
server {
listen 80;
server_name example.com;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/htpasswd.users;
location / {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
$ sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo systemctl restart nginx설치가 완료되면, http://example.com/status 로 접속해 kibana 동작 여부를 확인한다. 이때 로그인을 필요로 하는데, 위에서 생성한 아이디와 비밀번호를 사용한다.
Install and Configure Logstash
Logstash도 마찬가지로 APT를 통해 설치할 수 있다.
$ sudo apt install logstashLogstash를 아래와 같이 설정한다.
$ sudo vi /etc/logstash/conf.d/s3.conf
/etc/logstash/conf.d/s3.conf
input {
s3 {
bucket => "BUCKET_NAME"
region => "REGION"
access_key_id => "ACCESS_KEY_ID"
secret_access_key => "ACCESS_KEY_SECRET"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "elb_logs"
}
}
$ sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t # Test ConfigureLogstash 서버를 실행한다.
$ sudo systemctl start logstashValidation
Logstash가 실행되고, 약간의 잠시 기다리면 kibana를 통해 로그 데이터가 elasticsearch에 반영되었음을 확인할 수 있다.
kibana > management > Index Patterns 메뉴에서, Create Index Pattern버튼을 누르고, Logstash에서 설정한 index 이름(elb_logs)를 입력한다.
Index Pattern 생성
Timestamp 필드 설정
Discover 메뉴에서 로그 데이터 확인
References
AWS ELB Logs from S3 on ELK stack,
How To Install Elasticsearch, Logstash, and Kibana on Ubuntu 18.04
Trouble Shooting
[FORBIDDEN/12/index read-only / allow delete (api)] 오류
kibana에서 Index Pattern을 추가하려고 할 때, 아무런 반응이 일어나지 않는 경우, Chrome Developer 메뉴의 Console 출력을 보니 위와 같은 메세지가 있었다. kibana에서 Index Pattern을 삭제하려고 할 때, 마찬가지의 메세지가 kibana 상에 출력되었다.
이 메세지는, 현재 인스턴스의 Disk Space가 특정 Threshold를 넘어가면, elasticsearch가 Read-Only 모드로 바뀌게 되어 발생하는 메세지로, 인스턴스의 디스크 크기를 늘려주고 아래와 같은 명령어를 kibana > dev tool에서 실행시켜줘야 한다.
PUT _all/_settings
{
"index": {
"blocks": {
"read_only_allow_delete": false
}
}
}grok Filter Customization
사전의 정의된 grok filter 외에도, 정규표현식/grok pattern 등을 활용 하여 필터링을 수행할 수 있다. 이때 Grok Constructor를 활용하여 쉽게 테스트해볼 수 있다.