초보자도 이해하는 AWS Cloudwatch를 이용한 EC2 감시

AWS Cloudwatch를 이용하여 인스턴스의 지표, 로그, 프로세스를 감시하는 방법을 설명한 글입니다.
2022.10.09

안녕하세요 클래스메소드의 수재입니다.
이번 글에서는 AWS Cloudwatch를 이용하여 EC2를 감시하는 방법에 대해 알아보겠습니다.
전체적인 흐름을 빠르게 파악하기 위해 상세한 커맨드 등의 설명은 공식 문서를 소개하는 방식으로 작성하였습니다.

AWS Cloudwatch란?

Amazon CloudWatch는 DevOps 엔지니어, 개발자, 사이트 안정성 엔지니어(SRE), IT 관리자 및 제품 소유자를 위해 구축된 모니터링 및 관찰 서비스입니다. CloudWatch는 애플리케이션을 모니터링하고 시스템 전체 성능 변경에 대응하며 리소스 사용률을 최적화하는 데 필요한 데이터와 실행 가능한 인사이트를 제공합니다 - 공식 페이지

AWS에서 사용되는 다양한 서비스의 지표 및 로그를 통합하여 관리할 수 있는 서비스입니다.
대시보드에 수집한 지표나 로그를 사용자가 원하는 형태로 표시할 수도 있습니다.

수집한 지표를 분석하거나 설정한 임계치를 넘긴다면 AWS SNS와 연계하여 이메일로 통지를 보낼 수 있습니다. 혹은 EC2나 Autoscaling Group 조작과 연계하는 것도 가능합니다.

지표나 로그의 패턴을 기반으로 다른 AWS 서비스와 연계하는 기능은 AWS Eventbridge를 활용하는 것을 추천합니다.

Cloudwatch Agent

EC2에 별다른 조작을 하지 않더라도 다음 지표는 기본적으로 수집하고 있습니다.1

  • CPU 사용률(CPUUtilization)
  • 네트워크 사용률(NetworkIn, NetworkOut)
  • 디스크 성능(DiskReadOps, DiskWriteOps)
  • 디스크 읽기/쓰기(DiskReadBytes, DiskWriteBytes)
  • 상태 확인 지표(StatusCheckFailed, StatusCheckFailed_Instance, StatusCheckFailed_System)

Cloudwatch 콘솔에서 [모든 지표] > [EC2] 에서 원하는 인스턴스의 ID를 검색하며 다음과 같이 기본적으로 수집되고 있는 것을 확인할 수 있습니다.

단순히 인스턴스가 멈추지 않고 가동되고 있는지를 확인하기에는 위의 지표를 감시하는 것만으로 충분 할 지도 모르지만 확실한 모니터링을 위해서는 메모리나 디스크 여유 공간 등의 지표도 모니터링 할 필요가 있습니다.

또한 로그나 프로세스 등을 수집하여 모니터링 해야하는 경우도 상당히 많습니다.
Cloudwatch Agent를 인스턴스에 설치하고 구성 파일을 설정한 후 실행하면 더 많은 지표와 로그 등을 수집할 수 있습니다.

Cloudwatch Agent 설치

Cloudwatch Agent 다음과 같은 방법으로 설치할 수 있습니다. 2

  1. 명령줄을 사용하여 CloudWatch 에이전트 설치
  2. AWS Systems Manager를 사용하여 CloudWatch 에이전트 설치
  3. AWS CloudFormation을 사용하여 새 인스턴스에 CloudWatch 에이전트 설치

1의 경우에는 인스턴스에 직접 접속하여 명령 프롬프트에서 직접 설치하는 방법입니다.
OS 별로 설치 커맨드가 다르니 공식 문서를 확인하여 다운로드 합니다.

2의 경우에는 AWS System Managers(이하 SSM)를 이용하여 인스턴스에 Agent를 설치하는 방법입니다.
이를 위해서는 다음의 사전 작업이 필요합니다.

  • CloudWatchAgentServerPolicy, AmazonSSMManagedInstanceCore 정책이 포함된 IAM 역할 -- 작성한 구성 파일을 SSM Parameter Store에 업로드한다면 CloudWatchAgentServerPolicy대신에 CloudWatchAgentAdminPolicy 정책을 연결
  • Interget Gateway 혹은 Nat Gateway 등을 통하여 인터넷과 통신이 가능하거나 VPC Endpoint가 연결된 서브넷

필요한 IAM 역할 생성은 공식 문서에 잘 설명되어 있으니 참고하시길 바랍니다.
SSM로 인스턴스를 조작하기 위해서는 인터넷과 통신할 수 있는 게이트웨이 리소스가 서브넷의 라우팅 테이블에 추가되어 있어야 합니다. 외부와 통신이 제한된 환경이라면 VPC Endpoint를 사용하는 것도 가능합니다.3
SSM으로 조작이 가능한 경우에는 구성 파일을 Paramete Store에 저장하여 중앙 집중식으로 관리하는 것을 추천합니다.
Parameter Store에 대해서는 아래에서 설명하겠습니다.

Cloudwatch Agent 구성파일 설정

Agent 설치가 끝났다면 어떤 항목을 수집할지 설정하는 구성파일을 작성할 필요가 있습니다.
구성 파일은 agent, metrics, logs의 블록으로 나누어진 JSON 파일입니다. agent 블록은 필수이며 나머지 블록은 필요에 따라 작성하면 됩니다.
각 블록에 대해 설명을 공식 문서에서 빌려오자면 다음과 같습니다.4

  • agent 섹션에는 에이전트의 전체 구성에 대한 필드가 포함되어 있습니다. 마법사를 사용하는 경우 agent 섹션이 생성되지 않습니다.
  • metrics 섹션은 수집하여 CloudWatch에 게시할 사용자 지정 지표를 지정합니다. 에이전트를 사용하여 로그만 수집하는 경우 파일에서 metrics 섹션을 생략할 수 있습니다.
  • logs 섹션은 CloudWatch Logs에 게시되는 로그 파일을 지정합니다. 서버에서 Windows Server가 실행되는 경우 Windows 이벤트 로그에 따른 이벤트가 포함될 수 있습니다.

따라서 다음과 같이 작성됩니다.

{
    "agent": {...
    },
    "metrics": {...
    },
    "logs": {...
    },
}

구성 파일을 작성 한 후 Agent를 실행할 때 구성 파일의 위치를 파라미터로 지정하여야 합니다.

구성 파일을 생성하는 방법은 에이전트 구성 파일 마법사(amazon-cloudwatch-agent-config-wizard)로 작성하거나 수동으로 직접 필요한 내용을 기재하는 방법이 있습니다.
구성 파일 마법사로 작성하면 표준적으로 많이 사용되는 지표5를 수집하도록 간단하게 설정할 수 있습니다.
OS별로 실행하는 방법이 다르니 공식 문서를 참고해주세요.

구성 파일 수동으로 작성해보기

SSM Parameter Store에 지표와 로그, 프로세스 상태를 수집하는 구성 파일을 작성하여 인스턴스에 적용해보겠습니다.

Parameter Store에 파라미터 작성

AWS System Managers 콘솔에서 파라미터 스토어(Parameter Store) 메뉴에 들어간 후 파라미터 생성을 클릭합니다.
파라미터 이름은 AmazonCloudWatch-로 시작해야합니다.
계층이나 유형, 형식은 그대로 두고 값에 구성 파일의 내용을 작성합니다.

수집하는 지표, 로그, 프로세스는 다음과 같습니다.

  • 지표 -- 메모리 사용률, 여유 디스크
  • 로그 -- httpd의 access log, cloudwatch agent의 log
  • 프로세스 상태 -- httpd 프로세스의 카운트, cpu 점유율

구성 파일의 모든 내용은 이 공식 문서에 모두 설명되어 있습니다.

agent 블록

우선 Agent 블록을 작성합니다.

"agent": {
        "metrics_collection_interval": 60,
        "region": "ap-northeast-2"
    },

이 글에서는 지표를 전송할 리전을 ap-northeast-2로 지정하고 60초(default)마다 지표를 수집하도록 설정하였습니다.
설정 가능한 파라미터는 공식 문서에 나와있습니다. agent 자체의 로그 파일을 저장할 위치나 agent를 실행할 유저를 지정할 필요가 있다면 확인해보세요.

metrics 블록

이어서 여유 디스크의 퍼센테이지와 메모리 사용률 지표를 수집하도록 설정합니다.

"metrics": {
        "namespace": "Test/httpinstanceMetrics",
        "metrics_collected": {
            "disk": {
                "measurement": [
                    {"name": "free", "rename": "disk_free_gb", "unit": "Gigabytes"}
                ],
                "ignore_file_system_types": [
                    "sysfs", "devtmpfs"
                ]
            },
            "mem": {
                "measurement": [
                    "used_percent"
                ]
            },
            "procstat": [
                {
                    "pid_file": "/var/run/httpd",
                    "measurement": [
                        "pid_count",
                        "cpu_usage"
                    ]
                }
            ]
        },
        "append_dimensions": {
            "ImageId": "${aws:ImageId}",
            "InstanceId": "${aws:InstanceId}",
            "InstanceType": "${aws:InstanceType}"
        },
        "aggregation_dimensions" : [["ImageId"], ["InstanceId", "InstanceType"],[]]
    },

여유디스크의 퍼센테이지 지표를 수집합니다. 수집할 지표를 name으로 지정하고 수집할 때 변경할 이름을 rename 파라미터에 지정할 수 있습니다. free 지표의 단위는 Bytes가 기본이기 때문에 Percent로 바꾸었습니다. 지원하는 단위는 공식 문서를 확인해주세요.

메모리도 지원하는 지표명을 확인하여 설정합니다.

append_dimensions 파라미터를 설정하면 모든 지표에 필터로 사용할 수 있는 지표(Amazon EC2 지표 차원)가 추가됩니다.
aggregation_dimensions 파라미터를 설정하면 cloudwatch에서 그래프를 확인할 때 설정한 값에 따라 지표를 모아서 볼 수 있습니다.

procstat에 대해서는 아래 프로세스 감시에서 설명하겠습니다.

로그 수집

httpd의 액세스 로그를 수집하도록 설정합니다.

"logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log",
                        "log_group_name": "test_httpd_instance_logs",
                        "log_stream_name": "amazon-cloudwatch-agent.log",
                        "retention_in_days": 400,
                        "timezone": "UTC"
                    },
                    {
                        "file_path": "/var/log/httpd/access_log",
                        "log_group_name": "test_httpd_instance_logs",
                        "log_stream_name": "httpd-access.log",
                        "retention_in_days": 400,
                        "timezone": "UTC"
                            
                    }
                ]
            }
        },
        "log_stream_name": "test_httpd_instance_log_streams"
    }

cloudwatch agent의 로그와 httpd의 access log를 수집하도록 설정했습니다.
retention_in_days를 400으로 설정해서 400일 후에는 로그가 삭제되도록 했습니다. 단, 로그 그룹의 만료 기간을 설정하는 이 파라미터는 인스턴스에 부여된 역할의 정책 중에서 logs:PutRetentionPolicy를 허용하는 구문이 있어야합니다. CloudWatchAgentAdminPolicy, AmazonSSMManagedInstanceCore 정책에는 이 구문이 포함되어 있지 않으므로 별도로 추가해야합니다.
log_group_name에 로그를 모을 그룹을 지정합니다. collect_list에서 stream name이 지정되지 않았다면 마지막 log_stream_name을 따릅니다.
파라미터의 자세한 내용은 공식 문서를 참고해주세요.

프로세스 모니터링

위의 지표 수집에 적혀있던 procstat 블록이 프로세스 감시를 설정합니다.
어떤 프로세스를 감시해야하는지 필터링하는 방법으로는 pid_file, exe, pattern 3가지가 있으며 문서에는 다음과 같이 설명되어 있습니다.6

  • pid_file: 프로세스를 통해 생성된 프로세스 식별 번호(PID)의 이름으로 프로세스를 선택합니다.
  • exe: 정규식 일치 규칙을 사용하여 프로세스 이름이 지정한 문자열과 일치하는 프로세스를 선택합니다. 일치는 “포함”일치입니다. 즉, 일치시킬 용어로 agent를 지정하면 cloudwatchagent와 같은 이름의 프로세스는 해당 용어와 일치합니다. 자세한 내용은 구문을 참조하십시오.
  • pattern: 프로세스를 시작하는 데 사용된 명령줄로 프로세스를 선택합니다. 정규 표현식 일치 규칙을 사용하여 지정된 문자열과 일치하는 명령줄이 있는 모든 프로세스가 선택됩니다. 명령과 함께 사용되는 파라미터 및 옵션을 포함하여 전체 명령줄이 확인됩니다. 일치는 “포함”일치입니다. 즉, 일치시킬 용어로 -c를 지정하면 -config와 같은 파라미터가 있는 프로세스는 해당 용어와 일치합니다.

이 글에서는 httpd라는 프로세스가 실행되는 카운트와 cpu 점유율을 수집하고 있습니다.

Agent 실행

System Managers의 명령 실행(Run Command)에서 명령 실행을 클릭합니다.
그리고 다음과 같이 문서 이름에는 AmazonCloudWatch-ManageAgent, Optional Configuration Location에는 작성한 파라미터의 이름을 기입합니다.
이후 목표로 하는 인스턴스를 선택하고 S3 출력은 체크를 해제한 후 명령을 실행하면 인스턴스의 /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d아래에 ssm_AmazonCloudWatch-ec2testconfig.tmp 라는 구성 파일이 저장되고 Agent가 이 파일을 읽도록 재시작됩니다.

Parameter Store를 쓰지 않는 경우

구성 파일의 내용을 작성한 json 파일을 원하는 위치에 저장합니다. 저장한 위치는 명령어를 실행할 때 필요합니다.
공식 문서에서는 다음과 같이 작성되어 있습니다.

CloudWatch 에이전트 구성 파일을 수동으로 생성하거나 편집하는 경우 이름을 지정할 수 있습니다. 문제를 간단하게 해결할 수 있도록 이름을 Linux 서버에서는 /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json로 지정하고, Windows 서버를 실행하는 서버에서는 $Env:ProgramData\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent.json로 지정하는 것이 좋습니다.
파일을 생성한 후에는 해당 파일을 에이전트를 실행하려고 하는 다른 서버에 복사할 수 있습니다.

그리고 명렁어로 Agent를 실행합니다. OS별로 명령어가 다르니 공식 문서를 참고해주세요.

확인

모든 설정이 잘 되었다면 다음과 같이 로그와 지표를 확인할 수 있습니다.

Test/httpinstanceMetrics라는 네임 스페이스 아래 수집된 지표

test_httpd_instance_logs라는 로그 그룹 아래 수집된 로그

끝으로

이렇게 Cloudwatch를 이용하여 지표, 로그, 프로세스를 수집하고 확인해보았습니다.
위에 설명했듯이 SSM을 활용하여 중앙 집중식으로 관리하는 것을 추천합니다.

수집한 지표나 로그를 활용하여 경보를 생성하는 것도 설정해보시길 바랍니다.
Cloudwatch에 수집한 로그의 패턴을 분석하는 방법은 다음 글을 확인해주세요.

긴 글 읽어주셔서 감사합니다.
오탈자 및 내용 피드백은 언제나 환영합니다. must01940 지메일로 연락 주시면 감사합니다!


본 블로그 게시글을 보시고 문의 사항이 있으신 분들은
클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !


  1. 링크 참고 참고 
  2. 링크 참고 참고 
  3. 링크 참고 참고 
  4. 링크 참고 참고 
  5. 링크 참고 수집하는 지표 목록 
  6. 링크 참고 참고