EC2에서 발생하는 로그를 로컬에서 실행 중인 Elasticsearch로 수집하고 Kibana에서 시각화하는 구조를 구축하는 것이다.
docker-compose.yml
파일을 생성하여 Elasticsearch 서비스를 설정.
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.3
container_name: elasticsearch
environment:
- discovery.type=single-node # 단일 노드로 실행 (클러스터 설정 없이 간단하게)
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 메모리 설정 (512MB로 제한)
- xpack.security.enabled=false # 보안 비활성화 (테스트 용도라 간단하게)
- xpack.security.transport.ssl.enabled=false # SSL 비활성화
ports:
- "9200:9200" # 로컬에서 9200 포트로 접근 가능
volumes:
- elasticsearch_data:/usr/share/elasticsearch/data # 데이터 영구 저장
networks:
- elastic
volumes:
elasticsearch_data:
driver: local
networks:
elastic:
driver: bridge
9200 포트를 로컬에서 접근할 수 있도록 설정하여 외부 애플리케이션이 Elasticsearch에 연결할 수 있게 했다.
Elasticsearch를 실행하려면 다음 명령어를 사용
docker-compose up -d
-d
옵션은 백그라운드에서 실행하라는 뜻
Kibana는 Elasticsearch와 연결된 웹 기반 UI로, 데이터를 시각화하고 조회하는 데 사용된다.
docker-compose.yml
에 Kibana 서비스 설정 추가
version: '3'
services:
kibana:
image: docker.elastic.co/kibana/kibana:8.11.3
container_name: kibana
environment:
ELASTICSEARCH_HOSTS: "http://elasticsearch:9200" # Elasticsearch와 연결
ports:
- "5601:5601" # 로컬에서 5601 포트로 접근 가능
networks:
- elastic # Elasticsearch가 먼저 실행되도록 설정
Kibana를 실행하려면 다음 명령어를 사용
docker-compose up -d
컨테이너 잘 올라갔는지 확인한다.
docker ps
Kibana와 ElasticSearch 두 컨테이너가 모두 Up
상태여야한다.
Elasticsearch는 http://localhost:9200
으로 접속한다. 먼저 Elasticsearch가 작동이 되어야 Kibana로 연결할 수 있기 때문에 잘 작동되면 아래와 같은 화면이 나온다.
Elasticsearch가 잘 작동되면 Kibana의 웹 UI에 접근하려면 웹 브라우저에서 http://localhost:5601
로 접속한다.처음 접속하면 아래와 같이 Kibana 로고와 함께 환영 페이지가 나온다.
Explore on my own
을 클릭하고 Elasticsaerch와 연결했다.
Kibana가 Elasticsearch와 잘 연결됐는지 확인해보자.
GET _cat/indices?v
# Filebeat RPM 패키지 다운로드
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.11.3-x86_64.rpm
# Filebeat 설치
sudo rpm -vi filebeat-8.11.3-x86_64.rpm
sudo vi /etc/filebeat/filebeat.yml
로컬에서 Elasticsearch와 Kibana를 사용하려면 Filebeat를 설정하여 로그를 수집해야한다. 그래서 Filebeat는 Docker 내부에서 실행되는 Elasticsearch에 로그를 전송하도록 설정했다.
Filebeat filebeat.yml
파일에서 Elasticsearch 주소를 로컬에 맞게 설정하면 된다.
# ============================== Filebeat inputs ===============================
filebeat.inputs:
- type: log
enabled: true
paths:
- /home/ec2-user/app.log
- /home/ec2-user/logs/*.log
# ======================= Elasticsearch template setting =======================
setup.template.enabled: true
setup.template.name: "filebeat"
setup.template.pattern: "filebeat-*"
setup.ilm.enabled: false
# ================================== Outputs ===================================
output.elasticsearch:
hosts: ["http://localhost:9200"]
index: "filebeat-%{+yyyy.MM.dd}"
ssl.verification_mode: "none"
# ================================== Logging ===================================
logging:
level: info
to_files: true
files:
path: /var/log/filebeat
name: filebeat
keepfiles: 7
permissions: 0644
Filebeat를 로컬에서 실행하여 Docker로 실행된 Elasticsearch에 데이터를 전송
Filebeat Inputs
type: log
: 입력 타입이 로그 파일임을 지정한다.. Filebeat가 파일에서 로그를 읽어오도록 설정.
enabled: true
: 입력을 활성화하는 설정이다. true로 설정해야 이 입력이 동작한다. fasle로 설정되면 이 입력은 무시된다. 기본값이 true지만 명확하게 하기 위해 넣어줬다.
paths
: Filebeat가 수집할 로그 파일 경로를 지정한다. 리스트 형태로 여러 경로를 설정할 수 있다.
⚠️ 이 경로가 실제로 존재하는지 확인해야 한다. 만약 없으면 Filebeat가 로그를 수집하지 못한다.
ls -l /home/ec2-user/app.log ls -l /home/ec2-user/logs/*.log
Elasticsearch Template
setup.template.enabled: true
: Filebeat가 Elasticsearch에 인덱스 템플릿을 설정할지 여부. 기본값이 true라 생략가능
setup.template.name: "filebeat"
: 템플릿 이름 지정. 이 이름은 템플릿을 식별하는데 사용됨.
setup.template.pattern: "filebeat-*"
: 이 템플릿이 적용될 인덱스 패턴. filebeat-*
패턴에 맞는 인덱스(예: filebeat-2025.04.11
)에 템플릿이 적용
Outputs
hosts: ["http://localhost:9200"]
: EC2에서 localhost:9200
으로 로그를 보내도록 설정. 이건 SSH 리버스 터널링으로 로컬의 Elasticsearch와 연결된다.
index: "filebeat-%{+yyyy.MM.dd}"
: 로그가 저장될 Elasticsearch 인덱스 이름을 지정해 생성 (예: filebeat-2025.04.11
).
ssl.verification_mode: "none"
: SSL 인증서 검증을 비활성화하는 설정
Logging
logging
: Filebeat 자체 로그를 어떻게 기록할지 정의하는 섹션
level: info
: 로그 레벨을 지정. debug
는 버그 발생시 바꿔주는 게 좋음
to_files: true
: Filebeat 로그를 파일로 저장할지 여부. true
로 설정하면 파일로 저장되고, false
면 콘솔로만 출력
files
: 로그 파일 저장에 대한 세부 설정
path: /var/log/filebeat
: 로그 파일이 저장될 디렉토리 경로. /var/log/filebeat
디렉토리에 로그 파일이 생성
name: filebeat
: 로그 파일 이름. filebeat
로 설정하면 /var/log/filebeat/filebeat
라는 파일이 생성된다. 하지만 실제로는 날짜별로 롤링돼서 filebeat-20250411.ndjson
같은 파일이 만들어진다.
keepfiles: 7
: 로그 파일을 몇 개까지 유지할지 지정. 7로 설정하면 최대 7개의 로그 파일을 유지하고, 더 많아지면 오래된 파일부터 삭제된다. 기본값은 7이다.
permissions: 0644
: 로그 파일의 권한을 지정. 0644는 소유자에게 읽기/쓰기 권한, 다른 사용자에게 읽기 권한만 부여한다는 뜻이다. 기본값도 0644라서 생략가능
Filebeat가 EC2에서 localhost:9200
으로 로그를 보내려면, 로컬에서 SSH 리버스 터널링을 설정해야 힌다. 로컬 머신에서 아래 명령어를 실행.
git bash, powershell 등에서는 autossh
를 사용할 수 없고, WSL2(Ubuntu)에서만 사용 가능하다
설치 방법 (WSL2에서)
sudo apt update
sudo apt install autossh -y
설치 후 아래와 같이 실행하면 된다:
autossh -M 0 -N -f -R 9200:localhost:9200 ec2-user@<EC2퍼블릭IP> -i <키페어 경로>
옵션 | 의미 |
---|---|
autossh | SSH 연결을 감시하고 끊어지면 자동 재연결 |
-M 0 | 모니터링 포트 비활성화 (기본 포트 충돌 방지용) |
-N | 원격에서 명령 실행 없이 포트 포워딩만 수행 |
-f | 백그라운드 실행 |
-R 9200:localhost:9200 | EC2의 9200포트를 -> 내 로컬 9200포트로 연결 |
ec2-user@<EC2 퍼블릭 IP> | EC2의 SSH 사용자 및 IP 주소 |
-i <키페어 경로> | EC2에 접속하기 위한 PEM 키 경로 |
Git Bash나 Windows에서 수동 연결 시
ssh -N -f -R 9200:localhost:9200 ec2-user@<EC2퍼블릭IP> -i <키페어 경로>
단, 이 방법은 SSH 연결이 끊기면 자동 재연결이 안 된다는 단점이 있다.
연결 확인
curl http://localhost:9200
로컬에 띄운 Elasticsearch의 JSON 정보가 보이면 연결 성공
Filebeat 서비스 시작
sudo systemctl start filebeat
sudo systemctl enable filebeat # 부팅 시 자동 실행
Filebeat 상태 확인
sudo systemctl status filebeat
Filebeat가 로그를 잘 보내는지 확인
sudo filebeat test output
결과에 talk to server... OK
가 나오면 Elasticsearch와 연결이 잘 된 것이다.
이제 Filebeat가 로그를 로컬의 Elasticsearch로 보내기 시작했을 것이다. Kibana에서 이 로그를 확인하고 시각화할 수 있다. http://localhost:5601
로 Kibana에 접속한다.
Kibana 웹 UI(http://localhost:5601)에 접속.
왼쪽 메뉴에서 "Stack Management" > "Data Views" > "Create data view"로 이동.
2-1. Stack Managemet를 클릭한 후 아래와 같은 화면이 나온다.
2-2. 위 이미지의 파란 동그라미인 Open side navigation을 클릭 해 Kibana 카테고리에 있는 Data Views를 들어간다.
2-3. 처음엔 위와 같은 화면이 나타나는데 빨간줄 부분을 클릭하면 Create data view가 잘 나타난다.
Index pattern에 filebeat-*
를 입력한다.
@timestamp
를 선택한다.처음에는 내 컴퓨터 IP를 EC2에서 접근하게 하려고 했는데, 그게 사설 IP라서 안 되는 거였다. 이걸 모르고 계속 시도하다 보니 같은 설정을 반복하면서 시간만 계속 날렸다. 결국 SSH 리버스 터널링이 필요하다는 걸 깨닫고 적용했더니 한 방에 해결됐다. 이걸 알고 나니 구조 자체는 의외로 간단했다는 걸 알게 되었다.
Filebeat는 생각보다 설정이 단순하고 강력했다. 로그를 파일 경로만 지정해두면 자동으로 수집해서 전송해주고, Kibana에서 바로 확인할 수 있어서 진짜 실시간 로그 모니터링에 최적화된 구조였다.
특히 운영 환경에서 장애가 발생했을 때 빠르게 로그를 확인하고 조치할 수 있다는 점에서, 진짜 실무에서 꼭 필요한 도구라는 생각이 들었다.