RDS でスロークエリログが発生したことを検知する CloudWatch Alarm をマネジメントコンソールから設定してみた
こんにちは、岩城です。
先日、RDS でスロークエリログが発生したことを検知したいことがありましたので、方法を共有したいと思います。
今回のケースでは、スロークエリログが出力したことだけを検知したかったので、実際のログ内容を検知内容に含める必要はありませんでした。
アラームに設定するメトリクスは IncomingLogEvents
アラームに設定するメトリクスはIncomingLogEventsにしました。
IncomingLogEventsは、CloudWatch Logs のロググループにアップロードされたログイベントの数をカウントするメトリクスです。
CloudWatch Alarm を設定する
CloudWatch Alarm を設定する方法は様々あるのですが、本エントリではマネジメントコンソールから設定します。

メトリクスを選択する際、マネジメントコンソール特有の注意があります。
選択可能なメトリクスは、一度でもメトリクスが記録されたものが対象になる、ということです。
この時点では RDS のスロークエリログがまだ一度も出力されていなかったので、エラーログ以外はメトリクスが存在しませんでした。


では、どうすれば良いでしょうか。
答えは簡単です。適当なロググループを選択して先に進み、後からロググループ名を書き換えれば良いです。
適当なロググループのIncomingLogEventsを選択して先に進みます。

メトリクスと条件の指定でLogGroupNameをスロークエリログのロググループ名である/aws/rds/instance/<インスタンス名>/slowqueryに書き換えます。
1 件でも出力されたらすぐに検知したかったので、統計を 合計 期間を 1 分、1 以上のときにアラームをトリガーするようにしました。

メール本文に記載するアラームの説明は「SlowQueryが発生しました!」にしました。

以上でアラームの設定は完了です。
意図的にスロークエリを発生させて CloudWatch Alarm をトリガーする
CloudShell VPC environment から RDS に接続して、クエリをスリープさせて意図的にスロークエリを発生させます。
CloudShell VPC environment は、VPC 上で CloudShell を起動する機能です。
MySQL クライアントが標準インストールされているので、わざわざ EC2 を起動せずとも簡単に RDS に接続できるので便利です。
[アップデート] CloudShell を任意の VPC 上で起動できる CloudShell VPC environment が提供されました! | DevelopersIO
RDS のパラメーターグループでlong_query_timeを 1 に設定していたので、5 秒スリープさせればスロークエリログが出力されます。

MySQL [(none)]> SELECT sleep(5);
+----------+
| sleep(5) |
+----------+
| 0 |
+----------+
1 row in set (5.001 sec)
スロークエリログが出力されたことでアラームがトリガーされました。

無事メールも飛んできました。

以上でスロークエリログが 1 件でも出力された検知できるようになりました。
おわりに
メトリクスがまだ記録されていない状態で、CloudWatch Alarm を作成し、アラームがトリガーされることを確認できました。
普段マネジメントコンソールから CloudWatch Alarm を作成することがないので、メトリクスを選択できなかった時は一瞬戸惑いました。
本エントリがどなたかのお役に立てれば幸いです。







