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 を作成することがないので、メトリクスを選択できなかった時は一瞬戸惑いました。
本エントリがどなたかのお役に立てれば幸いです。