현재 사내 프로그램은 PM2를 사용하여 배포를 하고 있다. 이 때 PM2 로그를 로컬에서 트래킹 하는 것이 아닌, CloudWatch를 사용해서 인스턴스가 아닌 인스턴스 외부에 로그를 저장하고, 거기서 로그를 확인하는 인프라를 간단히 구축해 보았다. 전체적인 기획은 다음과 같다.
- NestJS 로그를 배포 환경에서는 JSON으로 출력하게 하기
- EC2 인스턴스에 Cloudwach Agent 설치
- CloudWatch 에서 로그를 잘 출력하는지 확인하기
해당 시스템 구축 이후 진행한 과정을 정리해 보았다.
먼저 pm2 로그는 ~/.pm2/log 에 쌓이게 된다. 해당 폴더를 조회하면 app 이름을 가진 파일을 확인할 수 있다. 해당 로그 파일을 CloudWatch 에 지속적으로 전송시키면 될 것 같다.
여기서 더 나아가 날짜별로 로그 그룹이 생성되게 시도해 보았으나, 해당 방법은 매 00시마다 CloudwachAgent 서비스를 재시작해야 해서 딱히 좋은 방법은 아닌 것 같았다. 대신 로그 그룹의 보존 기간을 14일로 하고, stdout 과 stderr 를 분리해서 저장하기로 했다.
그 다음으로는 인스턴스에 Cloudwatch Agent를 설치했다. 해당 문서는 다음 링크에서 찾을 수 있다.
다음으로는 Cloudwatch 초기 설정이 필요하다. 이 때 config 파일을 생성할 때 ~ 경로는 사용하지 못한다. 절대 경로를 사용하자. 아래는 내가 사용한 예시 파일이다.
{
"agent": {
"metrics_collection_interval": 10,
"logfile": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log"
},
"metrics": {
"append_dimensions": {
"InstanceId": "${aws:InstanceId}",
"AutoScalingGroupName": "${aws:AutoScalingGroupName}"
},
"metrics_collected": {
"cpu": {
"measurement": [
"cpu_usage_idle",
"cpu_usage_iowait"
],
"metrics_collection_interval": 10,
"resources": [
"*"
]
},
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 10,
"resources": [
"/"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 10
}
}
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": “home/ubuntu/.pm2/logs/로그 파일",
"log_group_name": "로그 그룹 이름",
"log_stream_name": "{instance_id}",
"timezone": "UTC"
},
{
"file_path": “/home/ubuntu/.pm2/logs/에러 로그 파일",
"log_group_name": "에러 로그 그룹 이름",
"log_stream_name": "{instance_id}",
"timezone": "UTC"
}
]
}
}
}
}
설정파일을 적용하고 Cloudwatch Agent를 실행시키면 된다.
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
다음으로는 인스턴스에 IAM 역할을 적용해야 한다. 이 때 EC2에서만 사용할 역할을 만든 후에, 해당 역할에 정책을 추가하여 사용한다. 클라우드 와치에 로그를 생성하는 정책은 다음과 같이 설정했다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams",
"cloudwatch:PutMetricData",
"ec2:DescribeTags",
"ec2:DescribeInstances",
"ec2:DescribeVolumes"
],
"Resource": "*"
}
]
}
해당 정책을 ec2에 연결시켜 두면은, CloudWatch에 로그를 올리고 IMDS 를 통해 인스턴스의 정보를 불러올 수 있다. (IMDS 는 외부 공격에 취약하기 때문에 NACL을 잘 설정해 두어야 한다)
이제 CloudWatch로 가게 되면 로그 스트림이 생기고, Logs instight를 통해서 로그를 필터링 할 수 있을 것이다.
'서버 인프라 > 모니터링' 카테고리의 다른 글
Grafana 에서 graphql을 통해 데이터 받아와서 그래프 그리기 (0) | 2021.12.30 |
---|---|
Grafana에 AWS Cloudwatch 연동하기 (0) | 2021.10.04 |