AWS: RDS логи, сбор в CloudWatch Logs и CloudFormation

Автор: | 03/07/2019
 

Имеется пачка 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 log
  • log_output — установить в FILE, для передачи в CloudWatch Logs

Сначала добавим через AWS UI, потом обновим CloudFormation шаблон.

Находим Parameter Group инстанса:

Добавляем нужные параметры:

Проверяем:

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",

Логи появятся в 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"
    },
...

Запускаем апдейт стека:

Проверяем:

Готово.