서버 인프라/모니터링

PM2 와 Cloudwatch 연동하여 로그 확인하기

트리맨스 2024. 12. 26. 01:08
반응형

 

현재 사내 프로그램은 PM2를 사용하여 배포를 하고 있다. 이 때 PM2 로그를 로컬에서 트래킹 하는 것이 아닌, CloudWatch를 사용해서 인스턴스가 아닌 인스턴스 외부에 로그를 저장하고, 거기서 로그를 확인하는 인프라를 간단히 구축해 보았다. 전체적인 기획은 다음과 같다.

 

  1. NestJS 로그를 배포 환경에서는 JSON으로 출력하게 하기
  2. EC2 인스턴스에 Cloudwach Agent 설치
  3. CloudWatch 에서 로그를 잘 출력하는지 확인하기

 

해당 시스템 구축 이후 진행한 과정을 정리해 보았다.


먼저 pm2 로그는 ~/.pm2/log 에 쌓이게 된다. 해당 폴더를 조회하면 app 이름을 가진 파일을 확인할 수 있다. 해당 로그 파일을 CloudWatch 에 지속적으로 전송시키면 될 것 같다. 

 

여기서 더 나아가 날짜별로 로그 그룹이 생성되게 시도해 보았으나, 해당 방법은 매 00시마다 CloudwachAgent 서비스를 재시작해야 해서 딱히 좋은 방법은 아닌 것 같았다. 대신 로그 그룹의 보존 기간을 14일로 하고, stdout 과 stderr 를 분리해서 저장하기로 했다.

 

그 다음으로는 인스턴스에 Cloudwatch Agent를 설치했다. 해당 문서는 다음 링크에서 찾을 수 있다.

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html

 

Install and run the CloudWatch agent on your servers - Amazon CloudWatch

Install and run the CloudWatch agent on your servers After you create your agent configuration file for an IAM role or IAM user, use the following steps to install and run the CloudWatch agent on your servers with that configuration. First, attach an IAM r

docs.aws.amazon.com

 

다음으로는 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를 통해서 로그를 필터링 할 수 있을 것이다.

 

 

 

 

반응형