MackerelでRDSのイベント&ログ監視をやってみた

2023.01.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちはネクストモード田邉です。

弊社では監視にMackrelを利用しています。

RDS MultiAZ構成のフェイルオーバーをMackrelのアラートとして検知したかったので試してみました。

経緯

RDSイベントはイベントサブスクリプションやEventBridge + Lambdaを利用してSNSで通知するパターンが一般的かと思いますが、その他のRDSメトリクスやEC2等のサービスをMackerelで実施している都合、RDSイベントについてもMackerelで検知したかったので実践してみました。

設定概要

  • RDSイベントについてはEventBridge経由でCloudwatchLogsに配信されたログをEC2上で動作しているmackerel-agentが監視します。尚、MackerelでCloudwatchLogs上のログを監視するためにはプラグインとしてcheck-aws-cloudwatch-logs-insightsが必要になります。

  • ログはRDSの設定でエクスポートが可能なため、EventBridgeの設定は不要です。CloudwatchLogsに配信されたログ監視にはRDSイベントと同様にcheck-aws-cloudwatch-logs-insightsで監視可能です。

設定すること

  • CloudwatchLogsにログを配信する
    • RDSログのエクスポート
    • EventBridge設定(RDSイベント用)
  • EC2 mackerelエージェント設定
    • mackerel-agentのインストール
    • プラグイン(check-aws-cloudwatch-logs-insights)のインストール
    • EC2のIAMロールにCloudwatchLogs用のIAMポリシーを付与
    • ログ監視のキーワード設定

やってみた

RDSログのエクスポート

RDS設定画面内からエクスポートしたいログを選択してください。ログのエクスポートは設定後でも変更可能です。

EventBridge設定(RDSイベント用)

EventBridgeのパス→ルールから[ルールを作成]を選択してください。


ルール詳細についてもデフォルトのままで[次へ]を選択してください。


イベントパターン構築画面では画面下部になるイベントパターンからRDSを選択、イベントタイプはすべてのイベントを選択して、[次へ]を選択してください。


ターゲットにCloudWatchロググループを選択、ロググループを任意のグループに指定すれば完了です。

mackerel-agentのインストール

こちらはMackerelの公式サイトをご確認ください。

Amazon Linuxにmackerel-agentをインストールする - Mackerel ヘルプ

今回はAmazon Linux 2のため以下のコマンドでインストールしました。

curl -fsSL https://mackerel.io/file/script/amznlinux/setup-all-yum-v2.sh | MACKEREL_APIKEY='' sh

上記コマンドのについてはMackrelのダッシュボードからご自身のAPIキーを確認して入力してください。

プラグイン(check-aws-cloudwatch-logs-insights)のインストール

こちらもMackerelの公式サイトをご確認ください。

check-aws-cloudwatch-logs-insights を正式リリースしました - Mackerel お知らせ #mackerelio

今回は以下コマンドでインストールしました。

sudo mkr plugin install check-aws-cloudwatch-logs-insights

上記はCLIツール mkr がインストールされてることが前提のため、初回の方は以下コマンドでmkrのインストールを事前に実行してください。

yum install mkr

yum以外のインストール方法は以下の公式サイトをご確認ください。

CLIツール mkr を使う - Mackerel ヘルプ

EC2のIAMロールにCloudwatchLogs用のIAMポリシーを付与

mackerel-agentをインストールしたEC2はlogs:GetQueryResults、logs:StartQuery、logs:StopQueryの権限が必要です。

以下IAMポリシーを付与したIAMロールをEC2にアタッチしてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:GetQueryResults",
                "logs:StartQuery",
                "logs:StopQuery"
            ],
            "Resource": "*"
        }
    ]
}

ログ監視のキーワード設定

最後にどのログメッセージを監視するか等の条件を設定します。mackerel-agentをインストールしたEC2で以下のコマンドを実行して設定ファイルを編集します。

sudo vi /etc/mackerel-agent/mackerel-agent.conf

DBログ、RDSイベントそれぞれを設定ファイルの末尾に追加してください。以下はサンプルです。

  • DBログ
    • LOG-GROUP-NAMEは監視対象のCloudwatchLogsのロググループ名
    • 監視条件は例として、Warning or Errorを指定
    • メッセージは各DBエンジンの仕様に沿って指定してください
[plugin.checks.mysql-db-alert]
command = ["/opt/mackerel-agent/plugins/bin/check-aws-cloudwatch-logs-insights", "--log-group-name", "<LOG-GROUP-NAME>", "--filter", "filter (@message like /Warning/ or @message like /Error/ )", "--critical-over", "0", "--return"]
env = { AWS_REGION = "ap-northeast-1" }
  • RDSイベント
    • LOG-GROUP-NAMEは監視対象のCloudwatchLogsのロググループ名
    • 監視条件は例として、RDS-EVENT-0004 or RDS-EVENT-0006を指定
    • RDSイベントの詳細は以下からご確認ください。

Amazon RDS のイベントカテゴリとイベントメッセージ

[plugin.checks.rds-events]
command = ["/opt/mackerel-agent/plugins/bin/check-aws-cloudwatch-logs-insights", "--log-group-name", "<LOG-GROUP-NAME>", "--filter", "filter (@message like /RDS-EVENT-0004/ or @message like /RDS-EVENT-0006/ )", "--critical-over", "0", "--return"]
env = { AWS_REGION = "ap-northeast-1" }

テスト

RDSインスタンスを再起動してMackerelで検知できるかテストします。アクションから再起動を選択します。
Mackerelのダッシュボードを確認するとDBインスタンスの再起動を示すログが検知されてることが確認できました。

考察

今回はRDSイベント用にEventBridgeを利用しましたが、他サービスも同様にCloudwatchLogsに配信可能なため、他のマネージドサービスを採用する場合もMackerelで一元監視したい場合に有効な手段だと感じました。

以上