네이버 클라우드 플랫폼의 Cloud Data Streaming Service와 Elasticsearch Service를 활용한 로그 수집 및 저장

MyeongSu Kim
NAVER CLOUD PLATFORM
16 min readOct 7, 2020

--

안녕하세요, 네이버 클라우드 플랫폼입니다.

이번 시간에는 네이버 클라우드 플랫폼의 VPC 환경에서 아파치 로그 생성 및 Logstash를 활용하여 Kafka 클러스터를 서비스 하는 Cloud Data Streaming Service에 스트리밍하고 해당 데이터를 Elasticsearch Service에 적재하여 확인하는 시나리오로 진행하겠습니다.

주요 상품 설명

▶Cloud Data Streaming Service 상품은 오픈소스 Apache Kafka는 실시간 스트리밍 데이터 파이프라인 및 애플리케이션 빌드를 위한 오픈 소스 플랫폼으로 Apache Kafka 클러스터를 손쉽게 배포, 보호, 운영 및 확장할 수 있도록 합니다.

▶Elasticsearch Service 상품은 Elasticsearch 클러스터를 손쉽게 배포, 보호, 운영 및 확장하여 로그 분석, 검색, App 모니터링 등을 수행할 수 있도록 제공하고 있는 관리형 서비스입니다.

▶VPC 상품은 클라우드 상에서 논리적으로 격리된 고객 전용 네트워크 공간입니다.

▶Load Balancer 상품은 서버의 성능과 부하량을 고려해 네트워크 트래픽을 다수의 서버로 분산 가능하도록 제공합니다. 애플리케이션 로드밸런서, 네트워크 로드밸런서, 네트워크 프록시 로드밸런서 타입을 선택하여 사용 가능합니다.

※더욱 자세한 서비스 소개는 아래의 링크에서 확인 가능합니다!
Cloud Data Streaming Service : https://www.ncloud.com/product/analytics/cloudDataStreamingService

Elasticsearch Service : https://www.ncloud.com/product/analytics/elasticSearchService

VPC : https://www.ncloud.com/product/networking/vpc

Elasticsearch Service : https://www.ncloud.com/product/networking/loadBalancer

VPC네트워크 생성

먼저 Console에서 VPC 상품의 VPC Management 메뉴에 접속하여 VPC를 생성합니다.

VPC 생성 버튼을 눌러 VPC 이름 및 IPv4 주소의 범위를 CIDR(Classless Inter-Domain Routing) 블록 형태로 입력 합니다. CIDR 표기법에 대한 자세한 정보는 RFC 4632을 참조합니다.

이미지. VPC 생성 정보 입력 팝업

VPC가 생성되면 아래 이미지와 같이 운영중 상태로 보여집니다.

이미지. VPC 리스트

VPC 상품의 Subnet Management 메뉴에 접속하여 Subnet을 생성합니다.

외부 통신을 위한 Public Subnet과 내부 통신 용도의 Private Subnet 두개를 생성합니다.

Subnet 생성 버튼을 눌러 외부와 통신하기 위한 Public Subnet을 생성합니다. Internet Gateway 전용 여부를 Public으로 선택합니다.

이미지- Public Subnet 생성

Public Subnet 생성이 완료되면 Internet Gateway 전용 여부를 Private 로 선택하여 Private Subnet을 생성합니다.

Private Subnet 생성

Subnet 리스트에서 생성된 2개의 Subnet을 확인할 수 있으며, Internet Gateway 전용 여부 표시에 따라 Public/Private 구분 가능합니다.

Subnet 리스트

Cloud Data Streaming Service 생성

Console에서 Cloud Data Streaming Service 상품에 접속하여 클러스터 생성을 클릭합니다.

클러스터 설정을 합니다. 클러스터 이름, Application 버전, CMAK 접속 ID/Password 를 입력합니다.

CMAK(Cluster Manager for Apache Kafka) 는 파티션 추가, 파티션 리발란스, 토픽 생성/삭제, 토픽 리스트, 토픽 설정 업데이트 등 Apache Kafka 클러스터 관리 도구이며, 매니저 노드에 설치되어 제공됩니다.

CMAK : https://github.com/yahoo/CMAK

다음을 눌러 노드 설정 단계로 이동하여 위에서 생성한 VPC, Subnet을 선택하고, 서버 타입 선택 및 스토리지 용량을 입력합니다.

매니저 노드는 Public Subnet 상에 위치하고, Broker 노드는 Private Subnet 상에 위치해야 합니다.

매니저 노드 서버 타입의 경우 매니저 노드에는 현재 CMAK만 설치되므로 최소 사양인 vCPU 2개, 메모리 4GB를 선택 합니다.

Broker 노드 타입을 선택하고, Broker 노드 스토리지 용량을 입력합니다. 각 노드의 스토리지 용량이므로 노드 개수가 3개면 총 300GB의 스토리지 용량이 생성됩니다.

최종 확인 단계를 거쳐 클러스터를 생성합니다.

클러스터 생성이 완료되면, CMAK 접속 도메인 설정 변경을 선택하여 Public 도메인을 활성화 합니다.

Public 도메인 활성화가 완료 되면 아래 화면과 같이 CMAK 접속이 가능합니다.

생성된 클러스터 상세정보에서 Broker 노드 정보 상세 보기를 눌러 Broker 노드정보, Zookeeper 정보, hosts 파일 정보를 확인합니다.

아파치 로그 생성 및 Logstash 연동

위에서 생성한 VPC 및 Subnet에 서버를 생성합니다. (Private Subnet에 생성하면 Bastion host 를 거쳐 접속해야 되기에 여기서는 편의상 Public Subnet으로 생성합니다.)

생성이 완료되면 서버 ACG의 Inbound 정보 및 Outbound 정보를 추가하고 서버에 접속합니다. (여기서는 편의상 Outbound의 목적지 및 모든 범위의 포트를 오픈하였습니다.)

ACG Inbound
ACG Outbound

자세한 서버 생성, 공인IP 사용 및 접근 방법 등은 가이드 문서를 확인하면 도움이 됩니다.

가이드 문서 : https://guide.ncloud-docs.com/docs/ko/compute-compute-1-1-v2

아파치 로그를 생성하기 위해 여기서는 Apache log generator를 사용하여 가상의 로그를 생성하겠습니다. 먼저 Apache log generator를 다운로드 합니다.

아래 git 주소에서 Fake-Apache-Log-Generator를 다운로드 받아 압축을 해제합니다.

https://github.com/kiritbasu/Fake-Apache-Log-Generator

wget https://github.com/kiritbasu/Fake-Apache-Log-Generator/archive/master.zipunzip master.zip

생성되는 아파치 로그를 Cloud Data Streaming Service로 전송하기 위해 Logstash를 설치 및 설정 합니다.

먼저 서버에 python pip 및 java를 설치합니다.

yum install epel-releaseyum install python-pipyum install java-1.8.0-openjdk

Logstash를 다운로드 받고 압축을 해제합니다.

wget https://artifacts.elastic.co/downloads/logstash/logstash-7.9.2.tar.gz tar -zxvf logstash-7.9.2.tar.gz cd logstash-7.9.2

임의의 configure 파일인 logstach-apache.conf 파일을 생성하고, 아래 내용을 입력합니다.

vi logstash-apache.conf

input에는 아파치 로그가 저장되는 path를 입력하고 filter에는 grok 필터를 사전 정의된 COMBINEDAPACHELOG 패턴을 사용하여 자동 match가 되도록 하고, Output에 kafka bootstrap_servers에 내부 IP 정보 및 9092포트 정보를 입력합니다.

input {
file {
path => “/tmp/access_log/*”
start_position => “beginning”
}
}
filter {
grok {
match => { “message” => “%{COMBINEDAPACHELOG}” }
}
date {
match => [ “timestamp”,“dd/MMM/yyyy:HH:mm:ss Z” ]
}
}
output {
kafka {
bootstrap_servers => “192.168.2.6:9092,192.168.2.7:9092,192.168.2.8:9092”
topic_id => “apache-access-logs”
codec => plain {
format => “%{message}”
}
}
stdout { codec => rubydebug }
}

Logstash에서 Cloud Data Streaming Service의 Kafka 클러스터로의 통신이 가능하도록 Cloud Data Streaming Service의Broker 노드 ACG에 아파치 로그를 생성하는 해당 서버의 내부 IP 및 9092 포트를 추가 합니다.

Logstash를 위에서 생성한 설정 파일 기반으로 실행합니다.

bin/logstash -f logstash-apache.conf

Logstash 설정 관련 자세한 내용은 아래 URL을 참고합니다.

Logstash config example : https://www.elastic.co/guide/en/logstash/current/config-examples.html

Logstash input : https://www.elastic.co/guide/en/logstash/current/input-plugins.html

Logstash filter: https://www.elastic.co/guide/en/logstash/current/filter-plugins.html

Logstash output kafka : https://www.elastic.co/guide/en/logstash/current/plugins-outputs-kafka.html

이어서 아파치 로그를 생성하도록 합니다. (실행에 필요한 python 컴포넌트가 없을 경우에는 추가합니다.)

pip install pytz
python apache-fake-log-gen.py -n 0 -o LOG -p /tmp/access_log/sample

로그 파일이 생성되면 Logstash에서 로그 파일을 읽어 Cloud Data Streaming Service에 데이터를 전송합니다.

Cloud Data Streaming Service의 CMAK에 접속하면 Kafka cluster에 수집중인 정보 확인이 가능합니다.

Elasticsearch Service 생성

Console에서 Elasticsearch Service 상품에 접속하여 클러스터 생성을 클릭합니다.

클러스터 설정 단계에서 클러스터 이름, Kibana 접속 ID/Password를 입력합니다.

기 생성한 VPC, Subnet을 선택합니다.

매니저 노드/데이터 노드 서버 타입 선택 및 데이터 노드 스토리지 용량을 입력합니다.

클러스터 생성이 완료되면 로드밸런서를 생성하여 연동합니다.

Console에서 Load Balancer를 선택하여 애플리케이션 로드밸런서를 생성합니다. (네트워크, 네트워크 프록시 로드밸런서로 만들어도 됩니다만 여기서는 애플리케이션 로드밸런서를 선택하였습니다.)

로드밸런서 이름, 네트워크, 부하 처리 성능, 대상 VPC, Subnet을 선택합니다.

이때 로드밸런서는 별도의 로드밸런서용 Subnet을 필요로 하기 때문에 서브넷을 로드밸러서용으로 Subnet을 신규 생성하고 선택합니다.

이후 리스너 설정에서 9200 포트 및 kibana를 위한 80 포트를 추가합니다.

이후 서버 추가 단계에서 Elasticsearch 매니저 서버를 선택하여 연동합니다.

Kafka -> Elasticsearch 데이터 전송을 위한 logstash 생성

동일 VPC에 서버를 하나 생성합니다.

생성한 서버가 Cloud Data Streaming Service의 Kafka 클러스터의 데이터를 접근하여 가져올 수 있도록 위에서 생성한 Cloud Data Streaming Service 상품의 ACG를 오픈합니다.

Elasticsearch에도 접근하여 데이터를 보낼 수 있도록 로드밸런서의 ACG를 오픈합니다.

서버에 접속하여 Cloud Data Streaming Service의 데이터를 Elasticsearch로 전송하기 위한 Logstash 설치 및 설정 합니다.

먼저 서버에 python pip 및 java를 설치합니다.

yum install epel-releaseyum install python-pipyum install java-1.8.0-openjdk

Logstash를 다운로드 받고 압축을 해제합니다.

wget https://artifacts.elastic.co/downloads/logstash/logstash-7.9.2.tar.gztar -zxvf logstash-7.9.2.tar.gzcd logstash-7.9.2

임의의 configure 파일인 logstach-kafka.conf 파일을 생성하고, 아래 내용을 입력합니다.

vi logstash-kafka.conf

input에는 kafka 관련 정보를 입력하고, Output에는 elasticsearch hosts에 로드밸런서 주소 및 9200 포트 정보를 입력합니다.

input {
kafka {
bootstrap_servers => “192.168.2.6:9092,192.168.2.7:9092,192.168.2.8:9092”
topics => [“apache-access-log”]
}
}

filter {
}

output {
elasticsearch {
hosts => [“blog-elastic-lb1–5168440-bf5036eb9ed4.kr.lb.naverncp.com:9200”]
}
stdout { codec => rubydebug }
}

Logstash를 위에서 생성한 설정 파일 기반으로 실행합니다.

bin/logstash -f logstash-kafka.conf

Elasticsearch 상품 대시보드를 확인하면 데이터가 저장되는 부분이 확인 되빈다.

Kibana 확인

Elasticsearch Service에 별도 Public 접속이 가능한 로드밸런서를 추가하여 Elasticsearch Service 마스터 노드에 접속합니다.

index pattern에 logstash-YYYY-MM-DD 인덱스를 추가합니다.

인덱스가 Kibana에 추가되면 Discover에서 확인 가능하며, Kibana 관련 페이지를 참고하여 다양한 기능들을 활용하여 데이터 시각화를 해볼 수 있습니다.

Kibana URL : https://www.elastic.co/kr/products/kibana/features

마무리하며…

네이버 클라우드 플랫폼의 서비스들을 사용해서 아파치 로그에서 생성되는 데이터를 대용량 분산처리 플랫폼인 Cloud Data Streaming Service로 전송하고, 수집되는 데이터를 Elasticsearch 저장소로 보내 검색해보았습니다.

끝까지 읽어 주셔서 감사합니다.

--

--