ec2-disk-used-percent 와 ec2-memory-used-percent의 상태가 데이터 부족일 경우 대응 방법

ec2-disk-used-percent 와 ec2-memory-used-percent의 상태가 데이터 부족일 경우 대응 방법

ec2-disk-used-percent 와 ec2-memory-used-percent의 상태가 데이터 부족일 경우 대응 방법에 대해 살펴봤습니다.
2026.06.02

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번 블로그에서는 ec2-disk-used-percent 와 ec2-memory-used-percent의 상태가 데이터 부족일 경우 대응 방법에 대해 살펴봤습니다.

문제 발생

CWAgent를 도입하고 CloudWatch 메트릭으로 CWAgent 네임스페이스의 ec2-disk-used-percent, ec2-memory-used-percent 지표가 정상적으로 수집되는 것을 확인했습니다.

하지만 해당 지표를 기반으로 CloudWatch Alarm을 설정한 이후에도 일정 시간이 지나도록 알람 상태가 데이터 부족(Insufficient data) 으로 유지되는 현상이 발생했습니다.

문제 해결

먼저 다음 명령어로 CWAgent가 정상적으로 동작 중인지 확인했습니다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a status

이어서 설정 파일의 device, fstype 설정 여부가 CloudFormation(Cfn) 템플릿과 일치하는지 확인했습니다.

확인 결과, CWAgent 설정 파일에는 devicefstype을 명시적으로 지정하지 않은 상태였습니다.

CWAgent는 디스크 메트릭을 수집할 때 환경에 따라 device, fstype, path 등의 dimension을 자동으로 포함합니다. 하지만 CloudWatch Alarm에서는 특정 dimension 조합으로 필터링하기 때문에, 실제로 수집된 dimension과 Alarm 설정이 일치하지 않으면 정상적으로 메트릭을 찾지 못하고 데이터 부족(Insufficient data) 상태가 발생할 수 있습니다.

다음은 명령어로 CWAgent config을 확인합니다.

sudo vi /opt/aws/amazon-cloudwatch-agent/bin/config.json

설정된 CWAgent config입니다.

{
  "metrics": {
    "metrics_collected": {
      "mem": {
        "metrics_collection_interval": 300,
        "measurement": ["mem_used_percent"]
      },
      "disk": {
        "metrics_collection_interval": 300,
        "measurement": ["disk_used_percent"],
        "resources": ["/"] // ← path만 지정, device/fstype 없음
      }
    }
  }
}

이후 CloudWatch 콘솔 → CloudWatch → All metrics → CWAgent → disk_used_percent에서 실제 dimension 구성을 확인했습니다.

Dimension Value
device nvme0n1p1
fstype xfs
path /
host ip-xx-x-x-xx.ap-northeast-1.compute.internal

여기서 확인된 핵심 원인은 CloudWatch Alarm 설정에 host dimension이 포함되지 않았다는 점이었습니다.

즉, 실제로 수집된 metric은 device, fstype, path, host 조합으로 구분되는데, Alarm에서는 일부 dimension만 지정되어 있어 동일한 metric series를 찾지 못하면서 Insufficient data 상태가 발생한 것입니다.

수정 방법

수정 방법으로는 CloudFormation(Cfn) 템플릿의 CloudWatch Alarm Dimension에 실제 수집되는 metric dimension과 동일하게 host를 추가합니다.

① EC2MemoryAlarm

Dimensions:
  - Name: InstanceId
    Value:
      Fn::ImportValue: !Sub ${SystemName}-${EnvName}-web
  - Name: host                                              # 추가
    Value: "ip-xx-x-x-xx.ap-northeast-1.compute.internal"  # 추가

② EC2DiskAlarm

Dimensions:
  - Name: InstanceId
    Value:
      Fn::ImportValue: !Sub ${SystemName}-${EnvName}-web
  - Name: path
    Value: "/"
  - Name: device
    Value: "nvme0n1p1"
  - Name: fstype
    Value: "xfs"
  - Name: host
    Value: "ip-xx-x-x-xx.ap-northeast-1.compute.internal"  # 추가

변경 내용 요약

항목 변경 전 변경 후
EC2MemoryAlarm Dimensions InstanceId host
EC2DiskAlarm Dimensions InstanceId host
EC2HostName 없음 Parameter로 추가
DiskDevice, DiskFstype 하드코딩 Parameter로 추가

마무리

이번 이슈는 CWAgent를 통해 CloudWatch 메트릭(ec2-disk-used-percent, ec2-memory-used-percent)이 정상적으로 수집되고 있음에도 불구하고, CloudWatch Alarm이 지속적으로 데이터 부족(Insufficient data) 상태로 유지되는 문제였습니다.

겉으로 보기에는 메트릭 자체는 정상적으로 올라오고 있었기 때문에, 단순한 수집 실패나 CWAgent 설정 문제로 보일 수 있지만 실제 원인은 메트릭 자체가 아니라 Alarm이 참조하는 dimension 구성 불일치에 있었습니다.

CloudWatch Alarm은 metric name만 기준으로 데이터를 찾는 것이 아니라, 해당 metric에 포함된 dimension 조합까지 완전히 일치하는 시계열 데이터를 기준으로 평가합니다. 따라서 실제로 CWAgent가 생성한 metric에는 device, fstype, path, host 등의 dimension이 포함되어 있었지만, Alarm 설정에서는 이 중 일부만 지정되어 있거나 host dimension이 누락된 상태였습니다.

이로 인해 CloudWatch 입장에서는 “해당 조건을 만족하는 metric series가 존재하지 않는 것”으로 판단하게 되고, 결과적으로 실제 데이터가 존재함에도 불구하고 Insufficient data 상태가 발생하게 됩니다.

이번 문제 해결 과정에서 확인된 핵심 포인트는 다음과 같습니다.

  • CWAgent는 환경에 따라 disk metric에 device, fstype, path, host 등의 dimension을 포함하여 전송한다
  • CloudWatch Alarm은 metric name뿐 아니라 dimension 조합이 정확히 일치해야 데이터를 조회할 수 있다
  • 일부 dimension이 누락되면 metric이 존재하더라도 Alarm은 이를 찾지 못하고 데이터 부족 상태가 된다

결과적으로 해결 방법은 단순했습니다. CloudFormation(Cfn) 템플릿의 Alarm 정의에서 실제 CWAgent가 전송하는 metric dimension과 동일하게 host를 포함한 전체 dimension 구성을 맞춰주는 것이었습니다.

이렇게 dimension 구성을 일치시킨 이후에는 Alarm이 정상적으로 metric을 인식하기 시작했고, 더 이상 Insufficient data 상태가 지속되지 않게 되었습니다.

이번 사례의 핵심은 CWAgent 설정 자체의 문제가 아니라, CloudWatch Alarm에서 metric을 조회하는 방식이 dimension 기반으로 동작한다는 점을 간과한 것입니다. 특히 EC2 환경에서 instance 기반 metric을 구성할 때는 InstanceId뿐 아니라 CWAgent가 실제로 전송하는 dimension 구조까지 함께 고려해야 안정적인 알람 구성이 가능합니다.

결론적으로 CloudWatch Alarm은 “metric이 존재하느냐”보다 “정확히 같은 dimension 조합의 metric이 존재하느냐”에 의해 상태가 결정된다는 점을 이해하는 것이 중요합니다.

5%off
library

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事