Имеется пачка 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_log
general_log
log_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" }, ...
Запускаем апдейт стека:
Проверяем:
Готово.