AWS CloudWatch 를 이용해
여러 서버의 로그 기록을 한 곳에서 모니터링해봅시다!
이번 포스팅에선 대시보드, 시각화, 경보 등은 다루지 않습니다.
또한, CloudWatch 구성 관련 권한을 부여받지 못해
우테코 EC2 인스턴스에 Agent를 설치하여 On-Premise로 활용하고,
개인 AWS CloudWatch를 중앙 모니터링 서버로 활용하는 상황을 가정하고 있으니
이점 참고부탁드립니다!
통합 모니터링 시스템의 필요성
팀 프로젝트를 진행하며, 다른 요구사항을 구현하는 데 쫓기다보니
로그를 통합 관제할 수 있는 시스템을 구축해두지 않아 불편함을 느낀 적이 많았습니다.
매번 로그를 확인하려면 서버에 접속해서 log파일을 열어봐야만 했었어요.
특정 버그를 해결하기 위해 nginx, 개발서버, 운영서버 등등을 오가며 확인해야 한 적도 있었는데요,
이 때에 세 서버를 오가며 로그를 확인해야 해서 정말 불편했답니다.
게다가 22번 포트로 접속해야만 로그를 확인할 수 있는 구조였는데,
22번 포트는 캠퍼스 내에서만 접속이 허용되어 있어서
캠퍼스를 벗어나면 로그를 확인할 수 없는 상황이었습니다.
이는 곧.. 방학이 되어 캠퍼스에 나올 수 없게 되면,
로그를 확인할 수 없게 되는 상황으로 이어지는 것이었죠.
결국, 통합적으로 모니터링할 수 있으면 정말 편하겠다 싶었어요.
그리고 4차 스프린트 요구사항으로 CloudWatch 대시보드 구성이 있었어요.
CloudWatch 에 대하여
CloudWatch는 애플리케이션을 모니터링하고,
시스템 전체 성능 변경에 대응하며,
리소스 사용률을 최적화하고,
운영 상태를 통합하여 보는 데 사용할 수 있는 데이터와 실행 가능한 인사이트를 제공합니다.
공식 문서에 있는 CloudWatch 에 대한 설명입니다.
저의 언어로 이야기해보면 아래와 같습니다.
AWS CloudWatch는,
AWS 내 리소스, On-Premise 리소스들을
한 눈에 모니터링할 수 있게 해주고,
통계, 시각화, 경보 알림 등의 부가기능을 재공하는 AWS의 웹서비스 이다.
즉, 웹 서비스로 제공되는 CloudWatch가 하나의 중앙 서버 역할을 하고요,
모니터링 대상이 되는 서버들에서 중앙 서버로 데이터를 전송하게 구성하는 겁니다.
그러면 중앙 서버에서는 전송된 데이터를 적재하고, 이를 시각화, 통계 등에 사용합니다.
모니터링 대상으로 삼는 서버에는 CloudWatch로 전송하기 위한
Agent를 설치하고, 전송하고자 하는 CloudWatch에 대한 인증/인가 설정을 해주어야 합니다.
그러한 설치, 설정 과정만 거친다면 AWS 내 리소스가 아니어도 통합 모니터링이 가능합니다.
이번 포스팅에선 이러한 AWS 외 서버를 On-Premise 서버라고 칭하겠습니다.
IAM 에 대하여
IAM은 Identity and Access Management 의 약자입니다.
IAM은 AWS 자원에 대한 접근 권한을 안전하게 통제할 수 있게 해주는 웹 서비스입니다.
이를 이용하면, 나의 AWS 자원 일부에 대해 다른 사람에게 권한을 허용할 수 있습니다.
우아한테크코스 레벨3 팀 프로젝트도 이러한 IAM 기능을 이용하여
제한된 권한을 할당받아 프로젝트에 필요한 리소스들에 접근하고 있습니다.
CloudWatch를 구성하려면,
CloudWatch 중앙 서버에 데이터를 write 하기 위한 인증/인가의 절차로서
Agent를 설치하고, IAM 관련 설정을 진행하게 됩니다.
따라서 CloudWatch 관련된 권한 부여를 위한 IAM 생성이 필수입니다.
4차 스프린트 요구사항으로 CloudWatch logs 대시보드 구성이 요구되었지만,
관련한 권한을 부여받지 못해 우테코 내 팀별로 제공된 IAM 계정으로는
이 요구사항을 달성할 수 없었습니다.
그래서 이번 포스팅에선 제 개인 AWS 계정의 CloudWatch를 중앙 서버로 사용하고,
프로젝트에서 사용된 저희팀의 우테코 내 EC2 인스턴스에 Agent를 구축해보겠습니다.
IAM 생성
루트 사용자는 모든 권한을 가진 사용자이고,
IAM 사용자는 루트 사용자에 의해 제한된 권한을 부여받은 사용자입니다.
CloudWatch 서버 역할을 할 개인 AWS 계정을 루트 사용자로 로그인 하여
IAM 권한을 만들어 봅시다. 이 IAM 권한은 개인 AWS 계정의 CloudWatch 서버로
데이터를 write 할 수 있는 권한을 부여할 것이고,
우테코 EC2 인스턴스에 Agent 설치 및 credential 설정 시 사용될 예정입니다.
저는 CloudWatchAgentAdminPolicy를 사용했습니다.
IAM을 생성하면 arn, access_key_id, secret_access_key 등이 생성되는데요,
이 정보를 잘 보관해두셔야 합니다.
SSM 파라미터를 저장하지 않는 옵션을 선택한다면 CloudWatchAgentServerPolicy 권한으로도 충분합니다.
IAM 생성을 완료했다면, IAM 계정으로 전송할 메트릭을 중앙 서버가 수신할 준비가 완료되었다고 생각하시면 됩니다.
자 그럼 이제 정보 취합 대상이 되는 서버에 가서 Agent를 설치함으로써 메트릭을 전송하도록 구성해보시죠.
CloudWatchAgent 구성
모든 과정은 루트 계정에서 진행했습니다
대략적인 과정은 아래와 같습니다.
- CloudWatch Agent 설치
- Credential 저장 및 연결
- CloudWatch Agent에서 사용할 설정 파일을 마법사를 이용해 구성
- CloudWatch Agent 실행
AWS CloudWatch Agent 설치
# ARM64 ubuntu 용
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb
dpkg -i -E ./amazon-cloudwatch-agent.deb
Credential 저장
# 크레덴셜 파일 생성
mkdir ~/.aws
vi ~/.aws/credentials
# 내용 추가 후 저장
[AmazonCloudWatchAgent]
aws_access_key_id = {IAM 엑세스 키 아이디}
aws_secret_access_key = {IAM 시크릿 엑세스 키}
region = ap-northeast-2 # 서울의 리전을 사용하는 경우
Credential 연결
# 크레덴셜 연결 설정 파일 수정
vi /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
# 이하 내용 추가 후 저장
[credentials]
shared_credential_profile = "AmazonCloudWatchAgent"
shared_credential_file = "/root/.aws/credentials"
설정 마법사 설치, 설정 파일 생성
# AWS CLI 설치
apt-get install unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
awscliv2.zip
./aws/install
aws --version
# 설정 파일 생성 마법사 실행
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
# 설정 시작
# linux -> On-Premises -> 쭉 디폴트로 진행
# -> Log file path 에 '/home/ubuntu/logs/**.log' 입력
# 더이상 추가할 파일 없고 SSM 파라미터 스토어에 저장하지 않는다로 마무리
# 생성한 설정 파일 확인하려면
vi /opt/aws/amazon-cloudwatch-agent/bin/config.json
CloudWatchAgent 실행
# 아래 명령어로 실행 전 파일 생성해두어야 오류 안 남
mkdir -p /usr/share/collectd/ && touch /usr/share/collectd/types.db
# 실행 명령어
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m onPremise -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json
# 중지 명령어
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a stop
# CloudWatchAgent 로그 경로
/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log
여기까지 진행하시면 IAM 생성을 통한 서버측 수신 준비와
CloudWatchAgent 실행을 통한 클라이언트측 발신 설정을 완료한 것입니다.
정상 실행 완료되었다면 CPU 이용률 등의 메트릭 정보는 그 즉시 전송되고 있을 것이고요,
설정한 경로에 log파일이 생성되면 그 파일들도 로그 그룹에 작성될 겁니다.
저는 logback 설정을 한 스프링 부트 애플리케이션을 기동함으로써 지정된 경로에 log파일이 생성되게 구성해보았습니다.
대시보드 구성
대시보드는 CloudWatch 중앙 서버에 모인 메트릭, 로그 정보 등을 이용해
데이터를 시각화 하는 과정이라고 생각하시면 됩니다.
전광판을 구성한다고 할까요?
새로운 대시보드를 생성한 뒤,
위젯 유형을 선택하고 위젯에 연동할 데이터를 선택하면 위젯 생성이 완료됩니다.
드래그앤 드랍으로 위치 설정, 끝자락 드래그앤 드롭으로 크기 조절도 가능합니다.
대시보드 수정을 진행한 뒤에는 대시보드 저장을 눌러야 반영되니 꼭 눌러주세요 ㅎ
저는 CPU 사용률, 네트워크 I/O, 로그스트림으로 구성해봤습니다.
전체 구성 과정 영상
참고 자료
- https://bhandarkar.hashnode.dev/aws-cloudwatch-for-on-premise-servers
- https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-premise.html
- https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/troubleshooting-CloudWatch-Agent.html
- https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-common-scenarios.html
- https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html
- https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html
'Server & Infra' 카테고리의 다른 글
Apache JMeter를 이용한 부하 테스트 및 리포트 생성 (3) | 2022.10.06 |
---|---|
AWS 의도하지 않은 요금 환불받기 (2) | 2022.09.29 |
Jenkins, Multibranch-pipeline을 이용한 CD (0) | 2022.09.10 |
Git에 잘못 올린 파일 삭제하기 (0) | 2022.08.29 |
🔒HTTPS 한 스푼 (대칭키, 개인키, 공개키) (2) | 2022.08.22 |