MySQLのログをCloudWatchに出力させるCDKの設定について。 対象となるログは、エラーログ、ジェネラルログ、スロークエリーログになります。

CDKの設定

エラーログはデフォルトで有効なので、cloudwatchLogsExports に "error" を指定するだけです。

cloudwatchLogsExports: ["error"]

ジェネラルログ(general)とスロークエリーログ(slow_query)は、デフォルトで無効になっているので、 有効にする設定を追加する必要があります。 CloudWatchへ出力させる場合は、cloudwatchLogsExports と以下の設定も必要になります。 2つのログはテーブルに記録されるのがデフォルトなので、以下でファイルに出力しないとCloudWatch には出力されません。

log_output: "FILE",

ジェネラルログを有効にする場合は、以下をParameterGroup に指定します。 CloudWatchへ出力する場合は、cloudwatchLogsExports に "general" を追加します。

general_log: "1"

スロークエリーログ(slow_query)を有効にする場合、以下を ParameterGroup に指定します。 秒数のところはスロークエリーの閾値を指定します。 CloudWatchへ出力する場合は、cloudwatchLogsExports に "slowquery" を追加します。

slow_query_log: "1"
long_query_time: "秒数"

例 3つのログをCloudWatchに出力する場合。スロークエリーの閾値は10秒

    const rdsInstance = new Rds.DatabaseInstance(
      this,
      `${stackName}DBInstance`,
      {
        ....

        parameterGroup: new Rds.ParameterGroup(
          this,
          `${stackName}RdsParameterGroup`,
          {
            engine: Rds.DatabaseInstanceEngine.mysql({
              version: Rds.MysqlEngineVersion.VER_8_0_39,
            }),
            parameters: {
              general_log: "1",
              slow_query_log: "1",
              long_query_time: "10",
              log_output: "FILE",
            },
          }
        ),

        // CloudWatchにログを記録
        cloudwatchLogsExports: ["error", "general", "slowquery"],
      }
    );

スロークエリーログ(Slow Query Log)

現在の閾値を確認したい場合、MySQLクライアントでMySQLに接続して確認します。

show variables like "%query_time%";
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+
1 row in set (0.003 sec)
上記の閾値は1秒になります。

接続用設定、接続方は以下を参照

スロークエリーのテスト

MySQLではSLEEP関数を使うことで簡単にスロークエリーログの確認ができます。

実行方法は、MySQLクライアントやMariadbクライアント等でMySQLに接続して、以下のクエリーを実行するだけです。 秒数は各自のスロークエリーに設定した閾値に合わせて指定します。

SELECT SLEEP(秒数);

例 5秒のクエリーを実行

MySQL [CdkTestDb_DBInstance]> SELECT SLEEP(5);
+----------+
| SLEEP(5) |
+----------+
|        0 |
+----------+
1 row in set (5.001 sec)

CloudWatchのロググループでスロークエリーログを確認します。

例 CloudWatchのロググループ名

/aws/rds/instance/cdkteststack-cdktestdbdbinstancexxx12345-xxxxxxxxxxxxx/slowquery

例 ログの詳細

# Time: 2025-01-17T14:02:41.222383Z
# User@Host: admin[admin] @  [10.0.0.138]  Id:    12
# Query_time: 5.000304  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 1
use CdkTestDb_DBInstance;
SET timestamp=1737122556;
SELECT SLEEP(5);