- 公開日
- 最終更新日
【CloudWatch】CloudWatchアラームを見やすくする方法3選
この記事を共有する
目次
はじめに
こんにちは。サービスGの森です。
突然ですがAWSの運用においてアラート疲れしていませんか?
アラート疲れの原因として、CloudWatchアラームの見づらさや、メール仕分けのしにくさが考えられます。
そこで、今回はCloudWatchアラームを見やすく成形する方法を3つ紹介します。
まず結論
以下3つの方法を紹介します!
- CloudWatchアラームの説明
- EventBridge入力トランスフォーマー
- EventBridge + Lambda
| 方法 | 実装コスト | メール件名の指定 | タイムスタンプの成形 |
|---|---|---|---|
| 方法1 | 低(単体の場合) | 不可 | 不可 |
| 方法2 | 中 | 不可 | 不可 |
| 方法3 | 高 | 可 | 可 |
各方法について詳しく説明していきます。
方法1. CloudWatchアラームの説明

実装手順
1. CloudWatchコンソールから、対象のアラームを選択して編集をクリックします
2. アラームの説明に任意の説明文を直接記載します

3. アラームを検知後、以下のメールが送信されます

メリット
- コーディングの知識が無くても簡単に実装できる
- 「markdown + 日本語」に対応している
デメリット
- 動的な値を含められないため、アラームごとに説明文を作成する必要がある
- メール本文の一部(Descriptionフィールド)に記載しているため、単純に文章量が増える
方法2. EventBridge入力トランスフォーマー

実装手順
1. EventBridgeルールを作成します
イベントパターン
{
"source": [
"aws.cloudwatch"
],
"detail-type": [
"CloudWatch Alarm State Change"
],
"resources": [
"<CLoudWatchアラームARN>"
]
}
2. ターゲットに対象のSNSトピックを選択し、sns:Publish権限を付与したロールをアタッチします
3. ターゲット入力に入力トランスフォーマーを選択して、以下の様に設定します
入力パス
{
"account": "$.account",
"alarm": "$.detail.alarmName",
"currentState": "$.detail.state.value",
"dimensions": "$.detail.configuration.metrics[0].metricStat.metric.dimensions",
"metricName": "$.detail.configuration.metrics[0].metricStat.metric.name",
"namespace": "$.detail.configuration.metrics[0].metricStat.metric.namespace",
"previousState": "$.detail.previousState.value",
"reason": "$.detail.state.reason",
"region": "$.region",
"resourceIdentifier": "$.detail.configuration.metrics[0].metricStat.metric.dimensions.InstanceId",
"timestamp": "$.detail.state.timestamp"
}
テンプレート
"======== CloudWatch アラーム通知 ========" "アラーム名: <alarm>" "状態: <currentState> (前の状態: <previousState>)" "理由: <reason>" "発生時刻: <timestamp>" "リージョン: <region>" "アカウント: <account>" "メトリック: <namespace>:<metricName>" "リソース識別子: <resourceIdentifier>" "========================================"
4. アラームを検知後、以下のメールが送信されます

メリット
- 動的な値を含めることができる(タイムスタンプ、以前の状態など)
デメリット
- メール件名を指定できない
- タイムスタンプのフォーマットができない
方法3. EventBridge + Lambda
1. Lambda関数を作成します(今回はPythonで作成)
import json
import boto3
import os
from datetime import datetime, timedelta
# SNS設定
sns = boto3.client('sns')
sns_arn = ''
def lambda_handler(event, context):
try:
# EventBridgeからのCloudWatchアラームを処理
detail = event.get('detail')
# アラーム情報
alarm_name = detail['alarmName']
# 情報を取得
new_state = detail['state']['value']
reason = detail['state']['reason']
prev_state = detail['previousState']['value']
namespace = detail['configuration']['metrics'][0]['metricStat']['metric']['namespace']
metric_name = detail['configuration']['metrics'][0]['metricStat']['metric']['name']
resource_id = detail['configuration']['metrics'][0]['metricStat']['metric']['dimensions']
region = event.get('region')
account = event.get('account')
# timestampをdatetimeオブジェクトで取得
timestamp = datetime.strptime(
detail['state']['timestamp'],
"%Y-%m-%dT%H:%M:%S.%f%z"
) + timedelta(hours=9)
# timestampをJSTにフォーマット
formatted_time = datetime.strftime(timestamp, "%Y-%m-%d %H:%M:%S.%f")[:-3] + "(JST)"
# メッセージを作成
message = f"""======== CloudWatch アラーム通知 ========
アラーム名: {alarm_name}
状態: {new_state} (前の状態: {prev_state})
理由: {reason}
発生時刻: {formatted_time}
リージョン: {region}
アカウント: {account}
メトリック: {namespace}:{metric_name}
リソース識別子: {resource_id}
========================================"""
# 件名を作成
subject = f"CloudWatch アラート: {alarm_name} ({new_state})"
# SNSトピックに送信
sns.publish(
TopicArn=sns_arn,
Message=message,
Subject=subject
)
return {'statusCode': 200, 'body': 'Message processed successfully'}
# 例外処理
except Exception as e:
return {'statusCode': 500, 'body': f'Unexpected error: {str(e)}'}
2. Lambda関数にアタッチされたロールにsns:Publish権限を付与します
3. EventBridgeルールをターゲットでLambda関数を呼び出すように設定し、lambda:InvokeFunction権限を付与します
4. アラームを検知後、以下のメールが送信されます

メリット
- メール件名を指定できる
- タイムスタンプのフォーマットができる(表示形式、JST変換など)
- その他、柔軟にメッセージを作成できる
デメリット
- コーディングの知識、実装・保守コストが発生
まとめ
方法1の説明文は実装が簡単ですが、アラームが増えるにつれ実装が大変になります。
...ですが、方法1は方法2,3と組み合わせると便利かなと思います。例えば特別な対応方法や申し送り事項がある場合、記載しておくと人的ミスの削減に繋がりそうです。
運用でアラート疲れしている方の参考になれば幸いです。
この記事は私が書きました
森 翔吾
記事一覧最近はコンテナ・サーバレスを学習しています。 よろしくお願いします。