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);