Aurora PostgreSQLからSlowQueryをログに出す with terraform
結論
↓こんな感じです。
resource "aws_rds_cluster_parameter_group" "parameter_group" {
name = "parameter-group"
family = "aurora-postgresql15"
parameter {
name = "log_min_duration_statement"
value = "3000"
}
}
resource "aws_rds_cluster" "rds_cluster" {
...
engine = "aurora-postgresql"
engine_version = "15.3"
db_cluster_parameter_group_name = aws_rds_cluster_parameter_group.parameter_group.name
...
}
実装方法
前提条件
- 3秒以上かかってるステートメントをログに出力する
1. 使うAurora PostgreSQLのパラメータグループを調べてパラメータグループファミリーを特定する
terraformのリソースであるaws_rds_cluster_parameter_group
は family
の指定が必須です。
なのでこの family
を最初に調べます。
すでにDBが作成済みの場合は次のコマンドで適用されてるDBのエンジンとそのバージョンがわかります。
aws rds describe-db-clusters --db-cluster-identifier {identifier}
...
"Engine": "aurora-postgresql",
"EngineVersion": "15.3",
...
次のコマンドでエンジンからバージョンの一覧とその詳細がわかります。前段で取得したエンジンとバージョンを使って自分の使っているDBのパラメータグループファミリーを見つけてください。
aws rds describe-db-engine-versions --engine aurora-postgresql --query "DBEngineVersions[]"
{
"Engine": "aurora-postgresql",
"EngineVersion": "15.3",
"DBParameterGroupFamily": "aurora-postgresql15",
"DBEngineDescription": "Aurora (PostgreSQL)",
"DBEngineVersionDescription": "Aurora PostgreSQL (Compatible with PostgreSQL 15.3)",
...
もしDBが作成済みでない場合は、使う予定のエンジンとバージョンを決めうちして同様の作業をしてください。
2. 設定したいパラメータを調べてterraformのリソースを作る
aws_rds_cluster_parameter_group
を作成し、取得したパラメータファミリーと設定したいパラメータを設定します。
3秒以上かかってるステートメントをログに出力したいので、log_min_duration_statement
を 3000
に設定し、 terraform apply
を実行します。
(3.の作業が残ってるのでここではまだDBとはつなげません。)
resource "aws_rds_cluster_parameter_group" "parameter_group" {
name = "parameter-group"
family = "aurora-postgresql15"
parameter {
name = "log_min_duration_statement"
value = "3000"
}
}
3. デフォルトのパラメータグループとの差分を確認
私はすでに動いているDBに対して新しいパラメータグループを付け替える作業を行ったので、大事をとってデフォルトのパラメータグループとの差分を確認します。
次のコマンドでパラメーターグループのパラメーターがわかるので、これを使ってデフォルトのパラメータグループと新しく作ったパラメータグループのパラメータを取得します。
aws rds describe-db-cluster-parameters --db-cluster-parameter-group-name {db-cluster-parameter-group-name}
デフォルトのパラメータグループの名前ですが、パラメータファミリーの名前がそのままデフォルトのパラメータグループの名前なります。
そして適当なdiffを取るツールで差分を確認します。
私の環境では意図していない変更が見つかりました。
{
"ParameterName": "apg_write_forward.idle_in_transaction_session_timeout",
- "ParameterValue": "0",
+ "ParameterValue": "86400000",
"Description": "Sets the maximum allowed idle time between forwarded queries, when in a transaction.",
"Source": "system",
"ApplyType": "static",
"DataType": "integer",
"AllowedValues": "1-2147483647",
"IsModifiable": true,
"MinimumEngineVersion": "15.3",
"ApplyMethod": "pending-reboot",
"SupportedEngineModes": [
"provisioned"
]
},
...
{
"ParameterName": "log_min_duration_statement",
+ "ParameterValue": "3000",
"Description": "(ms) Sets the minimum execution time above which statements will be logged.",
- "Source": "engine-default",
+ "Source": "user",
"ApplyType": "dynamic",
"DataType": "integer",
"AllowedValues": "-1-2147483647",
"IsModifiable": true,
- "ApplyMethod": "pending-reboot",
+ "ApplyMethod": "immediate",
"SupportedEngineModes": [
"provisioned"
]
},
別途調査をしましたが特に問題ない変更だったので次の作業に進みます。
4. DBとパラメータグループを紐づける
db_cluster_parameter_group_name
を使ってDBとパラメータグループを紐づけます。
resource "aws_rds_cluster_parameter_group" "parameter_group" {
name = "parameter-group"
family = "aurora-postgresql15"
parameter {
name = "log_min_duration_statement"
value = "3000"
}
}
resource "aws_rds_cluster" "rds_cluster" {
...
engine = "aurora-postgresql"
engine_version = "15.3"
db_cluster_parameter_group_name = aws_rds_cluster_parameter_group.parameter_group.name
...
}
以上です。
参考
Amazon Aurora PostgreSQL 個のパラメータ - Amazon Aurora
AWS CLI Command Reference — AWS CLI 1.29.71 Command Reference
RDSのログをCloudWatch Logsからdatadog logsに流す - terraformを添えて - - Qiita