Object Storage에 저장된 로그를 Elasticsearch로 적재하기
카카오클라우드의 Object Storage에 저장된 로드 밸런서 액세스 로그를 Elasticsearch로 적재하는 방법을 설명합니다.
- 예상 소요 시간: 30분
- 사용자 환경
- 권장 운영 체제: MacOS, Ubuntu
- Region: kr-central-2
- 사전 준비 사항
시나리오 소개
이번 시나리오에서는 Object Storage에 저장된 로드 밸런서의 액세스 로그를 Elasticsearch로 적재하는 방법을 소개합니다. Object Storage에 저장된 로그를 쉽게 포워딩하는 작업에는 실시간 파이프라인 기능을 가진 데이터 수집 엔진 오픈소스인 Logstash를 사용합니다. 주요 내용은 다음과 같습니다.
- Logstash 서버 생성: Logstash를 통해 소스 데이터인 액세스 로그를 저장소인 Elasticsearch로 전송
- Logstash 구성 파일 작성 (S3 Plugin 활용): 카카오클라우드의 Object Storage가 S3 API와 호환되기 때문에 Logstash에서 지원하는 S3 Plugin으로 데이터 적재
- Elasticsearch에 적재된 로그 확인: Object Storage에 쌓이는 액세스 로그가 Elasticsearch에도 동일하게 적재되는지 확인
로그 저장 아키텍처
본 가이드에서는 LB의 액세스 로그를 소스 데이터로 활용하지만, 그 외의 Object Storage에 저장되는 다양한 소스 데이터를 해당 가이드를 참고하여 Elasticsearch에 적재할 수 있습니다.
시작하기 전에
1. Virtual Machine 기반 웹 서비스 환경 준비
이 튜토리얼에서는 웹 서비스가 정상적으로 작동하는 환경에서 생성된 로드 밸런서 액세스 로그를 사용합니다. 따라서, 튜토리얼을 시작하기 전에 Virtual Machine 기반의 웹 서비스 환경을 준비해야 합니다. 실습을 위한 웹 서비스 환경을 새로 구축하는 경우 VM 기반의 웹 서비스 구성 문서를 참고하세요.
2. EC2 Credential 발급
Logstash는 Object Storage에서 데이터를 읽기 위해 S3 Plugin을 사용합니다. 이를 위해 EC2 Credential을 발급받아 접근 권한을 설정해야 합니다.
EC2 Credential 발급 가이드를 참고하여 Access Key
와 Secret Key
를 발급받습니다. 발급받은 키는 Logstash 설정에서 사용되므로 반드시 안전하게 보관하시기 바랍니다.
시작하기
로드 밸런서의 액세스 로그는 기본적으로 Object Storage에 저장됩니다. 이를 Elasticsearch로 적재하면 로그 데이터를 더 효과적으로 분석할 수 있습니다. 이 시나리오에서는 Logstash와 Elasticsearch를 활용하여 액세스 로그의 자동화된 데이터 처리를 구현합니다.
Step 1. 로드 밸런서의 액세스 로그 활성화
로드 밸런서의 액세스 로그는 기본적으로 비활성화되어 있으며, 활성화 후 지정된 Object Storage 버킷에 로그가 저장됩니다. 이후 Elasticsearch로의 적재 설정을 진행할 수 있습니다.
-
카카오클라우드 콘솔 > Beyond Networking Service > Load Balancing > 로드 밸런서 메뉴로 이동합니다.
-
로드 밸런서 목록에서 액세스 로그 설정을 활성화하려는 로드 밸런서의 [더 보기] 아이콘을 클릭합니다.
-
더 보기 메뉴에서 액세스 로그 설정을 클릭합니다.
-
액세스 로그 설정 팝업창에서 [미사용]을 클릭하여 액세스 로그를 활성화합니다.
-
액세스 로그를 저장할 Object Storage 버킷을 선택합니다. 보안을 위해 버킷 생성 시 암호와 옵션을
사용
으로 설정하는 것을 권장합니다. Object Storage 버킷 생성 방법은 Object Storage > 버킷 생성 및 관리 문서를 참고하시기 바랍니다. -
액세스 키 ID를 선택합니다. 선택된 액세스 키 ID는 만료 기한이
지정하지 않음
으로 설정되어 있어야 합니다. 액세스 키 생성은 액세스 키 발급 문서를 참고하시기 바랍니다. -
보안 액세스 키를 입력한 뒤 [적용] 버튼을 클릭합니다.
안내- 액세스 키 생성 시 보안 액세스 키를 별도로 보관해야 합니다.
- 액세스 로그 활성화 시, 로그 저장에 따른 Object Storage 버킷 사용 요금이 적용됩니다. 비용 관리와 로그 유지 기간 설정을 위해 Life Cycle 설정을 권장합니다. 자세한 설명은 Object Storage > Life Cycle 설정 문서를 참고하시기 바랍니다.
Step 2. Elasticsearch 서버 구성
Elasticsearch는 로그 데이터를 저장하고 분석하는 핵심 역할을 합니다. Logstash가 데이터를 적재할 수 있도록 서버를 준비합니다. 이 예제에서는 새로 서버를 생성하는 단계를 안내합니다.
-
기존에 사용 중인 Elasticsearch 서버를 사용하거나 새로 구축합니다. 서버 환경에 맞는 설정은 Elasticsearch 공식문서를 참고합니다.
-
Logstash 서버 혹은 외부에서 Elasticsearch 서버로 데이터를 전송하려면, Elasticsearch 서버의
9200
포트가 열려 있어야 합니다. 아래 표를 참고하여 인바운드 규칙을 추가합니다.프로토콜 출발지 포트 번호 규칙 설명 TCP {Logstash 서버 IP}/32
9200 Logstash 서버가 9200 포트를 통해 Elasticsearch 서버에 접근 가능 안내본 튜토리얼에서는 Elasticsearch 서버가 카카오클라우드 Virtual Machine 인스턴스에 구성되어 있는 상태임을 가정합니다.
Step 3. Logstash 설치 및 설정
Logstash는 Object Storage와 Elasticsearch 간 데이터 전송을 담당합니다.
1. Logstash 서버용 인스턴스 생성
카카오클라우드 Virtual Machine에 Logstash 서버용 VM 인스턴스를 생성합니다.
-
카카오클라우드 콘솔 > Virtual Machine에서 인스턴스 생성 버튼을 클릭합니다.
-
인스턴스 생성 페이지에서 아래의 표에 따라 항목을 설정한 후, 나머지 항목은 필요에 따라 구성합니다.
항목 설정 기본 정보 - 이름: logstash
- 개수: 1이미지 기본 탭의 Ubuntu 24.04 선택 인스턴스 유형 m2a.large 볼륨 루트 볼륨: 10GB 키 페어 프라이빗 키
.pem
형식이며, 새로 생성 또는 기존 키 사용 가능네트워크 - VPC: 환경에 맞는 VPC 선택
- 서브넷: 사전 작업에서 미리 생성한 서브넷 선택
- 보안 그룹: 사전 작업에서 미리 생성한 보안 그룹 선택 -
퍼블릭 IP 연결 가이드를 참고하여 생성한 VM 인스턴스에 퍼블릭 IP를 연결합니다.
-
인스턴스에 Logstash를 설치하기 위해 SSH로 접근합니다.
ssh -i ${key-pair-name}.pem ubuntu@${public-ip-addr}
매개변수 설명 key-pair-name 인스턴스 생성 시 지정한 키 페어에 대한 프라이빗 키 파일명 public-ip-addr 인스턴스에 할당 및 연결된 퍼블릭 IP 주소
2. Logstash 설치
생성한 VM 인스턴스에 Logstash를 설치합니다.
-
VM 인스턴스에 Logstash를 설치합니다.
sudo apt update
sudo apt install openjdk-11-jdk
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg
sudo apt-get install apt-transport-https
echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list
sudo apt-get update && sudo apt-get install logstash
sudo systemctl start logstash
sudo systemctl enable logstash -
설치하고 시작한 Logstash 상태를 확인합니다.
Logstash 정상 작동 확인sudo systemctl status logstash
# 아래와 같이 active (running) 상태면 정상
● logstash.service - logstash
Loaded: loaded (/usr/lib/systemd/system/logstash.service; enabled; preset: enabled)
Active: active (running) since Tue 2024-11-12 01:57:49 UTC; 13s ago
3. 설정 파일 생성
Logstash 설정 파일에 Object Storage 버킷 정보와 Elasticsearch 서버 정보를 작성합니다.
-
설정 파일을 생성합니다.
sudo vi /etc/logstash/conf.d/s3_to_es.conf
-
/etc/logstash/conf.d/s3_to_es.conf
파일에 아래 내용을 작성합니다.input {
s3 {
access_key_id => "${S3_ACCESS_KEY_ID}"
secret_access_key => "${S3_SECRET_KEY}"
bucket => "${BUCKET_NAME}"
endpoint => "https://objectstorage.kr-central-2.kakaocloud.com" # 카카오클라우드 Object Storage S3 호환 엔드포인트
region => "kr-central-2" # 카카오클라우드의 리전 정보
prefix => "KCLogs/" # 읽고자 하는 경로: LB 액세스 로그가 쌓이고 있는 폴더
codec => "json"
additional_settings => {
"force_path_style" => true
}
}
}
filter {
if [message] =~ /\\x/ {
mutate {
gsub => [ "message", "\\x", "" ]
}
}
json {
source => "message"
}
}
output {
elasticsearch {
hosts => ["${ELASTICSEARCH_URL}:${PORT}"]
index => "${INDEX_NAME}"
document_id => "%{time}" # 데이터가 중복되어 쌓이는 것을 방지하기 위한 time 필드
}
}변수 설명 S3_ACCESS_KEY_ID🖌︎ 사전 작업에서 발급받은 액세스 키 ID S3_SECRET_KEY🖌︎ 사전 작업에서 발급받은 시크릿 키 BUCKET_NAME🖌︎ LB 액세스로그가 쌓이고 있는 Object Storage의 버킷 이름 ELASTICSEARCH_URL🖌︎ Elasticsearch가 실행 중인 서버의 IP 주소 PORT🖌︎ Elasticsearch 접속 포트번호 ex. 9200 INDEX_NAME🖌︎ 로그를 저장할 Elasticsearch 인덱스 이름
Step 4. Logstash 실행 및 데이터 확인
Logstash를 실행하고 로그 데이터가 Elasticsearch에 적재되었는지 확인합니다.
-
Logstash 서비스를 재시작합니다.
sudo systemctl restart logstash
-
Logstash 백그라운드 실행 및 로그 파일 출력 명령어를 작성합니다.
sudo nohup /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/s3_to_es.conf > /tmp/logstash_output.log 2>&1 &
-
Logstash 관련 프로세스를 검색하여 프로세스가 정상 실행 중인지 확인합니다.
logstash 관련 프로세스 확인 명령어ps aux | grep logstash
-
로그 파일을 확인하여 에러 로그가 없는지 확인합니다.
로그 파일 확인 명령어tail -f /tmp/logstash_output.log
Step 5. Elasticsearch 에 적재된 로그 확인
아래와 같이 로그 확인 명령어를 사용하여 Elasticsearch에 저장된 로그 데이터를 검색하고 확인합니다. Elasticsearch에 쿼리를 보내면, 특정 인덱스에 저장된 로그 항목들이 반환됩니다. 반환된 로그에는 HTTP 요청, 상태 코드, 타임스탬프 등의 정보가 포함되어 있어, 이를 통해 상세한 로그 데이터를 확인할 수 있습니다.
curl -X GET "${ELASTICSEARCH_URL}:${PORT}/${INDEX_NAME}/_search?pretty&q=*:*"
변수 | 설명 |
---|---|
ELASTICSEARCH_URL🖌︎ | Elasticsearch가 실행 중인 서버의 IP 주소 |
PORT🖌︎ | Elasticsearch 접속 포트 번호 ex.9200 |
INDEX_NAME🖌︎ | 로그를 저장할 Elasticsearch 인덱스 이름 |
{
"took" : 9,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 50,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "lb-access",
"_type" : "_doc",
"_id" : "2024/10/31 11:41:46:41",
"_score" : 1.0,
"_ignored" : [
"event.original.keyword"
],
"_source" : {
"@timestamp" : "2024-11-12T05:46:19.131212407Z",
"request" : "GET http://{}}:80/ HTTP1.1",
"user_agent" : "NiggaBalls",
"lb_id" : "f6277253-efb6-4cb0-9649-2f004e0",
"client_port" : "109.205.213.0:44612",
"time" : "2024/10/31 11:41:46:41",
"request_creation_time" : "2024/10/31 11:41:46:41",
"@version" : "1",
"event" : {
"original" : "{\"project_id\": \"b7554887c015e8690b56baaa5\", \"time\": \"2024/10/31 11:41:46:41\", \"lb_id\": \"f6277253-efb6-4cb0-9649-2f004e0\", \"client_port\": \"109.205.213.0:44612\", \"target_port\": \"172.16.3.172:80\", \"target_status_code\": \"200\", \"request\": \"GET http://{}}:80/ HTTP1.1\", \"user_agent\": \"NiggaBalls\", \"ssl_cipher\": \"-\", \"ssl_protocol\": \"-\", \"request_creation_time\": \"2024/10/31 11:41:46:41\"}"
},
"target_port" : "172.16.3.172:80",
"ssl_protocol" : "-",
"ssl_cipher" : "-",
"target_status_code" : "200",
"project_id" : "b7554887c015e8690b56baaa5"
}
},
...