Имеется пачка AWS RDS инстансов с MariaDB.
Бекенд-разработчики просят включить им slow-логи, что бы они могли дебажить свои запросы.
Задача — включить логи, и добавить их передачу в CloudWatch Logs для дальнейшего анализа.
RDS, как и всё остальное, у нас создаётся из CloudFormation шаблона — поэтому будут примеры и с ним.
Кроме стандартных general/error/slow логов — можно подключить Audit Plugin для активации Audit-лога, но о нём в другой раз. Документация по Audit плагину — тут>>>.
Содержание
DB Parameter Group — включение логов
Сейчас наша Parameter Group выглядит так:
...
"MasterDBParamGroup": {
"Type": "AWS::RDS::DBParameterGroup",
"Properties": {
"Description": "Master Database Parameter Group",
"Family": "mariadb10.0",
"Parameters" : {
"net_read_timeout": 60
},
"Tags" : [
{"Key" : "Name", "Value" : { "Fn::Join" : [ "-", [ {"Ref" : "AWS::StackName"}, "master-db-params"] ] } },
{"Key" : "Env", "Value" : {"Ref" : "ENV"} }
]
}
},
...
RDS поддерживает четыре типа логов:
- audit
- error
- general
- slowquery
Что бы включить логи — потребуется добавить значения:
slow_query_loggeneral_loglog_error(включен по умолчанию, и изменить его нельзя)
Кроме того — изменить параметры:
long_query_time— время в секундах, после которого запрос будет ссчитаться slow и будет занесён в slow loglog_output— установить в FILE, для передачи в CloudWatch Logs
Сначала добавим через AWS UI, потом обновим CloudFormation шаблон.
Находим Parameter Group инстанса:
Добавляем нужные параметры:
Проверяем:
[simterm]
$ aws rds --profile bm-backend describe-db-parameters --db-parameter-group-name mobilebackend-dev-masterdbparamgroup-258i35vgxvdi | grep -A1 'slow_query_log\|general_log\|log_error'
"ParameterName": "general_log",
"ParameterValue": "1",
--
"ParameterName": "general_log_file",
"ParameterValue": "/rdsdbdata/log/general/mysql-general.log",
--
"ParameterName": "log_error",
"ParameterValue": "/rdsdbdata/log/error/mysql-error.log",
--
"ParameterName": "slow_query_log",
"ParameterValue": "1",
--
"ParameterName": "slow_query_log_file",
"ParameterValue": "/rdsdbdata/log/slowquery/mysql-slowquery.log",
[/simterm]
Логи появятся в Logs & events.
Кроме того — устанавливаем log_output в FILE (по умолчаннию — TABLE):
Сохраняем.
Экспорт в CloudWatch Logs
Переходим в RDS, выбираем инстанс, жмём Modify:
Пролистываем вниз, выбираем логи, которые будем пушить в CloudWatch:
Жмём Continue, проверяем список изменений, которые будут применены, соглашаемся:
Ждём пару минут, пока применятся новые параметры:
Переходим в CloudWatch Logs — и вуаля:
И сами логи:
CloudFormation
Последний шаг — добавить всё это в CloudFormation шаблон.
Тут потребуется изменить ресурс AWS::RDS::DBParameterGroup и добавить параметры:
...
"MasterDBParamGroup": {
"Type": "AWS::RDS::DBParameterGroup",
"Properties": {
"Description": "Master Database Parameter Group",
"Family": "mariadb10.0",
"Parameters" : {
"log_output": "FILE",
"general_log": 1,
"slow_query_log": 1,
"long_query_time": 10,
"log_queries_not_using_indexes": 1,
"net_read_timeout": 60
},
"Tags" : [
{"Key" : "Name", "Value" : { "Fn::Join" : [ "-", [ {"Ref" : "AWS::StackName"}, "master-db-params"] ] } },
{"Key" : "Env", "Value" : {"Ref" : "ENV"} }
]
}
},
...
Далее — включаем экспорт логов: обновляем сам ресурс AWS::RDS::DBInstance — добавляем параметр EnableCloudwatchLogsExports, и в нём указываем список логов — error, general, slowquery:
...
"DB1MasterRDS" : {
"Type" : "AWS::RDS::DBInstance",
"Properties" : {
"DBInstanceIdentifier" : { "Fn::Join" : [ "-", [ {"Ref" : "AWS::StackName"}, "db1-master-rds"] ] },
"MasterUsername" : { "Ref" : "DB1RootUser" },
"MasterUserPassword" : { "Ref" : "DB1RootPassword" },
"AllocatedStorage" : { "Ref" : "DB1AllocatedStorage" },
"Engine" : "mariadb",
"StorageType": "gp2",
"AutoMinorVersionUpgrade": false,
"PubliclyAccessible" : false,
"DBInstanceClass" : { "Ref" : "DB1MasterDBInstanceClass" },
"DBSubnetGroupName" : { "Ref" : "DB1SubnetGroup" },
"DBParameterGroupName" : {"Ref" : "MasterDBParamGroup" },
"EnableCloudwatchLogsExports": [
"error",
"general",
"slowquery"
],
"BackupRetentionPeriod": {"Ref" : "BackupRetentionPeriod" },
"PreferredBackupWindow": {"Ref" : "PreferredBackupWindow" },
"VPCSecurityGroups" : [ { "Fn::GetAtt" : [ "MasterDBSecurityGroup", "GroupId" ] } ],
"MultiAZ": {"Ref" : "MultiAZ" },
"Tags" : [
{"Key" : "Name", "Value" : { "Fn::Join" : [ "-", [ {"Ref" : "AWS::StackName"}, "db1-master-rds"] ] } },
{"Key" : "Env", "Value" : {"Ref" : "ENV"} }
]
},
"DeletionPolicy" : "Snapshot"
},
...
Запускаем апдейт стека:
Проверяем:
Готово.










