- 公開日
- 最終更新日
[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と組み合わせると便利かなと思います。例えば特別な対応方法や申し送り事項がある場合、記載しておくと人的ミスの削減に繋がりそうです。
運用でアラート疲れしている方の参考になれば幸いです。
この記事は私が書きました
森 翔吾
記事一覧最近はコンテナ・サーバレスを学習しています。 よろしくお願いします。
