엘라스틱서치로 인기검색어 모니터링 해보자 (1) - 엘라스틱서치에 액세스로그 쌓기
포스트
취소

엘라스틱서치로 인기검색어 모니터링 해보자 (1) - 엘라스틱서치에 액세스로그 쌓기

지난번에 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 인스턴스 생성하기

스크린샷 2020-03-19 오후 4 41 11

AWS의 Amazon Elasticsearch Service는 프리티어로 1년간 무료로 사용할 수 있는 인스턴스가 있다.

인스턴스를 생성하면 아래처럼 Elasticsearch 엔드포인트와 Kibana 주소가 나온다

image


IAM 사용자 생성하기

Logstash에서 Elasticsearh로 데이터를 전송할 때 유효한 사용자인지를 식별하는 과정이 필요하다.

이를 IAM을 이용하여 해결하려 한다.

  • 정책
    • 정책 생성
      • 서비스: Elasticsearch Service
      • 작업: 액세스 레벨 - 쓰기
      • 리소스: 특정 - 모두 선택
    • 정책 검토
      • 이름: «정책 이름»
  • 사용자
    • 사용자 추가
      • 사용자 세부 정보 설정
        • 사용자 이름: «사용자 이름»
      • AWS 액세스 유형 선택
        • 액세스 유형: 프로그래밍 방식 액세스
      • 권한 설정
        • 기존 정책 직접 연결
          • «위에서 생성한 정책 이름» 선택

image

액세스 키비밀 액세스 키는 나중에 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로 확인하기

image

인덱스명은 nginx* 로, 와일드카드를 사용할 수 있다. (nginx 로 시작하는 인덱스들 모두가 검색 대상이다.)

Discover 로 확인하기

image


지금껏 Nginx의 Access.log 파일을 Elasticsearch로 넣어보고,

넣은 데이터를 Kibana로 확인하는 작업을 했다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

2020년 5주차 회고

엘라스틱서치로 인기검색어 모니터링 해보자 (2) - 엘라스틱서치에 데이터 예쁘게 쌓기

Comments powered by Disqus.