로컬에서 Elasticsearch + Kibana로 EC2 Filebeat + SSH 리버스 터널링을 통한 로그 수집 및 시각화

송현진·2025년 4월 11일
0

DevOps

목록 보기
1/7

✅ 목표

EC2에서 발생하는 로그를 로컬에서 실행 중인 Elasticsearch로 수집하고 Kibana에서 시각화하는 구조를 구축하는 것이다.

Elasticsearch Docker 설정

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 Docker 설정

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와 잘 연결됐는지 확인해보자.

  • 왼쪽 메뉴에서 ManageMent -> Dev Tools로 이동해서 아래 쿼리를 실행
    GET _cat/indices?v
  • 데이터가 없으면 아무 인덱스도 안 나오지만, 쿼리가 정상적으로 실행되면 연결이 잘 된 것이다.

EC2에 Filebeat 설정

1. Filebeat 설치 (Amazon Linux 2 기준)

# 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

2. Filebeat 설정 파일 수정

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라서 생략가능

3. SSH 리버스 터널링 설정

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 <키페어 경로>
옵션의미
autosshSSH 연결을 감시하고 끊어지면 자동 재연결
-M 0모니터링 포트 비활성화 (기본 포트 충돌 방지용)
-N원격에서 명령 실행 없이 포트 포워딩만 수행
-f백그라운드 실행
-R 9200:localhost:9200EC2의 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 정보가 보이면 연결 성공

4. Filebeat 실행

Filebeat 서비스 시작

sudo systemctl start filebeat
sudo systemctl enable filebeat  # 부팅 시 자동 실행

Filebeat 상태 확인

sudo systemctl status filebeat

5. 로그 전송 테스트

Filebeat가 로그를 잘 보내는지 확인

sudo filebeat test output

결과에 talk to server... OK가 나오면 Elasticsearch와 연결이 잘 된 것이다.

Kibana에서 로그 확인 및 시각화

이제 Filebeat가 로그를 로컬의 Elasticsearch로 보내기 시작했을 것이다. Kibana에서 이 로그를 확인하고 시각화할 수 있다. http://localhost:5601로 Kibana에 접속한다.

📊 Kibana에서 데이터 뷰 생성

  1. Kibana 웹 UI(http://localhost:5601)에 접속.

  2. 왼쪽 메뉴에서 "Stack Management" > "Data Views" > "Create data view"로 이동.

    2-1. Stack Managemet를 클릭한 후 아래와 같은 화면이 나온다.

    2-2. 위 이미지의 파란 동그라미인 Open side navigation을 클릭 해 Kibana 카테고리에 있는 Data Views를 들어간다.

    2-3. 처음엔 위와 같은 화면이 나타나는데 빨간줄 부분을 클릭하면 Create data view가 잘 나타난다.

  3. Index pattern에 filebeat-*를 입력한다.

  • filebeat-2025.04.11 같은 인덱스가 매칭되어야 제대로 Filebeat랑 연결되어있는 것이다.
  1. Timestamp field에서 @timestamp를 선택한다.
  2. "Create data view" 버튼을 눌러 데이터 뷰 생성해주면 잘 생성된 것이다.

✅ 로그 확인

  • Discover 탭으로 이동해서 방금 만든 데이터 뷰를 선택한다.
  • 시간 범위를 조정(예: "Last 1 day")해서 로그가 잘 들어오는지 확인할 수 있다.
  • 로그가 표시되면 성공한 것이다. 이제 필터링이나 시각화를 통해 로그를 분석할 수 있다.

📝 배운점

처음에는 내 컴퓨터 IP를 EC2에서 접근하게 하려고 했는데, 그게 사설 IP라서 안 되는 거였다. 이걸 모르고 계속 시도하다 보니 같은 설정을 반복하면서 시간만 계속 날렸다. 결국 SSH 리버스 터널링이 필요하다는 걸 깨닫고 적용했더니 한 방에 해결됐다. 이걸 알고 나니 구조 자체는 의외로 간단했다는 걸 알게 되었다.

Filebeat는 생각보다 설정이 단순하고 강력했다. 로그를 파일 경로만 지정해두면 자동으로 수집해서 전송해주고, Kibana에서 바로 확인할 수 있어서 진짜 실시간 로그 모니터링에 최적화된 구조였다.

특히 운영 환경에서 장애가 발생했을 때 빠르게 로그를 확인하고 조치할 수 있다는 점에서, 진짜 실무에서 꼭 필요한 도구라는 생각이 들었다.

profile
개발자가 되고 싶은 취준생

0개의 댓글