AWS CLI를 사용하여 CloudWatch 의 이상 탐지(Anomaly Detection) 생성하기

AWS CLI를 사용하여 CloudWatch 의 이상 탐지(Anomaly Detection) 생성하기

2025.07.28

안녕하세요, 임채정입니다.
이번 블로그에서는 AWS CLI를 사용하여 CloudWatch Alarm 의 이상 탐지(Anomaly Detection) 를 생성하는 방법을 설명합니다.

CloudWatch Alarm 의 이상 탐지(Anomaly Detection) 는 과거 데이터의 패턴을 분석하여 비정상적인 패턴을 감지하는 기능입니다.
만약 자세한 내용을 알고 싶다면 아래 블로그를 참고해주세요.
https://dev.classmethod.jp/articles/korean-blog-relay-lim-cloudwatch-alarm-Anomaly-detection/

1. 사전 준비

AWS CLI를 통해 이상 탐지 알람을 생성하기 전에 다음과 같은 사전 준비가 필요합니다.

  • AWS CLI가 설치되어 있어야 합니다.
  • CLI를 실행하는 IAM에 적절한 권한이 할당되어 있어야 합니다.
  • 이상 탐지을 생성할 대상 리소스가 있어야 합니다.

1.1. AWS CLI 설치

AWS CLI는 AWS 서비스를 관리하기 위한 명령형 인터페이스입니다.
AWS CLI를 설치하는 방법은 아래 링크를 참고해주세요.
https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html

1.2. IAM 권한 설정

AWS CLI를 실행하는 IAM 유저에게는 CloudWatch 를 실행할 권한이 필요합니다.
물론 CloudWatch에 대한 모든 권한을 가진 AWS 관리형 IAM 정책인 CloudWatchFullAccess을 부여해도 되지만 권한은 필요한 범위만 할당하는 게 보안상 좋습니다.

다음은 이상 탐지(Anomaly Detector) 생성하고 조회, 삭제 작업을 위해 필요한 권한입니다.

  • cloudwatch:PutAnomalyDetector : 이상 탐지기를 생성/수정
  • cloudwatch:DeleteAnomalyDetector : 이상 탐지기를 삭제
  • cloudwatch:DescribeAnomalyDetectors : 이상 탐지기 정보를 조회

혹은 선택적으로 지표 조회, 태그 관리 등 부가적으로 필요할 수 있습니다. (이번 블로그에서는 사용하지 않습니다.)

  • 지표 조회하고 싶을 때
    • cloudwatch:ListMetrics : 사용 가능한 지표 목록을 조회
    • cloudwatch:DescribeMetrics : 지표의 상세 정보(네임스페이스, 차원, 통계 등)를 조회
  • 태그 관리를 하고 싶을 때
    • cloudwatch:ListTagsForResource : 리소스(알람, 대시보드 등)의 태그를 조회
    • cloudwatch:TagResource : 리소스에 태그를 추가
    • cloudwatch:UntagResource : 리소스에서 태그를 제거

1.3. 대상 리소스 준비

이번 블로그에서는 EC2 인스턴스의 지표 중에 하나를 사용해서 이상 탐지 알람을 생성해보겠습니다.
EC2 인스턴스의 스팩은 아래와 같습니다.

  • 이름 : Anomaly-detection-test
  • OS : Windows_Server 2025
  • 인스턴스타입 : t3.micro

2. 이상 탐지(Anomaly Detector) 생성하기

이상 탐지 생성을 위한 CLI 명령어에 대해서 먼저 알아보겠습니다.

주의해야할 건 이상 탐지(Anomaly Detector)와 이상 탐지 알람(Anomaly Detection alarm)은 다릅니다.
이상 탐지는 지표 데이터의 정상 패턴을 학습하여, 비정상적인 값을 자동으로 감지하는 모델을 만드는 것 으로, 알람을 생성하고 싶다면 따로 생성을 해줘야 합니다.
만약 이상 탐지 알람을 생성하고 싶다면 아래 블로그를 참고해주세요.
https://dev.classmethod.jp/articles/lim-cloudwatch-anomaly-detection-alarm-cli/

이상 탐지(Anomaly Detector)를 별도로 만드는 이유를 쉽게 정리하면 다음과 같습니다.

  • 이상 탐지기를 먼저 만들어두면, 실제로 알람을 생성하기 전에 임계값 설정이 제대로 되었는지 미리 확인할 수 있습니다. 즉, 정상과 비정상 패턴을 미리 검증하는 데 도움이 됩니다.
  • 이상 탐지 결과를 단순히 모니터링 용도로만 쓰고 싶을 때도 있습니다. 꼭 알람을 생성하지 않아도, 이상 징후가 발생했는지 대시보드 등에서 추적할 수 있습니다.

즉, 이상 탐지기는 알람 작성을 위한 기초 데이터가 되기도 하고, 알람 없이 이상 여부만 관찰하고 싶을 때도 유용하게 활용될 수 있습니다.

2.1. 이상 탐지 생성

이상 탐지 알람을 생성하기 위해서는 다음과 같은 명령어를 사용합니다.

aws cloudwatch put-anomaly-detector \
  --namespace [네임스페이스의 지정] \
  --metric-name [지표 지정] \
  --stat [통계값] \
  --dimensions Name=[차원 이름],Value=[차원 값]
aws cloudwatch put-anomaly-detector 명령어의 옵션
옵션명 타입 필수/선택 설명 기본 값 비고
--namespace string 선택 이상 탐지 모델을 생성할 지표의 네임스페이스
AWS 서비스별로 다르다
없음 예: AWS/EC2, AWS/RDS 등
--metric-name string 선택 이상 탐지 모델을 생성할 지표명 없음 예: CPUUtilization, FreeStorageSpace 등
--dimensions list 선택 이상 탐지 모델을 생성하기 위한 지표 차원 없음 Name=value 형태로 지정
최대 30개까지 지정 가능
--stat string 선택 지표와 이상 탐지 모델에 사용할 통계값 없음 예: Average, Sum, Minimum, Maximum, SampleCount
--configuration structure 선택 모델 학습 시 제외할 기간(배포 등), 타임존 등 상세 설정 없음 ExcludedTimeRanges, MetricTimezone 등
--metric-characteristics structure 선택 지표의 특성(예: 주기적 스파이크 허용 등)을 지정 없음 PeriodicSpikes 등
--single-metric-anomaly-detector structure 선택 단일 지표 이상 탐지기 생성 시 사용 cross-account 등 고급 설정 가능. 없음 일반적으로는 위 4개 옵션만 사용
--metric-math-anomaly-detector structure 선택 Metric Math(수식 기반) 이상 탐지기 생성 시 사용 없음 여러 지표 조합 시 사용
--cli-input-json string 선택 명령어 입력을 JSON 문자열로 지정 없음
--cli-input-yaml string 선택 명령어 입력을 YAML 문자열로 지정 없음
--generate-cli-skeleton string 선택 입력/출력용 JSON/YAML 스켈레톤 생성 없음
--debug boolean 선택 디버그 로깅 활성화 false AWS CLI 글로벌 옵션
--endpoint-url string 선택 AWS 서비스 엔드포인트 URL 직접 지정 없음 AWS CLI 글로벌 옵션
--no-verify-ssl boolean 선택 SSL 인증서를 확인하는 기본 동작을 재정의 false AWS CLI 글로벌 옵션
--no-paginate boolean 선택 자동 페이지네이션 비활성화 false AWS CLI 글로벌 옵션
--output string 선택 출력 포맷 지정 json json, text, table, yaml, yaml-stream
AWS CLI 글로벌 옵션
aws configure 설정에 따라 기본값 변경
--query string 선택 JMESPath 쿼리로 출력 데이터 필터링 없음 AWS CLI 글로벌 옵션
--profile string 선택 명령 실행 시 사용할 AWS 프로파일 지정 default AWS CLI 글로벌 옵션
--region string 선택 명령 실행 시 사용할 리전 지정 config 파일 값 AWS CLI 글로벌 옵션
--version boolean 선택 CLI 버전 정보 출력 false AWS CLI 글로벌 옵션
--color string 선택 컬러 출력 설정 auto on, off, auto
AWS CLI 글로벌 옵션
--no-sign-request boolean 선택 요청에 서명하지 않음(자격 증명이 로드되지 않음) false AWS CLI 글로벌 옵션
--ca-bundle string 선택 사용자 지정 CA 번들 지정 없음 AWS CLI 글로벌 옵션
--cli-read-timeout int 선택 최대 소켓 읽기 타임아웃(초) 60 AWS CLI 글로벌 옵션
--cli-connect-timeout int 선택 최대 소켓 연결 타임아웃(초) 60 AWS CLI 글로벌 옵션
--cli-binary-format string 선택 바이너리 데이터 포맷 지정 base64 AWS CLI 글로벌 옵션
--no-cli-pager boolean 선택 CLI 페이저(페이지 단위 출력) 비활성화 false AWS CLI 글로벌 옵션
--cli-auto-prompt boolean 선택 자동 프롬프트 활성화(옵션 입력 가이드) false AWS CLI 글로벌 옵션
--no-cli-auto-prompt boolean 선택 자동 프롬프트 비활성화 false AWS CLI 글로벌 옵션



aws cloudwatch put-anomaly-detector 명령어는 필수 옵션이 없습니다.
하지만 생성할 이상 탐지를 정의하기 위해서는 다음 중 하나의 방법을 반드시 사용해야 합니다.

  1. 개별 옵션 조합
    --namespace + --metric-name + --stat 옵션의 조합으로 생성할 이상 탐지를 식별합니다.
    단, Dimensions가 있는 경우 --dimensions 옵션도 함께 지정해야합니다.

  2. --single-metric-anomaly-detector 옵션 사용
    --single-metric-anomaly-detector 옵션으로 [1. 개별 옵션 조합] 의 정보를 한번에 정의합니다.
--single-metric-anomaly-detector Namespace="AWS/EC2",MetricName="NetworkPacketsIn",Stat="Average"


  1. --metric-math-anomaly-detector 옵션
    Metric Math(수식 기반) 이상 탐지기 생성할 경우 --metric-math-anomaly-detector 옵션을 정의해서 생성합니다.
--metric-math-anomaly-detector MetricMathAnomalyDetector={...}



자세한 옵션 설명과 예시는 아래 페이지에서 확인할 수 있습니다.
https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-anomaly-detector.html

2.2. 명령어 실행

이번에 사용할 지표는 EC2 인스턴스의 NetworkPacketsIn 입니다.
NetworkPacketsIn는 모든 네트워크 인터페이스에서 인스턴스가 수신한 패킷 수로, 단일 인스턴스의 패킷 수를 기준으로 들어오는 트래픽의 양을 식별합니다.
선택 기준은 따로 없고 테스트를 위해 임의로 선택했습니다.

aws cloudwatch put-anomaly-detector \
  --namespace AWS/EC2 \
  --metric-name NetworkPacketsIn \
  --stat Average \
  --dimensions Name=InstanceId,Value=i-xxxxxxxxxxxxxxxxx

3. 결과 확인

그럼 제대로 생성되었는지 확인해보겠습니다.

aws cloudwatch describe-anomaly-detectors
# {
#     "AnomalyDetectors": [
#         {
#             "Namespace": "AWS/EC2",
#             "MetricName": "NetworkPacketsIn",
#             "Dimensions": [
#               ... 생략 ...
#                     }
#                 ],
#                 "Stat": "Average"
#             }
#         }
#     ]
# }

하지만 이렇게 실행하면 모든 이상 탐지가 출력되기 때문에
만약 좀 더 특정 이상 탐지에 대해서만 확인하고 싶다면 아래와 같이 옵션을 지정해주면 됩니다.

aws cloudwatch describe-anomaly-detectors \
  --namespace AWS/EC2 \
  --metric-name NetworkPacketsIn \
# {
#     "AnomalyDetectors": [
#         {
#             "Namespace": "AWS/EC2",
#             "MetricName": "NetworkPacketsIn",
#             "Dimensions": [
#                 {
#                     "Name": "InstanceId",
#                     "Value": "i-xxxxxxxxxxxxxxxxx"
#                 }
#             ],
#             "Stat": "Average",
#             "Configuration": {
#                 "ExcludedTimeRanges": []
#             },
#             "StateValue": "TRAINED",
#             "SingleMetricAnomalyDetector": {
#                 "Namespace": "AWS/EC2",
#                 "MetricName": "NetworkPacketsIn",
#                 "Dimensions": [
#                     {
#                         "Name": "InstanceId",
#                         "Value": "i-xxxxxxxxxxxxxxxxx"
#                     }
#                 ],
#                 "Stat": "Average"
#             }
#         }
#     ]
# }

describe-anomaly-detectors 의 다양한 옵션은 아래 토글 페이지를 참고해주세요

aws cloudwatch describe-anomaly-detectors 명령어의 옵션

describe-anomaly-detectors는 조회 명령어라서 put-anomaly-detector에 비해 옵션이 훨씬 간단합니다.
주로 필터링과 페이지네이션 관련 옵션들이 있습니다.

옵션명 타입 필수/선택 설명 디폴트 값 비고
--namespace string 선택 조회할 이상 탐지의 특정 네임스페이스 없음 예: AWS/EC2, AWS/RDS 등
--metric-name string 선택 조회할 이상 탐지의 특정 지표명 없음 예: CPUUtilization, FreeStorageSpace 등
--dimensions list 선택 조회할 이상 탐지의 특정 차원 없음 Name=value 형태로 지정
--anomaly-detector-types list 선택 이상 탐지 유형 필터링 SINGLE_METRIC SINGLE_METRIC, METRIC_MATH
--starting-token string 선택 페이지네이션 시작 위치를 지정하는 토큰 없음 페이지네이션 옵션 (list/describe 계열 명령어)
--page-size integer 선택 한 번의 호출에서 가져올 페이지의 크기 없음 페이지네이션 옵션 (list/describe 계열 명령어)
--max-items integer 선택 명령 출력에 반환할 총 항목 수 없음 페이지네이션 옵션 (list/describe 계열 명령어)
--cli-input-json string 선택 명령어 입력을 JSON 문자열로 지정 없음
--cli-input-yaml string 선택 명령어 입력을 YAML 문자열로 지정 없음
--generate-cli-skeleton string 선택 입력/출력용 JSON/YAML 스켈레톤 생성 없음
--debug boolean 선택 디버그 로깅 활성화 false AWS CLI 글로벌 옵션
--endpoint-url string 선택 AWS 서비스 엔드포인트 URL 직접 지정 없음 AWS CLI 글로벌 옵션
--no-verify-ssl boolean 선택 SSL 인증서를 확인하는 기본 동작을 재정의 false AWS CLI 글로벌 옵션
--no-paginate boolean 선택 자동 페이지네이션 비활성화 false AWS CLI 글로벌 옵션
--output string 선택 출력 포맷 지정 json json, text, table, yaml, yaml-stream
AWS CLI 글로벌 옵션
aws configure 설정에 따라 기본값 변경
--query string 선택 JMESPath 쿼리로 출력 데이터 필터링 없음 AWS CLI 글로벌 옵션
--profile string 선택 명령 실행 시 사용할 AWS 프로파일 지정 default AWS CLI 글로벌 옵션
--region string 선택 명령 실행 시 사용할 리전 지정 config 파일 값 AWS CLI 글로벌 옵션
--version boolean 선택 CLI 버전 정보 출력 false AWS CLI 글로벌 옵션
--color string 선택 컬러 출력 설정 auto on, off, auto
AWS CLI 글로벌 옵션
--no-sign-request boolean 선택 요청에 서명하지 않음(자격 증명이 로드되지 않음) false AWS CLI 글로벌 옵션
--ca-bundle string 선택 사용자 지정 CA 번들 지정 없음 AWS CLI 글로벌 옵션
--cli-read-timeout int 선택 최대 소켓 읽기 타임아웃(초) 60 AWS CLI 글로벌 옵션
--cli-connect-timeout int 선택 최대 소켓 연결 타임아웃(초) 60 AWS CLI 글로벌 옵션
--cli-binary-format string 선택 바이너리 데이터 포맷 지정 base64 AWS CLI 글로벌 옵션
--no-cli-pager boolean 선택 CLI 페이저(페이지 단위 출력) 비활성화 false AWS CLI 글로벌 옵션
--cli-auto-prompt boolean 선택 자동 프롬프트 활성화(옵션 입력 가이드) false AWS CLI 글로벌 옵션
--no-cli-auto-prompt boolean 선택 자동 프롬프트 비활성화 false AWS CLI 글로벌 옵션

aws cloudwatch put-anomaly-detector 명령어는 필수 옵션이 없습니다.
아무런 옵션 없이도 실행할 수 있습니다.

필터링 관련 선택 옵션은 다음과 같습니다.

  • --namespace
  • --metric-name
  • --dimensions
  • --anomaly-detector-types
  • 페이지네이션 관련 옵션
    • --max-records
    • --next-token



자세한 옵션 설명과 예시는 아래 페이지에서 확인할 수 있습니다.
https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/describe-anomaly-detectors.html

콘솔 페이지에서도 확인해보겠습니다.
명령어를 실행시키기 전에는 지표는 아래와 같습니다.
111

이상 탐지를 생성하고 다시 확인해보면 아래 사진과 같이 회색으로 정상범위가 출력되는 걸 확인할 수 있습니다.
(이 때, 콘솔 화면에 이상 탐지가 출력되기까지는 다소 시간이 걸립니다.)
222

또한, 지표 이름 옆에 Average 통계에 대한 이상 탐지 모델이 활성화되었다고 출력됩니다.
333

4. 이상 탐지 삭제

마지막으로 이상 탐지를 삭제해보겠습니다.
삭제할 때 지정하는 파라미터는 생성할 때 사용한 설정값을 입력하면 됩니다.
만약 기억이 나지 않으면 [2.3. 결과 확인] 에서 조회한 이상 탐지 상세 설정의 값의 출력을 참고해서 입력해주면 됩니다.

aws cloudwatch delete-anomaly-detector \
  --namespace AWS/EC2 \
  --metric-name NetworkPacketsIn \
  --stat Average \
  --dimensions Name=InstanceId,Value=i-xxxxxxxxxxxxxxxxx
aws cloudwatch delete-anomaly-detector 명령어의 옵션
옵션명 타입 필수/선택 설명 디폴트 값 비고
--namespace string 선택 삭제할 이상 탐지의 지표 네임스페이스 없음 예: AWS/EC2, AWS/RDS 등
--metric-name string 선택 삭제할 이상 탐지의 지표 이름 없음 예: CPUUtilization 등
--dimensions list 선택 삭제할 이상 탐지의 지표 차원 없음 Name=value 형태로 지정
--stat string 선택 삭제할 이상 탐지의 통계값 없음 Average, Sum, Maximum, Minimum, SampleCount
--single-metric-anomaly-detector structure 선택 단일 지표 이상 탐지 삭제 시 사용 없음 JSON 구조체 형태
--metric-math-anomaly-detector structure 선택 Metric Math(수식 기반) 이상 탐지기 생성했었을 경우 없음 JSON 구조체 형태
--cli-input-json string 선택 명령어 입력을 JSON 문자열로 지정 없음
--cli-input-yaml string 선택 명령어 입력을 YAML 문자열로 지정 없음
--generate-cli-skeleton string 선택 입력/출력용 JSON/YAML 스켈레톤 생성 없음
--debug boolean 선택 디버그 로깅 활성화 false AWS CLI 글로벌 옵션
--endpoint-url string 선택 AWS 서비스 엔드포인트 URL 직접 지정 없음 AWS CLI 글로벌 옵션
--no-verify-ssl boolean 선택 SSL 인증서를 확인하는 기본 동작을 재정의 false AWS CLI 글로벌 옵션
--no-paginate boolean 선택 자동 페이지네이션 비활성화 false AWS CLI 글로벌 옵션
--output string 선택 출력 포맷 지정 json json, text, table, yaml, yaml-stream
AWS CLI 글로벌 옵션
aws configure 설정에 따라 기본값 변경
--query string 선택 JMESPath 쿼리로 출력 데이터 필터링 없음 AWS CLI 글로벌 옵션
--profile string 선택 명령 실행 시 사용할 AWS 프로파일 지정 default AWS CLI 글로벌 옵션
--region string 선택 명령 실행 시 사용할 리전 지정 config 파일 값 AWS CLI 글로벌 옵션
--version boolean 선택 CLI 버전 정보 출력 false AWS CLI 글로벌 옵션
--color string 선택 컬러 출력 설정 auto on, off, auto
AWS CLI 글로벌 옵션
--no-sign-request boolean 선택 요청에 서명하지 않음(자격 증명이 로드되지 않음) false AWS CLI 글로벌 옵션
--ca-bundle string 선택 사용자 지정 CA 번들 지정 없음 AWS CLI 글로벌 옵션
--cli-read-timeout int 선택 최대 소켓 읽기 타임아웃(초) 60 AWS CLI 글로벌 옵션
--cli-connect-timeout int 선택 최대 소켓 연결 타임아웃(초) 60 AWS CLI 글로벌 옵션
--cli-binary-format string 선택 바이너리 데이터 포맷 지정 base64 AWS CLI 글로벌 옵션
--no-cli-pager boolean 선택 CLI 페이저(페이지 단위 출력) 비활성화 false AWS CLI 글로벌 옵션
--cli-auto-prompt boolean 선택 자동 프롬프트 활성화(옵션 입력 가이드) false AWS CLI 글로벌 옵션
--no-cli-auto-prompt boolean 선택 자동 프롬프트 비활성화 false AWS CLI 글로벌 옵션



aws cloudwatch delete-anomaly-detector 명령어는 필수 옵션이 없습니다.
하지만 삭제할 이상 탐지를 식별하기 위해서는 다음 중 하나의 방법을 반드시 사용해야 합니다.

  1. 개별 옵션 조합
    --namespace + --metric-name + --stat 옵션의 조합으로 삭제할 이상 탐지를 식별합니다.
    단, Dimensions가 있는 경우 --dimensions 옵션도 함께 지정해야합니다.

  2. --single-metric-anomaly-detector 옵션 사용
    --single-metric-anomaly-detector 옵션으로 [1. 개별 옵션 조합] 의 정보를 한번에 정의합니다.
--single-metric-anomaly-detector Namespace="AWS/EC2",MetricName="NetworkPacketsIn",Stat="Average"


  1. --metric-math-anomaly-detector 옵션
    Metric Math(수식 기반) 이상 탐지기 생성했었을 경우 --metric-math-anomaly-detector 옵션을 정의해서 삭제합니다.
--metric-math-anomaly-detector MetricMathAnomalyDetector={...}



자세한 옵션 설명과 예시는 아래 페이지에서 확인할 수 있습니다.
https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/delete-anomaly-detector.html

콘솔 화면에서 확인해봐도 이상 탐지가 사라졌고, 지표명 옆에 있던 이상 탐지 활성화 표시도 사라져있습니다.
444

지금까지 이상 탐지에 대한 AWS CLI 명령어에 대해 알아봤습니다.

5. 마무리

이상으로 AWS CLI 명령어를 통해 CloudWatch 이상 탐지의 생성, 조회, 삭제 명령어를 실행해봤습니다.

참고 자료
https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch_Anomaly_Detection.html

문의 사항은 클래스메소드코리아로!

클래스메소드코리아에서는 다양한 세미나 및 이벤트를 진행하고 있습니다.
진행중인 이벤트는 아래 페이지를 참고해주세요.

https://classmethod.kr/board/library

AWS에 대한 상담 및 클래스메소드코리아 멤버스에 관한 문의사항은 아래 메일로 연락주시면 감사드립니다!
Info@classmethod.kr

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.