만들 결과물
CloudPeek-Alarms라는 CloudWatch 대시보드를 만들고, 프로덕션 경보를 나열하는 경보 상태 위젯 하나를 추가합니다. ALARM 상태인 경보는 항상 맨 먼저 나열되므로, 조치가 필요한 경보가 바로 눈에 띕니다. CloudPeek에서는 다음과 같이 표시됩니다.
경보가 이미 있다면 5분 정도 걸립니다.
대시보드 없이 모든 경보를 표시하고 싶나요? CloudPeek에서 위젯 만들기를 탭하고 프리셋을 선택한 다음, 로그 및 모니터링 아래의 경보 또는 경보 요약을 선택하세요. 경보는 계정의 기본 리전에 있는 모든 경보를 같은 순서로 나열하며, 편집으로 제목을 바꿀 수 있습니다(예: “프로덕션 경보”). 경보 요약은 “경보 발생 2개, 정상 20개”처럼 경보 수를 셉니다. prod-처럼 이름이 같은 텍스트로 시작하는 경보만 표시하려면 미리보기의 표시에서 이름의 시작 부분…을 선택하세요(일부만 표시 참조). 계정을 두 개 이상 추가했다면 미리보기에서 모든 계정을 선택하여 모든 계정과 선택한 리전의 경보를 계정마다 한 줄씩 표시할 수 있습니다(예: “prod: 경보 발생 2개 · staging: 모두 정상”, 모든 계정의 경보 참조). 선택한 경보를 하나씩 표시하거나 여러 리전의 경보를 표시하려면 아래 대시보드를 만드세요.
시작하기 전에
- 감시할 CloudWatch 경보: 한 계정의 어느 리전에 있든 지표 경보 또는 복합 경보.
- CloudPeek의 액세스 권한. 시작하기의
CloudPeek정책에는 경보 위젯에 필요한cloudwatch:DescribeAlarms가 이미 포함되어 있습니다. 이미 설정했다면 준비가 끝난 것입니다. - CloudWatch 대시보드를 만들 수 있는 로그인 정보(예: 관리자).
비용. CloudWatch 프리 티어에는 대시보드 3개가 포함되며, 그 이상은 대시보드당 월 $3입니다. 경보 위젯은 GetMetricData가 아니라 DescribeAlarms로 새로고침되므로 지표 요금이 추가되지 않습니다. 요청당 요금이 부과되지만, CloudWatch 프리 티어에 계정당 월 100만 건의 요청이 포함됩니다. CloudWatch 요금을 참조하세요.
1. 대시보드 만들기
대시보드는 경보를 ARN으로 나열합니다(예: arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-5xx-errors). ARN에는 경보의 리전, 계정, 이름이 들어 있습니다.
- CloudWatch › 경보 › 모든 경보를 여세요. 원하는 경보마다 경보를 열고 세부 정보에서 ARN을 복사하세요.
- 대시보드 › 대시보드 생성을 선택하세요. 이름으로
CloudPeek-Alarms를 입력하고 대시보드 생성을 선택하세요. 위젯 추가 창이 열리면 닫으세요. - 작업 › 소스 보기/편집을 선택하고, 소스를 아래의 대시보드 JSON으로 바꾸되 예시 대신 내 ARN을 넣은 다음 업데이트를 선택하세요.
- 저장을 선택하세요.
소스를 편집하는 대신 위젯 추가 › 경보 상태를 선택하고 경보를 선택할 수도 있습니다. 그런 다음 소스에 "sortBy": "stateUpdatedTimestamp"를 추가하여 가장 최근에 변경된 경보가 먼저 표시되도록 하세요.
이름이 prod-로 시작하는 모든 경보의 ARN을 나열합니다.
aws cloudwatch describe-alarms \
--region us-east-1 \
--alarm-name-prefix prod- \
--query '[MetricAlarms[].AlarmArn, CompositeAlarms[].AlarmArn][]' \
--output json
예시 대신 이 ARN을 production-alarms.json(아래 참조)에 넣고 다음 명령을 실행하세요.
aws cloudwatch put-dashboard \
--region us-east-1 \
--dashboard-name CloudPeek-Alarms \
--dashboard-body file://production-alarms.json
또는 jq를 사용하여 해당 경보로 대시보드를 한 번에 만드세요.
aws cloudwatch describe-alarms \
--region us-east-1 \
--alarm-name-prefix prod- \
--query '[MetricAlarms[].AlarmArn, CompositeAlarms[].AlarmArn][]' \
--output json |
jq '{widgets: [{type: "alarm", x: 0, y: 0, width: 12, height: 6,
properties: {title: "Production alarms", sortBy: "stateUpdatedTimestamp", alarms: .}}]}' \
> production-alarms.json
aws cloudwatch put-dashboard \
--region us-east-1 \
--dashboard-name CloudPeek-Alarms \
--dashboard-body file://production-alarms.json
경보를 추가할 때마다 다시 실행하세요.
경보가 같은 템플릿에 있다면 !Sub 안에 ${Alarm.Arn}으로 나열하세요. 그러면 대시보드가 항상 배포하는 경보와 일치합니다.
AlarmsDashboard:
Type: AWS::CloudWatch::Dashboard
Properties:
DashboardName: CloudPeek-Alarms
DashboardBody: !Sub |
{
"widgets": [
{
"type": "alarm", "x": 0, "y": 0, "width": 12, "height": 6,
"properties": {
"title": "Production alarms",
"sortBy": "stateUpdatedTimestamp",
"alarms": [
"${ApiErrorsAlarm.Arn}",
"${QueueDepthAlarm.Arn}"
]
}
}
]
}
여기서 ApiErrorsAlarm과 QueueDepthAlarm은 같은 템플릿에 있는 AWS::CloudWatch::Alarm 리소스입니다. 다른 곳에 정의된 경보의 경우 해당 ARN으로 cloudpeek-alarms.yaml을 배포하세요.
Resources:
# sortBy puts the most recent change first within each state; CloudPeek always lists alarms in
# ALARM first. The ARNs are joined into a JSON array of strings.
Dashboard:
Type: AWS::CloudWatch::Dashboard
Properties:
DashboardName: !Ref DashboardName
DashboardBody: !Sub
- |
{
"widgets": [
{
"type": "alarm",
"x": 0,
"y": 0,
"width": 12,
"height": 6,
"properties": {
"title": "${WidgetTitle}",
"sortBy": "stateUpdatedTimestamp",
"alarms": [ "${Alarms}" ]
}
}
]
}
- Alarms: !Join ['", "', !Ref AlarmArns]
aws cloudformation deploy \
--stack-name CloudPeek-Alarms \
--template-file cloudpeek-alarms.yaml \
--parameter-overrides 'AlarmArns=arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-5xx-errors,arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-worker-queue-depth'
경보가 같은 구성에 있다면 경보의 arn 속성을 나열하세요. 그러면 대시보드가 항상 적용하는 경보와 일치합니다.
resource "aws_cloudwatch_dashboard" "alarms" {
dashboard_name = "CloudPeek-Alarms"
dashboard_body = jsonencode({
widgets = [{
type = "alarm", x = 0, y = 0, width = 12, height = 6
properties = {
title = "Production alarms"
sortBy = "stateUpdatedTimestamp"
alarms = [
aws_cloudwatch_metric_alarm.api_5xx.arn,
aws_cloudwatch_metric_alarm.queue_depth.arn,
]
}
}]
})
}
여기서 api_5xx와 queue_depth는 같은 구성에 있는 aws_cloudwatch_metric_alarm 리소스입니다. for_each로 경보를 만든다면 [for alarm in aws_cloudwatch_metric_alarm.prod : alarm.arn]으로 모두 나열하세요. 다른 곳에 정의된 경보의 경우 해당 ARN으로 cloudpeek-alarms.tf를 적용하세요.
variable "alarm_arns" {
description = "The ARNs of the alarms to list. Each ARN names its own region, so one widget can list alarms from several regions."
type = list(string)
validation {
condition = length(var.alarm_arns) > 0
error_message = "List at least one alarm ARN."
}
}
# sortBy puts the most recent change first within each state; CloudPeek always lists alarms in
# ALARM first.
resource "aws_cloudwatch_dashboard" "alarms" {
dashboard_name = var.dashboard_name
dashboard_body = jsonencode({
widgets = [
{
type = "alarm"
x = 0
y = 0
width = 12
height = 6
properties = {
title = var.widget_title
sortBy = "stateUpdatedTimestamp"
alarms = var.alarm_arns
}
},
]
})
}
alarm_arns = [
"arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-5xx-errors",
"arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-worker-queue-depth",
]
terraform init
terraform apply
2. 계정 추가 및 위젯 고정
- CloudPeek을 열고 계정 탭에서 액세스 키 또는 IAM Identity Center로 경보가 있는 계정을 추가하세요. 시작하기의 2단계를 참조하세요.
- 계정 탭에서 계정을 열고 CloudPeek-Alarms 대시보드를 연 다음, Production alarms(프로덕션 경보)에서 고정을 탭하세요.
- 홈 화면에 CloudPeek을 추가하세요(홈 화면 및 잠금 화면 참조). 마지막으로 고정한 위젯인 Production alarms가 먼저 표시됩니다. 중형은 각 경보가 마지막으로 변경된 시점을 표시하고, 소형은 간단히 개수를 확인하기에 적합합니다.
- 위젯을 탭하면 모든 경보와 함께 각 상태에 대한 CloudWatch의 사유와 그 상태가 시작된 시점을 볼 수 있으며, 어떤 경보든 AWS 콘솔에서 열 수 있습니다. 중형 또는 대형 위젯에서는 경보를 탭하면 콘솔의 해당 경보로 바로 이동합니다.
결과: 위젯에 경보가 나열되며, 경보가 발생한 항목이 맨 위에 표시됩니다. iPhone 및 iPad 잠금 화면에서는 “경보 발생 1개” 또는 “모두 정상”과 같은 요약 문구를 표시합니다.
대시보드 설명
어떤 도구를 사용하든 대시보드는 내 경보의 ARN이 들어간 다음과 같은 형태가 됩니다.
{
"widgets": [
{
"type": "alarm",
"x": 0,
"y": 0,
"width": 12,
"height": 6,
"properties": {
"title": "Production alarms",
"sortBy": "stateUpdatedTimestamp",
"alarms": [
"arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-5xx-errors",
"arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-worker-queue-depth",
"arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-high-cpu"
]
}
}
]
}
alarm위젯은 경보를 ARN으로 원하는 만큼 나열합니다."sortBy": "stateUpdatedTimestamp"는 CloudPeek과 CloudWatch 콘솔에서 각 상태 안에서 가장 최근에 변경된 경보를 먼저 나열합니다.- 각 ARN에는 리전이 들어 있고, CloudPeek은 각 경보를 해당 리전에서 조회하므로 위젯 하나에 여러 리전의 경보를 나열할 수 있습니다.
경보 정렬 방식
- CloudPeek에서는
ALARM상태인 경보가 항상 맨 먼저 표시되고, 그다음 데이터가 부족한 경보, 찾을 수 없는 경보, 정상인 경보 순입니다. 표시할 수 있는 것보다 경보가 많으면 조치가 필요한 경보가 표시됩니다. sortBy가 없으면 콘솔은 경보를 이름순으로 정렬하고, CloudPeek은 나열된 순서를 유지하되ALARM상태인 경보를 먼저 표시합니다.- 소형 위젯은 요약 문구와 처음 3~4개 경보를 표시합니다. 중형 이상의 위젯은 들어가는 만큼 표시하며(대형에서는 12개 정도), 각 경보의 상태가 얼마 전에 변경되었는지도 표시합니다. 나머지는 외 N개로 표시됩니다.
- 소형 위젯과 잠금 화면의 요약 문구는 빨간색 경보 발생 N개, 모든 경보가 정상이면 초록색 모두 정상, 아직 충분한 데이터가 있는 경보가 없으면 데이터 없음, 일부 경보에 데이터가 없거나 찾을 수 없으면 알 수 없음 N개로 표시됩니다.
- 각 경보의 기호는 상태를 나타냅니다. 경보 목록을 참조하세요.
경보 발생 시 알림 받기
CloudPeek은 경보 위젯의 경보 중 하나가 ALARM 상태가 되면 경보 이름과 CloudWatch의 사유(예: “Threshold Crossed: 1 datapoint [12.0] was greater than the threshold (10.0).”)를 담아 알림을 보낼 수 있습니다. Production alarms처럼 대시보드에서 고정한 위젯이든, 경보 및 경보 요약 프리셋이든 모든 경보 위젯에서 작동하며, 모든 계정을 다루는 위젯은 어느 계정에서든 경보가 발생하기 시작하면 알립니다(모든 계정의 경보 참조).
- 위젯 탭에서 Production alarms를 탭하여 위젯 자체 화면을 여세요.
- 경보 목록 아래의 경보 발생 시 알림을 켜세요.
- 처음에는 휴대폰에서 CloudPeek이 알림을 보내도 되는지 묻습니다(Android에서는 Android 13부터). 허용을 탭하세요.
결과: 스위치가 켜집니다. 새로고침할 때 직전 새로고침에서는 경보 상태가 아니었던 위젯의 경보가 경보 상태로 발견되면 “prod-api-5xx-errors 경보 발생”과 같은 알림을 받습니다. 알림을 탭하면 모든 경보의 사유와 각 경보의 AWS 콘솔 링크가 있는 위젯 화면이 열립니다.
알림은 위젯의 새로고침에서 발생합니다. 이 위젯을 표시하는 홈 화면 위젯(iPhone 및 iPad에서는 잠금 화면 위젯도)과 이 위젯을 나열하는 개요의 새로고침, 그리고 앱에서의 새로고침입니다. 2단계처럼 위젯을 홈 화면에 두세요. 그렇지 않으면 CloudPeek을 열어 둔 동안에만 새로고침됩니다.
온콜 호출을 대신하지는 않습니다. 알림은 위젯의 새로고침에서 발생하므로 위젯이 새로고침되는 속도만큼만 빠릅니다. iPhone과 iPad에서는 보통 수십 분 간격이며, 저전력 모드이거나 위젯을 거의 보지 않으면 더 드물어집니다. Android에서는 최대 15분마다이며, 휴대폰이 배터리를 절약하는 동안에는 더 드물어집니다(위젯이 새로고침되는 시점 참조). 앱을 열어도 새로고침됩니다. 몇 분 안에 누군가 대응해야 하는 경보에는 Amazon SNS나 온콜 도구를 통한 호출을 계속 사용하세요.
- 각 경보는 새로고침 횟수나 경보를 발견한 위젯 수와 관계없이 경보 상태가 될 때마다 한 번씩 알립니다. 알림을 켤 때 이미 경보 상태인 경보는 다음에 경보가 발생할 때 알립니다. 정상에서 데이터 부족으로 바뀌는 경보는 경보가 발생한 것이 아니므로 알리지 않습니다.
- 동시에 발생하기 시작한 경보는 3개까지 각각 알림을 받습니다. 그보다 많으면 “경보 4개 발생”처럼 모든 경보의 이름을 담은 알림 하나로 받습니다.
- 위젯에 나열된 다른 경보와 이름이 같은 경보는 리전과 함께 표시되며, 여러 계정에 걸쳐 있으면 구분에 필요한 경우 AWS 계정 ID도 함께 표시됩니다(예: “api-5xx (us-east-1, 222222222222) 경보 발생”).
- 알림은 위젯이 가져온 데이터를 바탕으로 휴대폰이나 태블릿에서 만들어집니다. CloudPeek이나 푸시 서비스로는 아무것도 전송되지 않으며, 위젯에 이미 있는 것 외의 AWS 권한은 필요하지 않습니다.
- 위젯을 제거하면 알림이 꺼지고, 실행 취소를 탭하면 다시 켜집니다.
- 휴대폰의 설정에서 CloudPeek의 알림이 꺼져 있으면 위젯 화면에 “CloudPeek의 알림이 꺼져 있습니다. 알림을 받으려면 설정에서 알림을 허용하세요.”가 표시됩니다. iPhone 및 iPad에서는 설정 열기를 탭하고 알림 허용을 켠 다음 CloudPeek으로 돌아오세요. Android에서는 설정 열기를 탭하여 CloudPeek의 알림 설정을 열고 알림을 켠 다음 돌아오세요.
문제 해결
경보에 점선 원이 표시됨
CloudPeek이 경보를 찾지 못했습니다. ARN의 이름, 리전, 계정이 경보와 정확히 일치하는지 확인하세요. 경보 이름은 대소문자를 구분합니다. CloudPeek은 위젯을 고정한 계정에서 경보를 조회하므로 다른 AWS 계정의 경보는 찾을 수 없습니다. 그 계정의 대시보드에 경보를 넣고 그 계정을 CloudPeek에 추가하세요.
경보에 물음표가 표시됨
콘솔에서와 마찬가지로 CloudWatch가 평가할 수 있을 만큼 데이터가 아직 충분하지 않은 경보입니다. ALARM 상태인 경보 다음에 나열됩니다.
CloudPeek에 액세스가 거부되었다고 표시됨
로그인 정보에 cloudwatch:DescribeAlarms가 필요합니다. 이 권한은 CloudPeek 정책과 AWS 관리형 정책 CloudWatchReadOnlyAccess에 포함되어 있습니다.
알림이 오지 않음
위젯에 경보 발생 시 알림이 켜져 있는지, 위젯 화면에 알림이 꺼져 있다는 메시지가 없는지, 위젯이 홈 화면(또는 iPhone 및 iPad의 잠금 화면)에 있는지 확인하세요. 알림은 이런 화면에 있는 위젯의 새로고침에서 전송됩니다. 알림은 위젯이 새로고침되는 만큼만 오며, 이미 경보 상태였던 경보는 다음에 경보가 발생할 때 알립니다. 경보 발생 시 알림 받기를 참조하세요.
콘솔의 순서가 다름
"sortBy": "stateUpdatedTimestamp"가 없으면 CloudWatch 콘솔은 경보를 이름순으로 정렬합니다. CloudPeek과 순서를 맞추려면 위젯의 속성에 이 항목을 추가하세요.
그 밖의 문제
문제 해결을 참조하거나 support@cloudpeek.app에 이메일로 문의하세요. 보안 액세스 키는 절대 보내지 마세요.