
개요
현직자에게 프로젝트 멘토링을 받고 얻은 피드백은, 연결되어있는 외부 api의 서버가 닫혀있거나 하는 등의 문제에 대해 어떻게 대응하고 있냐는 질문이었다.
이에 대해 대책을 내고자 모니터링 환경을 구축했다.
프로젝트 기본 세팅
aws서버에 도커 컨테이너가 올라가있다.
구현
I. EC2-도커 로그 수집 환경 세팅
1) CloudWatch - 로그 수집 설정
- 로그 → 로그 그룹 → 로그 그룹 생성
- 생성한 로그 그룹 눌러서 → 로그 스트림 → 로그 스트림 생성
2) IAM - IAM 역할 및 권한 추가
- 역할 생성
- AWS서비스 → 사용 사례: EC2
- CloudWatchFullAccess 권한 추가 및 정책 선택 → 역할 이름 지정, 생성
3) EC2 - 인스턴스 보안 설정 추가
- 로그를 수집하고자하는 인스턴스 선택 후 상단의 작업버튼 → 보안 → IAM 역할 수정
- 2번에서 생성한 IAM 역할 추가해서 업데이트
4) EC2 - 도커 컨테이너 run 옵션 추가
sudo docker run \
--add-host ${{ secrets.ADDITIONAL_HOST }} \
--log-driver=awslogs \
--log-opt awslogs-group=[로그 그룹 이름] \
--log-opt awslogs-stream=[로그 스트림 이름] \
--log-opt awslogs-region=[지역명] \
-d -p 80:8080 --name [이미지명] \
-e SPRING_PROFILES_ACTIVE=[spring플젝 실행 옵션 설정] \
${{ secrets.DOCKER_USERNAME }}/[이미지명]
- 위 명령어에서 봐야하는 부분은 log가 붙은 부분들이다. 나머지 —add-host나 SPRING_PROFILE 등등은 내 프로젝트에서 필요한 다른 설정들 때문에 추가된 부분이다.
5) CloudWatch - 로그 제대로 수집되나 확인
- 로그 그룹 → 로그 스트림
- 도커 로그 그대로 들어오는지 확인
II. 수집할 로그 필터링
1) CloudWatch - 수집하고자 하는 데이터의 기준 설정
- 로그 그룹 → 지표 필터 → 지표 필터 생성
- 필터 패턴 정의 → 이벤트로 지정할 문자열 지정. 나는 우선 ERROR를 입력해두어 로그에 ERROR라는 문자열이 포함되는 로그를 수집하게 했다.
- 패턴 테스트 → 로그 스트림 지정 후 패턴테스트 진행 → 결과 똑바로 뜨면 성공
- 필터 이름, 지표 네임스페이스, 지표 이름, 지표값 등 설정
- 검토 및 생성
III. 경보와 슬랙 연동
1) Simple Notification Service - 마이크로 서비스 및 서버리스 애플리케이션에 대한 게시/구독 메시징
- 주제 → 주제 생성 (혹은 주제 이름에 이름 작성하고 다음 단계 버튼)
- 유형은 표준, 나머지는 본인이 편한대로 설정
3) AWS chatbot - slack과 연결
- 클라이언트 구성 → 클라이언트 유형: slack
- 연결할 슬랙 채널에 액세스 허용
- Slack 채널: 연결할 채널 ID 입력
- 권한: 채널 역할 선택
- 채널 역할: 템플릿을 사용하여 IAM 역할 생성 → 역할 이름 지정
- 템플릿에 알림권한, Resource Explorer 권한 추가 되어있으면 성공
- 알림: SNS 주제: 아까 생성한 SNS 주제 선택 후 저장(생성)
4) Slack - 채널에 초대
- 연결한 슬랙 채널에 들어가 채팅창에 /invite @aws 를 입력해 aws를 초대
5) AWS chatbot - 슬랙에 테스트 메시지 전송
- 생성된 클라이언트에서 세부정보 → 테스트 메시지 전송 → 연동한 슬랙 채널에 메시지 올라오면 연동 완료
6) CloudWatch - 경보 기준 설정
A분 동안 로그를 수집했을 때, 위에서 정한 지표 필터에 B개 이상의 이벤트가 쌓이면 경보를 발생하겠다고 가정.
- 경보 → 모든 경보 → 경보 생성
- 지표 및 조건 지정
a. 지표 선택 → 위에서 생성한 지표 선택
b. 기간: A분 동안의 로그를 수집해서 경보를 낼 건지 지정
c. 조건: 정적, 보다 크거나 같음
d. …보다: B(숫자)
- 작업 구성
a. 경보 상태 트리거: 경보상태, 기존 SNS 주제 선택, 아까 생성한 SNS 선택
b. 경보 상태 트리거: 데이터 부족, 기존 SNS 주제 선택, 아까 생성한 SNS 선택
i. (이걸 추가해주는 이유는 경보 생성 초기에는 쌓인 데이터가 부족하기 때문에, 실제로 이 경보가 제대로 작동하고 있는지 확인하기가 애매하기 때문이다. 세팅이 완료되고 나면 지워도 된다)
- 이름 및 설명 추가
a. 경보 이름 및 경보 설명 추가
i. 슬랙에서 보게될 이름 및 설명이다.
- 경보 생성
결론

이제 ERROR라는 문구가 포함된 로그는 실시간으로 슬랙으로 받아볼 수 있다.
이제 로그를 수집해서 필터링해서 슬랙으로 전송하는 것까지 완성했다. 다음 할 일은 연동된 외부 api가 다운될 경우의 로그를 어떻게 수집할지 결정하고, 다운된 외부 api를 대체할만한 방안을 구현하는 것이다.
Reference
https://softmoca.tistory.com/333
https://ssyoni.tistory.com/24