보안뉴스 실시간 크롤링 및 데이터 시각화 (2019 캡스톤 디자인 프로젝트)
몇몇의 보안뉴스 사이트에서 자동으로 페이지를 크롤링하여, 엘라스틱서치에 저장 후 키바나로 시각화하였습니다.
Docker 를 사용하여 환경 구성.
- logstash == 7.3.2
- elasticsearch == 7.3.2
- kibana == 7.3.2
- python == 3.6.8
- mysql == 8.0.18
1. 뉴스 데이터를 일정시간 마다 자동으로 데이터 크롤링
2. 수집한 데이터를 MySQL에 저장.
3. MySQL에 저장된 뉴스 데이터에서 키워드 3개 추출 후 다시 MySQL에 저장.
4. Logstash를 사용하여 MySQL 데이터를 ElasticSearch에 저장
5. Kibana를 통해서 ElasticSearh에 저장된 데이터를 시각화
6. 웹페이지를 통해 사용자에게 검색 서비스 제공(미구현)
- OS: Ubuntu Server 18.04 LTS (HVM), SSD Volume Type(AWS EC2)
- 권장 사양: RAM 8GB
sudo apt-get update &&
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common &&
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - &&
sudo apt-key fingerprint 0EBFCD88 &&
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" &&
sudo apt-get update
sudo apt-get install docker-ce
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose &&
sudo chmod +x /usr/local/bin/docker-compose
git clone https://github.com/epicarts/team-crawlcrawl.git
깃허브에서 폴더 복제
cd team-crawlcrawl/
다운 받은 폴더로 이동
sudo sysctl -w vm.max_map_count=262144
엘라스틱서치 사용을 위한 메모리 셋팅
sudo docker-compose up --build
도커 컴포즈 실행 및 빌드
모든 도커 서비스가 정상적으로 가동되면 kibana 통해 웹페이지를 통해 접속 할 수 있다.
Docker-compose 에서 기존 5601 port
에서 80 port
로 변경을 하였기 떄문에 로컬 환경에서 웹브라우저를 사용해 127.0.0.1
로 접속할 수 있다.(Chrome 권장)
키바나에서 시각화 방법은 아래 링크 참고해 주시길 바랍니다.
- 블로그 참고: https://epicarts.tistory.com/75
각 도커 서비스 별로 추가적인 설명
python을 기반으로 데이터 자동 수집과 디비 생성, 엘라스틱서치 맵핑 역할 수행
- Dockerfile 파일:
docker/crawling/Dockerfile
- 설정 폴더:
docker/crawling/
python 3.6.8
cron 기능을 사용하기 위한 권한 설정 및 다른 컨테이너와 종속성을 위해 만든 sh 파일
dockerize -wait tcp://db:3306 -wait http://elasticsearch:9200 -timeout 50s.
다른 컨테이너내의 서비스가 실행되기 기다림.init_mapping.py
와create_mysql_table.py
는 기본적으로 실행하는데 오랜 시간이 걸리는데, 이 때문에 50초동안 실행 대기하게 해놓음.
서비스 종속성을 위한 유틸리티
Dockerfile
에서 다운로드 후entrypoint.sh
에서 사용
- 마지막 줄에 엔터를 꼭 쳐야함!(EOF로 인한 동작오류 추정)
dos2unix
안붙이면 로그파일 생성시 파일뒤에?
라는 기호가 추가됨.crawling_code/crontab_python/
에 위치한 코드들을 반복실행crawling_code/nlp_model/keyword_extraction.py
- Docker 이미지 생성시 사용되는 pip install 패키지 목록
데이터 검색 엔진
- Dockerfile 파일:
docker/elasticsearch/Dockerfile
- 설정 폴더:
docker/elasticsearch/
elasticsearch 7.3.2
RUN bin/elasticsearch-plugin install analysis-nori
노리 플러그인 사용을 위해 설치
- 한국어 분석 플러그인 노리(nori)
docker/elasticsearch/userdict_ko.txt
에 원하는 사용자 정의 단어 추가 가능.
MySQL과 Elasticsearch 사이에서 데이터 파이프 라인 역할 수행
- 설정 폴더:
docker/logstash/
Logstash 7.3.2
jdbc-int-sql_last_value.yml
파일 자동 생성(gitignore 등록되어 있음)jdbc-int-sql_last_value.yml
은 MYSQL에서 엘라스틱서치로 넣을 때 현재 넣은 위치를 트래킹해주는 역할을 함.--- 1580101024
UNIX_TIMESTAMP 값으로 구성
- 로그스태시에서 자동으로 실행될 파이프라인 설정 파일들을 모아놓은 폴더
- 폴더째로 동작하기 떄문에 필요없는 데이터를 넣어놓으면 안됨
- input: jdbc 플러그인을 활용하여 MySQL에서 마지막으로 읽은 문서 추적 및 수집
- filter: 필요없는 데이터 삭제 및 가공
- output: Elasticsearch 플러그인을 활용하여 Elasticsearch에 데이터 전달
- jdbc 모듈을 사용하기 위한
mysql-connector-java-5.1.48-bin.jar
파일 위치
- 로그스태시의 기본적인 설정들을 할 수 있는 폴더
크롤러를 사용하여 수집한 데이터를 저장해 놓은 관계형 데이터베이스
Mysql 8.0.18
Elasticsearch에 저장된 데이터를 시각화
kibana 7.3.2