지난번에 6주간 했던 푸드트럭 프로젝트는 Nginx를 이용하면서 액세스 로그를 쌓아왔기에, 이를 Kibana로 시각화하고 싶었다.
목표는 이용자들의 인기검색어를 Kibana로 모니터링 해보는 것.
개발 환경
- OS : Ubuntu 18.04.1 LTS
- Nginx : 1.14.0
- Logstash: 7.4.1
- ElasticSearch: Amazon Elasticsearch Service (7.4)
- Kibana: Amazon Elasticsearch Service (7.4)
대략적인 인프라는 (TODO)
Nginx 로그 쌓기
인기검색어를 뽑아내기 위해서는 사용자가 검색했던 데이터를 어딘가에 기록해두어야 한다.
우리 프로젝트는 Nginx로 들어오는 로그를 남긴다.
/etc/nginx/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ...
http {
# ...
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
server {
# ...
}
}
/var/log/nginx/access.log 에 main format으로 남긴다는 말이다.
/var/log/nginx/access.log 는 아래처럼 찍힌다.
1
2
3
4
14.52.151.97 - - [23/Mar/2020:15:41:13 +0000] "GET /favicon.ico HTTP/1.1" 200 292 "https://food-truck.shop/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
14.52.151.97 - - [23/Mar/2020:15:41:13 +0000] "GET /manifest.json HTTP/1.1" 304 0 "https://food-truck.shop/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
14.52.151.97 - - [23/Mar/2020:15:41:13 +0000] "GET /logo192.png HTTP/1.1" 304 0 "https://food-truck.shop/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
// ...
ELK 구축
Amazon Elasticsearch Service 인스턴스 생성하기
AWS의 Amazon Elasticsearch Service는 프리티어로 1년간 무료로 사용할 수 있는 인스턴스가 있다.
인스턴스를 생성하면 아래처럼 Elasticsearch 엔드포인트와 Kibana 주소가 나온다
IAM 사용자 생성하기
Logstash에서 Elasticsearh로 데이터를 전송할 때 유효한 사용자인지를 식별하는 과정이 필요하다.
이를 IAM을 이용하여 해결하려 한다.
- 정책
- 정책 생성
- 서비스: Elasticsearch Service
- 작업: 액세스 레벨 - 쓰기
- 리소스: 특정 - 모두 선택
- 정책 검토
- 이름: «정책 이름»
- 정책 생성
- 사용자
- 사용자 추가
- 사용자 세부 정보 설정
- 사용자 이름: «사용자 이름»
- AWS 액세스 유형 선택
- 액세스 유형: 프로그래밍 방식 액세스
- 권한 설정
- 기존 정책 직접 연결
- «위에서 생성한 정책 이름» 선택
- 기존 정책 직접 연결
- 사용자 세부 정보 설정
- 사용자 추가
액세스 키와 비밀 액세스 키는 나중에 Logstash 설정할 때 사용하니 따로 기록해둔다.
Logstash
Logstash를 우리 프로젝트가 배포되어있는 EC2 인스턴스에 설치한다.
아래 명령어들은 Ubuntu 18.04.1 LTS 기준이다.
Logstash 설치
1
2
> sudo wget https://artifacts.elastic.co/downloads/logstash/logstash-7.4.1.deb
> sudo dpkg -i logstash-7.4.1.deb
플러그인 설치 - Logstash에서 Elasticsearch(Amazon es)로 데이터 전송을 도와주는 플러그인 (output 에서 사용됨.)
1
> sudo /usr/share/logstash/bin/logstash-plugin install logstash-output-amazon_es
Logstash 메모리 설정 변경
Logstash가 실행되면 기본적으로 초기,최대 힙 사이즈가 1GB로 설정되어 있다.
각자 인스턴스 사정에 맞게 힙사이즈를 조정한다.
EC2 프리티어 (t2.micro) 의 경우 램이 1기가라서 줄여놓는 것이 기존 서비스에 영향이 덜 갈 것이다.
/etc/logstash/jvm.options
1
2
3
4
-Xms256M # JVM의 초기 힙 사이즈
-Xmx256M # JVM의 최대 힙 사이즈
# ...
Elasticsearch 로 Access.log 전송하기
이제 Logstash 설정만 해주면 Elasticsearch로 로그를 전송할 수 있다.
/etc/logstash/conf.d/logstash-test.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
input {
file {
path => ["/var/log/nginx/access.log"]
sincedb_path => "/dev/null"
start_position => "beginning"
}
}
filter { }
output {
amazon_es {
hosts => ["search-####-#####.ap-northeast-2.es.amazonaws.com"] # Amazon Elasticsearch service 엔드포인트
region => "ap-northeast-2" # Amazon Elasticsearch service 인스턴스의 지역
index => "nginx-access.log-%{+YYYY.MM}"
aws_access_key_id => '#####################' # 위에서 발급한 사용자 액세스 키
aws_secret_access_key => '##############################' # 위에서 발급한 사용자 비밀 액세스 키
}
}
Logstash 실행
1
> sudo service logstash start
Kibana로 로그 확인
Dev Tools로 확인하기
인덱스명은 nginx* 로, 와일드카드를 사용할 수 있다. (nginx 로 시작하는 인덱스들 모두가 검색 대상이다.)
Discover 로 확인하기
지금껏 Nginx의 Access.log 파일을 Elasticsearch로 넣어보고,
넣은 데이터를 Kibana로 확인하는 작업을 했다.
Comments powered by Disqus.