일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 그래프탐색
- DB replication
- 외래키제약조건위반
- 트리셋
- springboot
- 2178
- 프로젝트
- 프로그래머스
- 스케일아웃
- 임베디드타입
- 백준
- fatch
- CS
- 구현
- CPU스케줄링
- 운영체제
- findById
- SpringBatch
- 폰켓몬
- BFS
- 해시
- 산업은행청년인턴
- 코테
- JPA
- 트리맵
- 산업은행it
- flyway
- 파이널프로젝트
- 컴퓨터구조
- Spring JPA
- Today
- Total
나 JAVA 봐라
AWS 서비스로 모니터링 환경 구축하기 본문
AWS CloudWatch를 통해 EC2 인스턴스에 출력되는 로그를 확인하고 특정한 로그 이벤트가 생기면 이메일로 알람이 가도록 한다.
사용 기술
- AWS CloudWatch
- AWS SNS
- AWS Lambda
기본 설정되어 있는 log 확인해보기
먼저 터미널에 찍히는 log를 확인한다.
EC2 터미널에서 아래와 같은 명령어로 log를 확인할 수 있다.
이번 프로젝트에서는 EC2 인스턴스에 Docker container를 띄웠기 때문에 아래와 같은 명령어로 확인했다.
docker logs [옵션] [컨테이너명]
Docker는 container에서 생성된 로그를 자동으로 저장해준다.
도커에서 로그를 남기는 경로를 알기 위해 아래의 명령어를 입력한다.
docker inspect 컨테이너명
엄청나게 많은 정보들이 출력되는데 그 중 LogPath의 경로를 복사한다.
Log는 보통 /var/lib/docker/containers/[컨테이너 ID]/[컨테이너 ID-json.log] 로 저장된다.
/var/lib/docker/containers/73b0439fc69f1122132bf514ac97c8f01eadf14c41f189fa5a1290782c44e2c4/73b0439fc69f1122132bf514ac97c8f01eadf14c41f189fa5a1290782c44e2c4-json.log
sudo cat 명령어로 해당 경로를 확인하면, log를 볼 수 있다.
sudo cat /var/lib/docker/containers/73b0439fc69f1122132bf514ac97c8f01eadf14c41f189fa5a1290782c44e2c4/73b0439fc69f1122132bf514ac97c8f01eadf14c41f189fa5a1290782c44e2c4-json.log
모든 컨테이너의 기본 log file의 사이즈 확인하기
sudo du -h $(docker inspect --format='{{.LogPath}}' $(docker ps -q))
하지만, log 파일이 이렇게 저장된다면 컨테이너가 종료되었을 때 log 파일 또한 삭제되는 문제가 있다.
따라서 컨테이너가 종료되더라도 log 파일은 삭제되지 않도록 하기 위해 처음에는 docker volume을 설정하여 log 파일이 삭제되지 않도록 하려고 했다.
하지만 이런 방법에도 발생되는 문제점을 생각해보면
- log 파일을 확인하려면 터미널에서 로그를 확인해야해서 분석하는 데에 어려움이 있고
- 이 후에 WAS가 늘어난다면, 로그를 한 곳에서 한번에 확인하는 것이 어렵고
- log에 특정 이벤트(ex.ERROR)가 출력되면 알람을 보내기 어렵다.
등의 여러가지 문제점이 있을 것이라 판단하여 AWS의 CloudWatch를 사용하기로 했다.
1. EC2에서 CloudWatch에 액세스할 권한을 부여하기
💡 AWS CloudWatch Logs는 Amazon EC2, AWS CloudTrail, Route 53 및 다른 시스템, 애플리케이션 및 사용자 지정 로그 파일을 모니터링, 저장 및 액세스 해주는 기능을 제공한다. 프리티어의 경우 5GB까지 무료제공된다.
- 로그 이벤트 ( Log event ) : 활동내역을 기록한 로그 하나 하나를 의미한다. 단순히 비교하면 특정 파일의 열 하나하나라고 할 수 있다. 타임스탬프, 메시지 2개의 프로퍼티가 있다.
- 로그 스트림 ( Log streams ): 로그 이벤트의 연속적인 스트림이다. 로그 파일이라고 생각하면 된다.
- 로그 그룹 ( Log groups ): 로그 스트림의 폴더라고 생각하면 된다. 로그 스트림은 로그 그룹의 설정값을 모두 공유한다.
IAM 역할 생성
CloudWatch를 사용하기 위해 EC2에서 CloudWatch에 서비스를 액세스 할 권한을 줘야한다.
AWS에서 IAM → 역할 → 역할 생성에 들어가서 아래와 같은 역할을 생성한다.
💡 AWS Identity and Access Management (IAM)은 AWS에서 제공하는 서비스로, AWS 리소스에 대한 액세스를 안전하게 관리하고 권한을 부여할 수 있도록 도와주는 서비스입니다. IAM을 사용하면 사용자, 그룹, 역할 등을 생성하고, 이들에게 필요한 권한을 부여하여 AWS 서비스 및 리소스에 대한 접근을 제어할 수 있습니다.
다음 버튼을 클릭하면 권한 추가를 할 수 있다.
CloudWatchFullAccess
를 검색하여 추가한다.
구분할 수 있도록 역할 이름을 지정한 후 , 제일 아래의 역할 생성 버튼을 누른다.
이와 같이 역할이 생성된 것을 확인할 수 있다.
CloudWatch 로그 그룹 생성
💡 로그 그룹은 로그 보존 기간, 모니터링 및 액세스 제어 등의 설정을 공유하는 그룹이다. 로그 그룹에서 포함할 수 있는 스트림의 수에는 제한이 없으며, 만약 여러 실행 파일에서 동일한 로그 스트림을 사용 시, 파일이 덮어씌워지는 것이 아니라 누적되는 형식으로 보관된다.
CloudWatch → 로그 그룹 → 로그 그룹 생성 을 통해 그룹 생성을 한다.
프리티어의 경우 5GB까지 무료 제공이라 해서, 로그는 30일간 저장될 수 있도록 설정했다. 이 부분은 각자 서비스에 맞게 설정하면 될 듯 하다!
생성한 로그 그룹을 EC2에 연동하기
EC2 인스턴스에 접속하여, 적용할 인스턴스를 선택하고 우측 상단의 작업 → 보안 → IAM 역할 수정을 클릭한다.
접속한 후 생성한 로그 그룹을 선택하여 IAM 역할 업데이트를 하면, EC2에서 CloudWatch에 액세스할 권한이 생긴다.
2. CloudWatch에서 로그 확인하기
EC2에서 CloudWatch에 액세스할 수 있게 되었으니, 이제 EC2에서 직접 컨테이너를 생성하여 로그를 확인한다.
EC2 터미널에 아래와 같은 명령어를 실행한다. 로그 스트림은 새로 생성되므로 로그 스트림 이름을 새로 정해주면 된다. 나머지 옵션은 실행하는 컨테이너에 따라 추가하여 실행한다.
sudo docker run --name [생성할 컨테이너명] -p [포트] --log-driver=awslogs --log-opt awslogs-region=ap-northeast-2 --log-opt awslogs-group=[로그 그룹 이름] --log-opt awslogs-stream=[로그스트림이름] [실행할 도커 이미지]
docker run --name boot-teachme -p 8080:8080 -v /path/to/host/data:/var/lib/mysql --log-driver=awslogs --log-opt awslogs-region=ap-northeast-2 --log-opt awslogs-group=teachme_log --log-opt awslogs-stream=boot-teachme-log yejinsong/boot-teachme
컨테이너 실행 후 , 생성한 로그 스트림에 들어가면 로그가 저장되는 것을 확인할 수 있다.
3. 특정 로그이벤트 발생 시 이메일 알람 보내기
컨테이너의 로그를 CloudWatch에서 확인할 수 있도록 설정까지 완료했다.
이제 컨테이너를 모니터링 해야하는데, 하루종일 로그만 쳐다보고 있을 순 없다.
그래서 로그에 특정한 키워드가 찍히면 (ex. ERROR) 이메일로 알람을 보내도록 설정 해보았다.
생성해둔 로그 그룹을 체크한 후 작업 → 지표 필터 생성을 클릭한다.
패턴을 생성한다.
우리 프로젝트에서는 로그 이벤트에 ERROR가 찍힐 때 알람이 가도록 하기 위해 %ERROR%로 설정했다.
아래와 같은 ERROR를 모니터링 할 수 있다.
테스트할 로그 데이터를 선택하여 패턴 테스트를 진행할 수 있다. 내가 선택한 로그 데이터에는 아직 ERROR는 없기 때문에 따로 일치하는 항목을 찾을 순 없었다.
[2023-11-15 11:22:41.188] [ERROR] [http-nio-8080-exec-7] org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: The supplied URL, '${url.inflearn.page1', is malformed. Make sure it is an absolute URL, and starts with 'http://' or 'https://'. See https://jsoup.org/cookbook/extracting-data/working-with-urls] with root cause
다음 버튼을 눌러 지표 네임스페이스, 이름, 값을 설정하여 지표를 생성한다.
생성한 지표 필터를 체크한 후 경보 생성을 클릭한다.
통계, 기간, 조건 등을 선택한다.
나는 1분 동안 ERROR가 2번 이상 발생하면 경보 상태가 되도록 설정했다.
주제 이름, 이메일 등을 등록한다.
기존 SNS 주제 선택을 통해, 다른 SNS (ex. 슬랙) 에도 알림을 보낼 수 있다.
입력을 완료했다면 주제 생성 버튼을 누른다. 생성이 되었다면 제일 아래의 주황색 ‘다음’ 버튼을 클릭한다.
경보 이름과 설명을 입력한다.
성공적으로 이메일에 알람이 오는지 확인하기 위해 연결된 로그 스트림에서 작업 → 로그 이벤트 생성을 클릭하여 ERROR 가 포함된 이벤트를 생성한다.
ERROR 이벤트를 많이 생성해줬더니 이메일로 알람이 도착했다.
세부 정보도 정상 → 경보 상태로 변경된다.
이 후 이메일 알람을 슬랙 알람으로 변경했는데 해당 부분은 아래의 링크를 대부분 따라 했다.
[AWS] CloudWatch의 경보를 Slack으로 전달받기
현재 알람에는 로그 이벤트가 출력되지 않아, 알람으로 바로 어떤 에러 로그가 출력되었는지 확인할 수 없다.
다음 글에서는 알람에 에러 로그도 함께 출력해보겠삼 ㅃㅇ
Lambda : 슬랙 알람 함수 → 트리거 : SNS (슬랙 연동)
SNS 슬랙 →
로그 그룹
- 슬랙 알람 그룹 (EC2 로그) → 경보 5개 → 알람 트리거 → SNS 슬랙 알람
- teachme_log 그룹 (was 로그) → 경보 1개 (ERROR) → 알람 트리거 → SNS 슬랙 연동
경보 발생 → SNS 슬랙 → Lambda 메시지 정리 → Slack
참고
'DevOps, MLOps' 카테고리의 다른 글
kubeflow 란? (2) | 2024.06.06 |
---|---|
AWS Lambda에서 CloudWatch Logs 접근하기 (0) | 2024.06.05 |
Github Actions 로 배포 자동화하기 (0) | 2024.06.05 |
DockerHub를 통해 EC2에 Spring boot, mysql 올리기 (3) | 2024.06.05 |
MLOps 개념 정리 (0) | 2024.06.03 |