-
AWS ECS ELK, with FilebeatAWS/CI CD 구축 2022. 8. 13. 01:45728x90
아이디어 & 구성
1) AWS ECS 의 ex. /var/log/ecs , 그 외 경로의 여러 로그를 filebeat가 수집하여 logstash로 전송한다.
2) logstash는 해당 로그를 받아 elastic search에게 전송 이후 kibana로 관찰
3) rest api 서버가 로그를 직접 쏘지 않게 하는 구성이며
4) rest api서버인 spring boot 는 ec2에 logs를 write만 하고, filebeat가 해당 파일을 logstash로 전송한다.
5) ecs 를 사용할 것이므로 rest api server, filebeat, logstash 모두를 Docker 생성 & 배포 해야 한다.
6) 이후 ecs에서 위 컨테이너를 관리한다.
환경
AWS ECS, Docker, filebeat, logstash
로그 수집 흐름도
aws ecs logs -> file beats -> log stash -> elatic search <- kibana 로그 시각화
1) filebeat
먼저 filebeat 구성을 위한 다음 도커파일을 작성한다.
다음과 같이 경로 설정후
filebeat
Dockerfile // 도커파일
config // config 폴더
filebeat.yml // 설정파일
filebeat.yml
# mkdir filebeat # cd filebeat # mkdir config # vi filebeat.yml filebeat.inputs: - type: log enabled: true paths: - "/usr/share/filebeat/dockerlogs/*.json" setup.dashboards.enabled: false output: logstash: hosts: ["{logstash_ip_here}:{log_stash_port_here}"]
여기서 filebeat.inputs의 paths는 filebeat 도커 이미지 생성후 도커 컨테이너 안의 경로를 의미한다.
처음에 이걸 혼동하여 많이 헤딩하였음
( 인터넷 예제들의 경우 구성에 따라 patsh가 host의 경로가 되는 경우가 있어 나의 구성과 달라 혼동되었음)
hosts 경로의 로그를 filebeat 도커 경로에 볼륨 마운트 시키므로 도커 내부 경로가 와야 한다.
이후 output에 logstash의 ec2 ip를 설정한다.
logstash는 private subnet에 위치하므로 보안그룹 5044 등을 인바운드 오픈하여 logstash가 filebeat가 전송하는 트래픽을 허용하도록 한다.
Dockerfile
ROM docker.elastic.co/beats/filebeat:7.15.2 COPY /config/filebeat.yml /usr/share/filebeat/filebeat.yml USER root RUN mkdir dockerlogs RUN chmod go-w /usr/share/filebeat/filebeat.yml RUN chown -R root /usr/share/filebeat
이후 hosts에 존재하는 filebeat.yml 파일을 도커 컨테이너로 복사
filebeat의 dockerlogs 폴더에 hosts의 로그를 마운트 후 logstash로 전송하는 구성이다.
따라서 dockerlogs 경로를 생성해 준다.
이후 도커를 다음과 같이 실행해준다.
실제로는 ECS의 task로 등록하여 실행할텐데 직접 동작 확인하기 위해 다음과 같이 실행하였음
docker run -d --name filebeat -v /var/log/ecs:/usr/share/filebeat/dockerlogs filebeat
-v 옵션을 사용해 host 로그 경로와 도커 컨테이너 경로를 마운트 해준다.
이후 도커로 접속하여 로그가 잘 마운트 되었는지 확인한다.
docker ps [ec2-user@ filebeat]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c41594305f11 filebeat "/usr/bin/tini -- /u…" 38 minutes ago Up 38 minutes filebeat [ec2-user@ filebeat]$ docker exec -it c41594305f11 /bin/sh sh-4.2# ls -la total 127240 drwxr-xr-x 1 root root 18 Aug 12 15:29 . drwxr-xr-x 1 root root 22 Nov 4 2021 .. -rw-r--r-- 1 root root 41 Nov 4 2021 .build_hash.txt -rw-r--r-- 1 root root 13675 Nov 4 2021 LICENSE.txt -rw-r--r-- 1 root root 8602181 Nov 4 2021 NOTICE.txt -rw-r--r-- 1 root root 814 Nov 4 2021 README.md drwxrwxr-x 1 root root 60 Aug 12 15:37 data drwxr-xr-x 2 root root 4096 Aug 12 00:00 dockerlogs -rw-r--r-- 1 root root 3763430 Nov 4 2021 fields.yml -rwxr-xr-x 1 root root 117713232 Nov 4 2021 filebeat -rw-r--r-- 1 root root 165090 Nov 4 2021 filebeat.reference.yml -rw-r--r-- 1 root root 195 Aug 12 15:28 filebeat.yml drwxr-xr-x 1 root root 15 Nov 4 2021 kibana drwxrwxr-x 1 root root 6 Nov 4 2021 logs drwxr-xr-x 1 root root 4096 Nov 4 2021 module drwxrwxr-x 1 root root 4096 Nov 4 2021 modules.d sh-4.2# cd dockerlogs sh-4.2# ls -la total 3928 drwxr-xr-x 2 root root 4096 Aug 12 00:00 . drwxr-xr-x 1 root root 18 Aug 12 15:29 .. -rw-r--r-- 1 root root 1351508 Aug 12 16:19 weblog.json sh-4.2#
filebeat.yml 이 카피된 모습과 dockerlogs 폴더가 생성 & weblog.json 파일이 마운트 되어 있는 모습을 확인 할 수 있다.
나의 경우 weblog.json이 spring boot logback에 의해 남겨진 로그 파일
실제로는 ecs자체의 로그도 수집할 계획이므로 실제 구성에서는 좀 더 다양하게 구성 필요
2) logstash
다른 ec2생성후 인바운드 5044 오픈후 filebeat에서 오는 로그를 수집하다.
다음과 같이 경로 설정후
logstash
Dockerfile // 도커파일
pipeline // pipeline 폴더
logstash.conf // 설정파일
logstash.conf
input { beats { port => 5044 } } output { elasticsearch { hosts => ["https://vpc-elasticsearch_your_address.ap-northeast-2.es.amazonaws.com:443"] user => "your_user_name" password => "your_user_password" ilm_enabled => false index => "test-weblog-%{+YYYY.MM.dd}" document_type => "log" } }
input은 beats에서 5044로 받으므로 위처럼 구성
output은 나의 경우 aws의 opensearch 서비스를 사용하므로 (elastic search를 개발서버에선 선택하였음)
hosts, user, password를 설정한다.
Dockerfile
FROM docker.elastic.co/logstash/logstash-oss:7.10.2 USER root COPY /pipeline/logstash.conf /usr/share/logstash/pipeline/logstash.conf
위와같이 logstash.conf 파일을 도커 내부로 복사한다.
여기서 logstash.conf 파일에 작성된 내용 중 logstash-oss:7.10.2 버전과 호환되지 않는 것이 있어 logstash가 자꾸 부팅후 crash나고 말았다. 좀 더 상세하게 운영하려면 이 부분을 자세히 봐야 함.
docker run -d --name logstash -p 5044:5044 logstash
이후 5044 포트 바인딩 후 logstash를 실행한다.
만약 docker 컨테이너가 종료된다던지 하면 -d 모드를 빼고 로그를 관찰하자
[ec2-user@ip- logstash]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8a944f577123 logstash "/usr/local/bin/dock…" 41 minutes ago Up 41 minutes 0.0.0.0:5044->5044/tcp, :::5044->5044/tcp, 9600/tcp logstash
3) Elastic index pattern 생성
이후 https://localhost:9200/_plugin/kibana/app/management/kibana/indexPatterns 에 접속해 인덱스 패턴을 생성해 준다.
나의 경우 open search는 vpc의 private subnet에 위치하고 있어
bastion을 통해 터널링 이후 접속하였다.
index => "test-weblog-%{+YYYY.MM.dd}" 와 같이 설정하였으므로 인덱스 패턴을
test-weblog-* 으로 설정해준다
filebeat를 통해 logstash로 로그가 전송되었다면 elastic search에서 매칭되는 인덱스 패턴이 나오고
나의 경우 날짜별로 생성하였으므로
weblog-* 로 설정하였다.
이후 kiban의 Discover에 가면 로그들을 확인할 수 있다.
포스트맨으로 로그를 전송 후 refresh하면 잘 뜨는 것을 확인
실제 운영서버에서는 더 다양하게 여러 옵션들을 수정해야 한다.
다른 헤딩하는 누군가에게 도움이 되었으면
728x90'AWS > CI CD 구축' 카테고리의 다른 글
[2] AWS 이용 자동배포 구성하기(ECS, ECR) (0) 2021.08.06 [1] AWS ECS, ECR, Codepipeline 을 이용한 서버 자동 배포 구성하기 (0) 2021.08.03