ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

[CloudWatch]CloudWatchアラームを見やすくする方法3選

この記事を共有する

目次

はじめに

こんにちは。サービスGの森です。

突然ですがAWSの運用においてアラート疲れしていませんか?
アラート疲れの原因として、CloudWatchアラームの見づらさや、メール仕分けのしにくさが考えられます。 そこで、今回はCloudWatchアラームを見やすく成形する方法を3つ紹介します。

まず結論

以下3つの方法を紹介します!

  1. CloudWatchアラームの説明
  2. EventBridge入力トランスフォーマー
  3. EventBridge + Lambda
方法 実装コスト メール件名の指定 タイムスタンプの成形
方法1 低(単体の場合) 不可 不可
方法2 不可 不可
方法3

各方法について詳しく説明していきます。

方法1. CloudWatchアラームの説明

CloudWatchアラーム成形-説明.png

実装手順

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

CloudWatch_説明.png

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

CloudWatch_説明_メール.png

メリット

  • コーディングの知識が無くても簡単に実装できる
  • 「markdown + 日本語」に対応している

デメリット

  • 動的な値を含められないため、アラームごとに説明文を作成する必要がある
  • メール本文の一部(Descriptionフィールド)に記載しているため、単純に文章量が増える

方法2. EventBridge入力トランスフォーマー

CloudWatchアラーム成形-入力トランスフォーマー.png

実装手順

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. アラームを検知後、以下のメールが送信されます

入力トランスフォーマー_メール.png

メリット

  • 動的な値を含めることができる(タイムスタンプ、以前の状態など)

デメリット

  • メール件名を指定できない
  • タイムスタンプのフォーマットができない

方法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. アラームを検知後、以下のメールが送信されます

lambda_メール.png

メリット

  • メール件名を指定できる
  • タイムスタンプのフォーマットができる(表示形式、JST変換など)
  • その他、柔軟にメッセージを作成できる

デメリット

  • コーディングの知識、実装・保守コストが発生

まとめ

方法1の説明文は実装が簡単ですが、アラームが増えるにつれ実装が大変になります。

...ですが、方法1は方法2,3と組み合わせると便利かなと思います。例えば特別な対応方法や申し送り事項がある場合、記載しておくと人的ミスの削減に繋がりそうです。

運用でアラート疲れしている方の参考になれば幸いです。

この記事は私が書きました

森 翔吾

記事一覧

最近はコンテナ・サーバレスを学習しています。 よろしくお願いします。

森 翔吾

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。