作成するもの
CloudPeek-Alarmsという名前のCloudWatchダッシュボードを作成し、本番環境のアラームを一覧表示するアラームステータスウィジェットを1つ置きます。ALARM状態のアラームは常に先頭に表示されるので、対応が必要なアラームがすぐ目に入ります。CloudPeekでは次のように表示されます:
アラームがすでにある場合、5分ほどで完了します。
ダッシュボードなしで、すべてのアラームを表示したいですか?CloudPeekでウィジェットを作成をタップし、プリセットを選んで、「ログとモニタリング」のアラームまたはアラームサマリーを選びます。アラームはアカウントのデフォルトリージョンのすべてのアラームを同じ順序で一覧表示し、編集でタイトルを「本番環境のアラーム」などに変更できます。アラームサマリーは「2件がアラーム状態、20件がOK」のように件数を表示します。prod-のように名前の先頭が同じアラームだけを表示するには、プレビューの表示で名前の先頭を指定…を選びます(一部だけを表示するを参照)。複数のアカウントを追加している場合は、プレビューですべてのアカウントを選ぶと、すべてのアカウントとチェックを入れたリージョンが対象になり、「prod:2件がアラーム状態 · staging:すべてOK」のようにアカウントごとに1行で表示されます(すべてのアカウントのアラームを参照)。選んだアラームを1つずつ表示したり、複数のリージョンのアラームを表示したりするには、以下のダッシュボードを作成します。
始める前に
- 監視するCloudWatchアラーム:1つのアカウントの任意のリージョンにあるメトリクスアラームまたは複合アラーム。
- CloudPeekのアクセス権。はじめにの
CloudPeekポリシーには、アラームウィジェットに必要なcloudwatch:DescribeAlarmsがすでに含まれています。設定済みなら準備は完了です。 - CloudWatchダッシュボードを作成できるサインイン(管理者など)。
料金。CloudWatchの無料利用枠には3つのダッシュボードが含まれ、それを超えると1つのダッシュボードにつき月額$3です。アラームウィジェットはGetMetricDataではなくDescribeAlarmsで更新されるため、メトリクスの料金は増えません。こちらはリクエスト単位で課金され、CloudWatchの無料利用枠でアカウントあたり月100万リクエストまで無料です。CloudWatchの料金を参照してください。
1. ダッシュボードを作成する
ダッシュボードでは、アラームをARNで指定します。ARNはarn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-5xx-errorsのような形式で、アラームのリージョン、アカウント、名前を含みます。
- CloudWatch › アラーム › すべてのアラームを開きます。表示したい各アラームを開き、詳細からARNをコピーします。
- ダッシュボード › ダッシュボードの作成を選択します。名前を
CloudPeek-Alarmsにして、ダッシュボードの作成を選択します。ウィジェットの追加ウィンドウが開いたら閉じます。 - アクション › ソースの表示/編集を選択し、ソースを下のダッシュボードJSON(例のARNをあなたのARNに置き換えたもの)に置き換えて、更新を選択します。
- 保存を選択します。
ソースを編集する代わりに、ウィジェットの追加 › アラームステータスを選択してアラームにチェックを入れることもできます。その場合は、最新の変更が先頭に来るように、ソースに"sortBy": "stateUpdatedTimestamp"を追加します。
名前がprod-で始まるすべてのアラームのARNを一覧表示します:
aws cloudwatch describe-alarms \
--region us-east-1 \
--alarm-name-prefix prod- \
--query '[MetricAlarms[].AlarmArn, CompositeAlarms[].AlarmArn][]' \
--output json
それらを例の代わりに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ダッシュボードを開いて、本番環境のアラームのピン留めをタップします。
- CloudPeekをホーム画面に追加します(ホーム画面とロック画面を参照)。最初は、最後にピン留めしたウィジェットである本番環境のアラームが表示されます。中サイズでは各アラームが最後に変わった時刻が表示され、小サイズは件数をすばやく確認するのに向いています。
- ウィジェットをタップすると、すべてのアラームが、CloudWatchによる状態の理由とその状態になった時刻とともに表示され、どのアラームもAWSコンソールで開けます。中サイズまたは大サイズのウィジェットでは、アラームをタップするとAWSコンソールでそのアラームに直接移動します。
結果:ウィジェットにアラームが一覧表示され、アラーム状態のものが先頭に表示されます。iPhoneとiPadのロック画面では、「1件がアラーム状態」や「すべてOK」のような見出しが表示されます。
ダッシュボードの仕組み
どのツールを使っても、ダッシュボードは最終的に次のようになります(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は各アラームをそのリージョンで検索するため、1つのウィジェットに複数のリージョンのアラームを表示できます。
アラームの並び順
- CloudPeekでは、
ALARM状態のアラームが常に先頭に表示され、次にデータ不足のアラーム、見つからないアラーム、OKのアラームの順に続きます。表示しきれないほどアラームがある場合でも、対応が必要なものが表示されます。 sortByがない場合、コンソールはアラームを名前順に並べ、CloudPeekは一覧の順序を保ちます。その場合もALARM状態のアラームが先頭です。- 小サイズのウィジェットには、見出しと最初の3〜4件のアラームが表示されます。中サイズ以上のウィジェットには入るだけ表示され(大サイズで約12件)、それぞれに状態が変わってからの経過時間が付きます。それ以上は+N件としてまとめて表示されます。
- 小サイズのウィジェットとロック画面の見出しには、N件がアラーム状態(赤)、すべてのアラームがOKの場合はすべてOK(緑)、どのアラームにもまだ十分なデータがない場合はデータなし、データがないアラームや見つからないアラームがある場合はN件が不明と表示されます。
- 各アラームの記号は、その状態を表します。アラームリストを参照してください。
アラーム発生時に通知を受け取る
アラームウィジェットのアラームのいずれかがALARMになると、CloudPeekは、アラーム名と、「Threshold Crossed: 1 datapoint [12.0] was greater than the threshold (10.0).」のようなCloudWatchの理由を示した通知を送信できます。本番環境のアラームのようにダッシュボードからピン留めしたものや、アラームとアラームサマリーのプリセットなど、どのアラームウィジェットでも使えます。すべてのアカウントを対象とするものも含まれ、その場合はいずれかのアカウントでアラームが発生すると通知されます(すべてのアカウントのアラームを参照)。
- ウィジェットタブで本番環境のアラームをタップし、ウィジェットの詳細画面を開きます。
- アラームの一覧の下にあるアラーム発生時に通知をオンにします。
- 初回は、CloudPeekからの通知を許可するかどうかをスマートフォンが確認します(AndroidではAndroid 13以降)。許可をタップします。
結果:スイッチがオンになります。更新時に、前回の更新ではアラーム状態でなかったウィジェットのアラームがアラーム状態になっていると、「prod-api-5xx-errorsがアラーム状態です」のような通知が届きます。通知をタップするとウィジェットの詳細画面が開き、すべてのアラームの理由と、AWSコンソールで各アラームを開くリンクが表示されます。
通知は、ウィジェットの更新から届きます。更新は、ウィジェットを表示しているホーム画面ウィジェット(iPhoneとiPadではロック画面ウィジェットも)、ウィジェットを含む概要、そしてアプリで行われます。ステップ2のとおりにウィジェットをホーム画面に置いておいてください。そうしないと、CloudPeekを開いている間しか更新されません。
オンコールの呼び出しの代わりにはなりません。通知はウィジェットの更新から届くため、ウィジェットの更新頻度より速くはなりません。iPhoneとiPadでは数十分おきになることが多く、低電力モードのときやウィジェットをあまり見ないときはさらに間隔が空きます。Androidでは最短でも15分おきで、スマートフォンがバッテリーを節約している間はさらに間隔が空きます(ウィジェットが更新されるタイミングを参照)。アプリを開いたときにも更新されます。数分以内に誰かが対応する必要があるアラームには、引き続きAmazon SNSやオンコールツールで呼び出しを行ってください。
- 各アラームは、何回の更新や何個のウィジェットで検出されても、アラーム状態になるたびに1回だけ通知されます。通知をオンにした時点ですでにアラーム状態のアラームは、次に発生したときに通知されます。OKからデータ不足になったアラームは発生ではないため、通知されません。
- 同時に発生したアラームが3件までなら、それぞれに通知が届きます。それより多い場合は、「4件のアラームがアラーム状態です」のような、すべてのアラーム名を挙げた1件の通知になります。
- ウィジェットが表示する別のアラームと同じ名前のアラームは、リージョン付きで示されます。アカウントをまたぐ場合は、区別に必要なときに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にメールでお問い合わせください。シークレットアクセスキーは絶対に送らないでください。