Запись логов балансировщика в PostgreSQL
- Подготовьте облако к работе
- Создайте облачную сеть
- Создайте группы безопасности
- Подготовьте базу данных в Yandex Managed Service for PostgreSQL
- Создайте группу ВМ
- Создайте необходимые ресурсы в Yandex Application Load Balancer
- Получите идентификатор лог-группы для балансировщика
- Создайте необходимые ресурсы в Yandex Cloud Functions
- Проверьте работу балансировщика и запись логов
- Как удалить созданные ресурсы
Сценарий описывает запись логов — сообщений с информацией о каждом входящем запросе к балансировщику Yandex Application Load Balancer — в базу данных PostgreSQL.
Для логирования работы балансировщика автоматически создается лог-группа. Поставка логов из этой лог-группы в БД будет настроена в сценарии с помощью ресурсов сервиса Yandex Cloud Functions — триггера и вызываемой им функции.
БД будет создана в сценарии с помощью сервиса Yandex Managed Service for PostgreSQL.
Примечание
Некоторые шаги сценария нельзя выполнить в консоли управления. Получить идентификатор лог-группы и создать триггер с этим идентификатором можно только через интерфейс командной строки (CLI) или API.
Чтобы настроить запись логов:
- Подготовьте облако к работе.
- Создайте облачную сеть.
- Создайте группы безопасности.
- Подготовьте базу данных в Yandex Managed Service for PostgreSQL.
- Создайте группу ВМ.
- Создайте необходимые ресурсы в Yandex Application Load Balancer.
- Получите идентификатор лог-группы для балансировщика.
- Создайте необходимые ресурсы в Yandex Cloud Functions.
- Проверьте запись логов.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Перед работой нужно зарегистрироваться в Yandex Cloud и создать платежный аккаунт:
- Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь, если вы еще не зарегистрированы.
- На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки балансировщика с записью логов входят:
- плата за постоянно запущенные виртуальные машины (см. тарифы Yandex Compute Cloud);
- плата за вычислительные ресурсы, объем хранилища и резервных копий для кластера PostgreSQL (см. тарифы Yandex Managed Service for PostgreSQL);
- плата за вызовы функции для обработки логов и вычислительные ресурсы, выделенные на выполнение функции (см. тарифы Yandex Cloud Functions).
Создайте облачную сеть
Все ресурсы, созданные в сценарии, будут относиться к одной облачной сети.
Чтобы создать сеть:
- В консоли управления выберите сервис Virtual Private Cloud.
- Нажмите кнопку Создать сеть.
- Укажите Имя сети:
alb-logging-network
. - В поле Дополнительно выберите опцию Создать подсети.
- Нажмите кнопку Создать сеть.
Создайте группы безопасности
Примечание
Группы безопасности находятся на стадии Preview. Если они недоступны в вашей сети, для ресурсов будет разрешен весь входящий и исходящий трафик и дополнительной настройки не требуется.
Группы безопасности содержат правила, которые:
- разрешают балансировщику получать входящий трафик и отправлять его на ВМ, а ВМ — получать этот трафик;
- разрешают балансировщику отправлять логи в лог-группу, а кластеру PostgreSQL — получать логи из нее.
В сценарии будут созданы три группы безопасности: для балансировщика, для всех ВМ и для кластера.
Чтобы создать группы безопасности:
-
В консоли управления выберите сервис Virtual Private Cloud.
-
Откройте вкладку Группы безопасности.
-
Создайте группу безопасности для балансировщика:
-
Нажмите кнопку Создать группу.
-
Укажите Имя группы:
alb-logging-sg-balancer
. -
Выберите Сеть
alb-logging-network
. -
В блоке Правила создайте следующие правила по инструкции под таблицей:
Направление
трафикаОписание Диапазон
портовПротокол Тип источника /
назначенияИсточник /
назначениеИсходящий any Весь Любой CIDR 0.0.0.0/0 Входящий ext-http 80 TCP CIDR 0.0.0.0/0 Входящий ext-https 443 TCP CIDR 0.0.0.0/0 Входящий healthchecks 30080 TCP Проверки состояния балансировщика — -
Выберите вкладку Исходящий трафик или Входящий трафик.
-
Нажмите кнопку Добавить правило.
-
В открывшемся окне в поле Диапазон портов укажите один порт или диапазон портов, куда или откуда будет поступать трафик.
-
В поле Протокол укажите нужный протокол или оставьте Любой, чтобы разрешить передачу трафика по всем протоколам.
-
В поле Назначение или Источник выберите назначение правила:
- CIDR — правило будет применено к диапазону IP-адресов. В поле CIDR блоки укажите CIDR и маски подсетей, в которые или из которых будет поступать трафик. Чтобы добавить несколько CIDR, нажимайте кнопку Добавить CIDR.
- Группа безопасности — правило будет применено к ВМ из текущей группы или из выбранной группы безопасности.
- Проверки состояния балансировщика — правило, которое позволяет балансировщику проверять состояние ВМ.
-
Нажмите кнопку Сохранить. Таким образом создайте все правила из таблицы.
-
-
Нажмите кнопку Сохранить.
-
-
Аналогично создайте группу безопасности для ВМ с именем
alb-logging-sg-vms
, той же сетьюalb-logging-network
и следующими правилами:Направление
трафикаОписание Диапазон
портовПротокол Тип источника Источник Входящий balancer 80 TCP Группа безопасности alb-logging-sg-balancer
Входящий ssh 22 TCP CIDR 0.0.0.0/0 -
Аналогично создайте группу безопасности для кластера PostgreSQL с именем
alb-logging-sg-cluster
, той же сетьюalb-logging-network
и следующим правилом:Направление
трафикаОписание Диапазон
портовПротокол Тип источника Источник Входящий db 6432 TCP CIDR 0.0.0.0/0
Подготовьте базу данных в Yandex Managed Service for PostgreSQL
Создайте кластер
Логи, полученные от балансировщика, будут записываться в базу данных, которая входит в состав кластера Managed Service for PostgreSQL.
Чтобы создать кластер и базу данных:
-
В консоли управления выберите сервис Managed Service for PostgreSQL.
-
Нажмите кнопку Создать кластер.
-
В поле Имя кластера введите
alb-logging-cluster
. -
В поле Окружение выберите
PRODUCTION
. -
В поле Версия выберите
12
. -
В блоке Класс хоста:
- Укажите платформу
Intel Cascade Lake
. - Выберите тип
burstable
. - Укажите класс
b2.nano
.
Важно
Класс
b2.nano
был выбран только в рамках тестирования. В реальных проектах использовать хосты с гарантированной долей vCPU ниже 100% не рекомендуется. - Укажите платформу
-
В блоке Размер хранилища:
- Выберите
network-ssd
. - Укажите размер равным 10 ГБ.
Примечание
Тип и размер диска следует выбирать в соответствии с решаемыми задачами. Значения, указанные выше, используются для тестирования.
- Выберите
-
В блоке База данных укажите атрибуты БД:
- Имя базы данных. Имя БД должно быть уникальным в рамках каталога и содержать только латинские буквы, цифры и подчеркивания.
- Имя пользователя — владельца БД. Имя пользователя должно содержать только латинские буквы, цифры и подчеркивания.
- Пароль пользователя. Длина — от 8 до 128 символов.
Для базы данных, которая создается вместе с кластером, устанавливаются настройки набора символов (кодировки)
LC_CTYPE=C
иLC_COLLATE=C
. После создания эти настройки изменить нельзя, но вы можете создать новую базу с нужными настройками. -
В блоке Сетевые настройки:
- Выберите сеть
alb-logging-network
. - Выберите группу безопасности
alb-logging-sg-cluster
.
- Выберите сеть
-
В блоке Хосты добавьте хост, который будет доступен извне Yandex Cloud. Для этого включите опцию Публичный доступ.
-
В блоке Дополнительные настройки включите опции Доступ из консоли управления и Доступ из Serverless.
-
Остальные поля оставьте заполненными по умолчанию.
-
Нажмите кнопку Создать кластер.
Подробнее о создании кластера — в разделе Как создать кластер PostgreSQL.
В дальнейшем настройки кластера можно будет изменить.
Подключитесь к кластеру и создайте таблицу
В качестве примера в базу данных PostgreSQL будет записываться информация из следующих полей сообщений, которые балансировщик записывает в логи при входящих запросах:
type
— протокол запроса: HTTP или gRPC.time
— дата и время запроса.http_status
— HTTP-код ответа балансировщика на запрос.backend_ip
— IP-адрес ВМ, обработавшей запрос.request_processing_times.request_time
— длительность соединения между клиентом и балансировщиком.
Таблицу для записи нужно создать заранее:
После создания кластера вы автоматически будете перенаправлены на страницу Кластеры.
-
Дождитесь, когда статус кластера
alb-logging-cluster
изменится на Alive, и выберите этот кластер. -
Перейдите на вкладку SQL.
-
Выберите пользователя, созданного вместе с кластером, и введите его пароль.
-
Выберите базу данных, созданную вместе с кластером, и нажмите кнопку Подключиться.
-
В окне редактирования введите следующий запрос:
CREATE TABLE load_balancer_requests ( type varchar(24) NOT NULL, "time" timestamptz NOT NULL, http_status varchar(4) NOT NULL, backend_ip varchar(40) NULL, request_time numeric NULL );
-
Нажмите кнопку Выполнить.
-
Дождитесь появления надписи о завершении выполнения запроса.
Создайте группу ВМ
В качестве веб-серверов для сайта будет выступать группа виртуальных машин Compute Cloud. В этом сценарии серверы будут реализованы на LEMP-стеке (Linux, nginx, MySQL, PHP; подробнее см. в сценарии использования Веб-сайт на LAMP- или LEMP-стеке).
Чтобы создать группу ВМ:
-
В консоли управления выберите сервис Compute Cloud.
-
Откройте вкладку Группы виртуальных машин. Нажмите кнопку Создать группу.
-
Укажите имя группы ВМ:
alb-logging-ig
. -
В блоке Распределение выберите несколько зон доступности, чтобы обеспечить отказоустойчивость хостинга.
-
В блоке Шаблон виртуальной машины нажмите кнопку Задать.
-
В блоке Выбор образа/загрузочного диска откройте вкладку Cloud Marketplace и нажмите кнопку Посмотреть больше. Выберите продукт LEMP и нажмите кнопку Использовать.
-
В блоке Вычислительные ресурсы:
- Выберите платформу виртуальной машины.
- Укажите необходимое количество vCPU и объем RAM.
Для функционального тестирования сайта хватит минимальной конфигурации:
- Платформа — Intel Cascade Lake.
- Гарантированная доля vCPU — 5%.
- vCPU — 2.
- RAM — 1 ГБ.
-
В блоке Сетевые настройки выберите Сеть
alb-logging-network
, созданную ранее, и ее подсети. -
В поле Публичный адрес выберите Автоматически.
-
Выберите группу безопасности
alb-logging-sg-vms
, созданную ранее. -
Укажите данные для доступа на виртуальную машину:
-
В поле Логин введите имя пользователя.
-
В поле SSH-ключ вставьте содержимое файла открытого ключа.
Пару ключей для подключения по SSH необходимо создать самостоятельно, см. раздел о подключении к виртуальным машинам по SSH.
Внимание
IP-адрес и имя хоста (FQDN) для подключения к машине назначатся ей при создании. Если вы выбрали вариант Без адреса в поле Публичный адрес, вы не сможете обращаться к ВМ из интернета.
-
-
Нажмите кнопку Сохранить.
-
В блоке Масштабирование укажите Размер группы ВМ — 2.
-
В блоке Интеграция с Application Load Balancer выберите опцию Создать целевую группу и укажите имя группы —
alb-logging-tg
. Подробнее о целевых группах. -
Нажмите кнопку Создать.
Создание группы ВМ может занять несколько минут. После создания группа перейдет в статус RUNNING
, а все ВМ в ней — в статус RUNNING_ACTUAL
.
Создайте необходимые ресурсы в Yandex Application Load Balancer
Создайте группу бэкендов
Целевую группу, созданную вместе с группой ВМ, нужно привязать к группе бэкендов с настройками распределения трафика.
Для бэкендов в группе будет создана проверка состояния: балансировщик будет периодически отправлять проверочные запросы к ВМ и ожидать ответа в течение определенного периода.
Чтобы создать группу бэкендов:
- В консоли управления выберите сервис Application Load Balancer.
- Откройте вкладку Группы бэкендов. Нажмите кнопку Создать группу бэкендов.
- Укажите Имя группы бэкендов:
alb-logging-bg
. - В блоке Бэкенды нажмите кнопку Добавить.
- Укажите Имя бэкенда:
alb-logging-backend
. - В поле Целевая группа выберите группу
alb-logging-tg
. - Укажите Порт, на котором ВМ бэкенда будут принимать входящий трафик от балансировщика:
80
. - Нажмите кнопку Добавить проверку состояния.
- Укажите Порт, на котором ВМ бэкенда будут принимать проверочные соединения:
80
. - Укажите Путь, к которому будет обращаться балансировщик при проверке состояния:
/
. - Нажмите кнопку Создать.
Создайте и настройте HTTP-роутер
Группу бэкендов нужно привязать к HTTP-роутеру с правилами маршрутизации HTTP-запросов.
Чтобы создать HTTP-роутер:
- В консоли управления выберите сервис Application Load Balancer.
- Откройте вкладку HTTP-роутеры. Нажмите кнопку Создать HTTP-роутер.
- Укажите Имя HTTP-роутера:
alb-logging-router
. - Нажмите кнопку Добавить виртуальный хост.
- Укажите Имя виртуального хоста:
alb-logging-host
. - Нажмите кнопку Добавить маршрут.
- Укажите Имя маршрута:
alb-logging-route
. - В поле Группа бэкендов выберите группу
alb-logging-bg
. - Нажмите кнопку Создать.
Создайте L7-балансировщик
Чтобы создать балансировщик:
- В консоли управления выберите сервис Application Load Balancer.
- Нажмите кнопку Создать L7-балансировщик.
- Укажите Имя балансировщика:
alb-logging-balancer
. - В блоке Сетевые настройки выберите сеть
alb-logging-network
и группу безопасностиalb-logging-sg-balancer
, созданные ранее. - В блоке Обработчики нажмите кнопку Добавить обработчик.
- Укажите Имя обработчика:
alb-logging-listener
. - В поле Протокол выберите пункт HTTP.
- В поле HTTP-роутер выберите роутер
alb-logging-router
, созданный ранее. - Нажмите кнопку Создать.
Получите идентификатор лог-группы для балансировщика
Примечание
Этот шаг нельзя выполнить в консоли управления.
Вместе с балансировщиком создается лог-группа, в которую записываются логи. Идентификатор лог-группы нужно будет использовать при создании триггера в Cloud Functions.
Чтобы получить идентификатор лог-группы:
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
Выполните команду:
yc alb load-balancer get alb-logging-balancer | grep log_group_id
Используйте вызов gRPC API LoadBalancerService/Get или метод REST API get. Идентификатор лог-группы будет указан в поле log_group_id
.
Создайте необходимые ресурсы в Yandex Cloud Functions
Создайте функцию для обработки данных
Функция будет получать сообщения из лог-группы и записывать их в таблицу, созданную ранее.
Чтобы создать функцию:
-
В консоли управления выберите сервис Cloud Functions.
-
Нажмите кнопку Создать функцию.
-
Введите имя функции:
alb-logging-function
. -
Нажмите кнопку Создать. После создания функции вы автоматически будете перенаправлены на страницу Редактор.
-
Выберите среду выполнения Python и нажмите кнопку Продолжить.
-
Очистите область редактирования файла и вставьте в нее следующий код:
Код функцииimport os import logging import psycopg2 import json logger = logging.getLogger() logger.setLevel(logging.INFO) verboseLogging = eval(os.environ['VERBOSE_LOG']) if verboseLogging: logger.info('Loading handler function') def handler(event, context): statusCode = 500 if verboseLogging: logger.info(event) logger.info(context) connection_string = ( "host='{db_hostname}' port='{db_port}' dbname='{db_name}' " "user='{db_user}' password='{db_password}' sslmode='require'" ).format( db_hostname=os.environ['DB_HOSTNAME'], db_port=os.environ['DB_PORT'], db_name=os.environ['DB_NAME'], db_user=os.environ['DB_USER'], db_password=os.environ['DB_PASSWORD'] ) if verboseLogging: logger.info(f'Connecting: {connection_string}') conn = psycopg2.connect(connection_string) cursor = conn.cursor() messages = event['messages'][0]['details']['messages'] for message in messages: alb_message = json.loads(message['message']) alb_message['table_name'] = 'load_balancer_requests' insert_statement = ( 'INSERT INTO {table_name} ' '(type, "time", http_status, backend_ip, request_time) ' 'VALUES(\'{type}\', timestamptz \'{time}\', \'{http_status}\', ' '\'{backend_ip}\', {request_processing_times[request_time]});' ).format(**alb_message) if verboseLogging: logger.info(f'Exec: {insert_statement}') try: cursor.execute(insert_statement) statusCode = 200 except Exception as error: logger.error(error) conn.commit() cursor.close() conn.close() return { 'statusCode': statusCode, 'headers': { 'Content-Type': 'text/plain' } }
-
Задайте следующие параметры версии:
- Таймаут, с: 10.
- Память: 128 МБ.
-
Создайте сервисный аккаунт:
- Нажмите кнопку Создать аккаунт (или Создать новый). Откроется дополнительное окно.
- В поле Имя введите
alb-logging-function-service-account
. - Добавьте роли:
serverless.functions.invoker
иeditor
. - Нажмите кнопку Создать.
Созданный аккаунт автоматически добавится в поле Сервисный аккаунт. От имени этого аккаунта функция будет записывать данные в БД.
-
Добавьте переменные окружения:
VERBOSE_LOG
— параметр, отвечающий за вывод подробной информации о выполнении функции. Введите значениеTrue
.DB_HOSTNAME
— имя хоста БД PostgreSQL для подключения.DB_PORT
— порт для подключения.DB_NAME
— имя базы данных для подключения.DB_USER
— имя пользователя для подключения.DB_PASSWORD
— пароль, который был введен при создании кластера.
Чтобы определить значения параметров для подключения:
- В консоли управления выберите сервис Managed Service for PostgreSQL.
- Выберите кластер
alb-logging-cluster
. - Нажмите значок
- Выберите пункт Подключиться.
- На вкладке Shell найдите пример строки подключения.
- Перенесите значения переменных
host
,port
,dbname
иuser
в соответствующее поле Значение переменных окружения функции.
-
В правом верхнем углу нажмите кнопку Создать версию.
Создайте триггер
Триггер будет принимать копии сообщений от балансировщика и передавать их в функцию для обработки.
Примечание
Application Load Balancer использует лог-группу специального типа. Перед созданием триггера запросите в технической поддержке возможность создавать триггеры для таких лог-групп. Триггер можно создать только с помощью CLI или API.
Чтобы создать триггер:
Выполните команду:
yc serverless trigger create cloud-logs alb-logging-trigger \
--log-groups <идентификатор лог-группы> \
--invoke-function-name alb-logging-function \
--invoke-function-service-account-name alb-logging-function-service-account \
--batch-size 10 \
--batch-cutoff 15s
Где:
--log-groups
— идентификатор лог-группы для балансировщика, полученный ранее.--invoke-function-name
— имя функции, созданной ранее.--invoke-function-service-account-name
— имя сервисного аккаунта, созданного вместе с функцией.--batch-size
— максимальное количество сообщений, одновременно отправляемых в функцию.--batch-cutoff
— максимальное время между последовательными отправками сообщений в функцию.
Подробнее о команде см. в справочнике CLI.
Используйте вызов gRPC API TriggerService/Create или метод REST API create.
Проверьте работу балансировщика и запись логов
-
Получите публичный IP-адрес балансировщика:
Консоль управления- В консоли управления выберите сервис Application Load Balancer.
- Найдите в списке балансировщик
alb-logging-balancer
и скопируйте его IP-адрес.
-
Откройте в браузере сайт
http://<IP-адрес балансировщика>
. Перезагрузите страницу несколько раз. -
Проверьте, что в логах появилась информация о ваших запросах к балансировщику:
Консоль управления- В консоли управления выберите сервис Managed Service for PostgreSQL.
- Выберите кластер
alb-logging-cluster
. - Перейдите на вкладку SQL.
- Выберите пользователя, созданного вместе с кластером, и введите его пароль.
- Выберите базу данных, созданную вместе с кластером, и нажмите кнопку Подключиться.
- Нажмите на таблицу
load_balancer_requests
. Вы должны увидеть первые строки этой таблицы, соответствующие вашим запросам к балансировщику.
Как удалить созданные ресурсы
Чтобы остановить работу балансировщика и перестать платить за созданные ресурсы: