AWSのCloudWatchLogsを使ったRDSのスロークエリ調査について

エキサイトのAです。

RDSではスロークエリを出力する機能がありますが、

今回はAWSのCloudWatch Logs Insightsを使ったスロークエリの改善について紹介させていただきます。

Amazon CloudWatch Logsとは、AWSのEC2インスタンスやRDS、Route53などのAWS上のサービスのログを可視化して確認できるサービスです。

CloudWatch Logs Insightsを使うことで、CloudWatch Logsのログを検索して分析することができます。

RDS側でスロークエリログを出力する設定を行う

まずはCloudWatch LogsにRDSのスロークエリを設定を行います。 「データベースの設定」を行う際に詳細設定から設定することができます。 既にDBを作っている場合でも「DB クラスターの変更」からいつでも設定可能です。

設定が終わったらCloudWatch Logs上で /aws/rds/[インスタンス or クラスター]/[インスタンス名 or クラスター名]/slowquery といったログができていることを確認します。

あとはClowdWatch Logs上からLogs Insightsを開いてスロークエリの確認を行えます。

Logs Insightsのクエリについて

Logs Insightsではクエリを投げることによって、確認しているログの中から指定のログを取ってくることができます。

デフォルトの  fields @timestamp, @message | sort @timestamp desc | limit 20 では、スロークエリのタイムスタンプとメッセージを最新20件取ってくるクエリが書かれています。

主に使うものとして

  • filter 1 つ以上の条件に一致するログ情報を取得。
  • sort ログイベントを昇順 (asc) または降順 (desc) でソートする。
  • limit ログイベントの数を指定。
  • parse ログイベントから、正規表現で処理できる一時的なフィールドを作成。
  • display 表示したい内容を設定する。
  • fields ログイベントから取得したいフィールドを設定。

などが挙げられます。

その他のクエリの構文については以下の公式ドキュメントで紹介されています。 docs.aws.amazon.com

クエリの例

クエリタイムの長い順に100件取得

fields @timestamp, @message
| parse @message /Query_time:\s*(?<Query_time>[0-9]+(?:\.[0-9]+)?)\s*[\s\S]*?;/
| display @timestamp, Query_time, @message
| sort Query_time desc
| limit 100

このように、parseで取得ログを指定したり、様々な条件を指定することで欲しいログの分析を行うことができます。 また、今回はスロークエリにのみ絞りましたが通常のログや監査ログなどでも当然使用可能です。 更に詳細なクエリについてはまた別途紹介させていただきます。

SQLにコメントを書く

素早い原因究明と検索のしやすさの観点からどのようなクエリなのかを明確にするため、SQLにコメントはできるだけ書いておくことが重要です。

# 指定の作者名からidを取得する
SELECT id FROM table
WHERE author = 'taro'

例として上記のようにクエリコメントを書くことで、SQLがどのようなクエリなのかを一目でわかる上に、filter条件に指定の作者名からidを取得する と追加することで 関連クエリを検索しやすくなります。

終わりに

クエリの分析を素早く行うことで普段のクエリ改善の効率化だけではなく、障害が起きた際の対応も早くなります。 そのため、普段からクエリの分析はできるように慣れておくと良いです。