Запись логов балансировщика в PostgreSQL
- Подготовьте облако к работе
- Создайте облачную сеть
- Создайте сервисный аккаунт
- Создайте группы безопасности
- Подготовьте базу данных в Yandex Managed Service for PostgreSQL
- Создайте группу ВМ
- Создайте лог-группу Yandex Cloud Logging
- Создайте необходимые ресурсы в Yandex Application Load Balancer
- Создайте необходимые ресурсы в Yandex Cloud Functions
- Проверьте работу балансировщика и запись логов
- Как удалить созданные ресурсы
Важно
Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.
Вы можете записывать логи балансировщика — сообщения с информацией о каждом входящем запросе к балансировщику Yandex Application Load Balancer — в базу данных PostgreSQL.
Для логирования работы балансировщика будет создана лог-группа в Cloud Logging. Поставка логов из этой лог-группы в БД будет настроена с помощью ресурсов сервиса Yandex Cloud Functions — триггера и вызываемой им функции.
БД будет создана с помощью сервиса Yandex Managed Service for PostgreSQL.
Чтобы настроить запись логов:
- Подготовьте облако к работе.
- Создайте облачную сеть.
- Создайте сервисный аккаунт.
- Создайте группы безопасности.
- Подготовьте базу данных в Yandex Managed Service for PostgreSQL.
- Создайте группу ВМ.
- Создайте лог-группу Yandex Cloud Logging.
- Создайте необходимые ресурсы в Yandex Application Load Balancer.
- Создайте необходимые ресурсы в Yandex Cloud Functions.
- Проверьте запись логов.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки балансировщика с записью логов входят:
- плата за постоянно запущенные виртуальные машины (см. тарифы Yandex Compute Cloud);
- плата за вычислительные ресурсы, объем хранилища и резервных копий для кластера PostgreSQL (см. тарифы Yandex Managed Service for PostgreSQL);
- плата за вызовы функции для обработки логов и вычислительные ресурсы, выделенные на выполнение функции (см. тарифы Yandex Cloud Functions);
- плата за запись и хранение логов (см. тарифы Yandex Cloud Logging);
- плата за использование ресурсов Application Load Balancer (см. тарифы Yandex Application Load Balancer).
Создайте облачную сеть
Все созданные ресурсы будут относиться к одной облачной сети.
Чтобы создать сеть:
- В консоли управления
выберите сервис Virtual Private Cloud. - Нажмите кнопку Создать сеть.
- Укажите Имя сети:
alb-logging-network
. - В поле Дополнительно выберите опцию Создать подсети.
- Нажмите кнопку Создать сеть.
Создайте сервисный аккаунт
- В консоли управления
выберите нужный каталог. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- В поле Имя введите
alb-logging-service-account
. - Добавьте роли:
functions.functionInvoker
иeditor
. - Нажмите кнопку Создать.
Создайте группы безопасности
Группы безопасности содержат правила, которые:
- разрешают балансировщику получать входящий трафик и отправлять его на ВМ, а ВМ — получать этот трафик;
- разрешают балансировщику отправлять логи в лог-группу, а кластеру PostgreSQL — получать логи из нее.
Вы создадите три группы безопасности: для балансировщика, для всех ВМ и для кластера.
Чтобы создать группы безопасности:
-
В консоли управления
выберите сервис Virtual Private Cloud. -
Откройте вкладку Группы безопасности.
-
Создайте группу безопасности для балансировщика:
-
Нажмите кнопку Создать группу безопасности.
-
Укажите Имя группы:
alb-logging-sg-balancer
. -
Выберите Сеть
alb-logging-network
. -
В блоке Правила создайте следующие правила по инструкции под таблицей:
Направление
трафикаОписание Диапазон портов Протокол Источник /
назначениеCIDR блоки Исходящий
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
и следующими правилами:Направление
трафикаОписание Диапазон портов Протокол Источник /
назначениеCIDR блоки Входящий
balancer
80
TCP
Группа безопасности
alb-logging-sg-balancer
Входящий
ssh
22
TCP
CIDR
0.0.0.0/0
-
Аналогично создайте группу безопасности для кластера PostgreSQL с именем
alb-logging-sg-cluster
, той же сетьюalb-logging-network
и следующим правилом:Направление
трафикаОписание Диапазон портов Протокол Источник /
назначениеCIDR блоки Входящий
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.medium
.
Важно
Класс
b2.medium
был выбран только в рамках тестирования. В реальных проектах использовать хосты с гарантированной долей 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
. -
В поле Сервисный аккаунт выберите аккаунт, созданный ранее.
-
В блоке Распределение выберите несколько зон доступности, чтобы обеспечить отказоустойчивость хостинга.
-
В блоке Шаблон виртуальной машины нажмите кнопку Задать.
-
В блоке Образ загрузочного диска откройте вкладку Marketplace и нажмите кнопку Показать все продукты 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 Cloud Logging
- В консоли управления
перейдите в каталог, в котором хотите создать лог-группу. - Выберите сервис Cloud Logging.
- Нажмите кнопку Создать группу.
- Введите имя и описание лог-группы, например
alb-logging-group
. - Укажите срок хранения записей в лог-группе.
- Нажмите кнопку Создать группу.
Создайте необходимые ресурсы в 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-group
. - В блоке Обработчики нажмите кнопку Добавить обработчик.
- Укажите Имя обработчика:
alb-logging-listener
. - В поле Протокол выберите пункт
HTTPS
. - В поле HTTP-роутер выберите роутер
alb-logging-router
, созданный ранее. - Нажмите кнопку Создать.
Создайте необходимые ресурсы в Yandex Cloud Functions
Создайте функцию для обработки данных
Функция будет получать сообщения из лог-группы и записывать их в таблицу, созданную ранее.
Чтобы создать функцию:
-
В консоли управления
выберите сервис Cloud Functions. -
Нажмите кнопку Создать функцию.
-
Введите имя функции:
alb-logging-function
. -
Нажмите кнопку Создать. После создания функции вы автоматически будете перенаправлены на страницу Редактор.
-
Выберите среду выполнения Python версии 3.8 и нажмите кнопку Продолжить.
-
Очистите область редактирования файла и вставьте в нее следующий код:
Код функции
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 = message['json_payload'] 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' } }
-
Задайте следующие параметры версии:
- Таймаут, c —
10
. - Память —
128 МБ
.
- Таймаут, c —
-
Выберите созданный ранее сервисный аккаунт
alb-logging-service-account
. От имени этого аккаунта функция будет записывать данные в БД. -
Добавьте переменные окружения:
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
в соответствующее поле Значение переменных окружения функции.
-
Нажмите кнопку Сохранить изменения.
Создайте триггер
Триггер будет принимать копии сообщений от балансировщика и передавать их в функцию для обработки.
Чтобы создать триггер:
-
В консоли управления
перейдите в каталог, в котором хотите создать триггер. -
Выберите сервис Cloud Functions.
-
На панели слева выберите
Триггеры. -
Нажмите кнопку Создать триггер.
-
В блоке Базовые параметры:
- Введите имя триггера, например
alb-logging-trigger
. - В поле Тип выберите
Cloud Logging
. - В поле Запускаемый ресурс выберите
Функция
.
- Введите имя триггера, например
-
В блоке Настройки Cloud Logging:
- В поле Лог-группа выберите
alb-logging-group
. - В поле Типы ресурсов укажите
alb.loadBalancer
.
- В поле Лог-группа выберите
-
В блоке Настройки группирования сообщений:
- В поле Время ожидания, с укажите
15
. - В поле Размер группы укажите
10
.
- В поле Время ожидания, с укажите
-
В блоке Настройки функции выберите функцию, созданную ранее, и укажите:
- тег версии функции —
$latest
; - сервисный аккаунт, созданный ранее.
- тег версии функции —
-
Нажмите кнопку Создать триггер.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
Чтобы создать триггер, который вызывает функцию, выполните команду:
yc serverless trigger create logging alb-logging-trigger \
--log-group-name <имя_лог-группы> \
--resource-types alb.loadBalancer \
--batch-size 10 \
--batch-cutoff 15s \
--invoke-function-name alb-logging-function \
--invoke-function-service-account-name alb-logging-service-account \
Где:
--log-group-name
— имя лог-группы, созданной ранее.--resource-types
— типы ресурсов лог-группы.--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
. Вы должны увидеть первые строки этой таблицы, соответствующие вашим запросам к балансировщику.
- В консоли управления
Как удалить созданные ресурсы
Чтобы остановить работу балансировщика и перестать платить за созданные ресурсы:
- Удалите L7-балансировщик
alb-logging-balancer
. - Удалите HTTP-роутер
alb-logging-router
. - Удалите группу бэкендов
alb-logging-bg
. - Удалите группу виртуальных машин
alb-logging-ig
. - Удалите триггер
alb-logging-trigger
. - Удалите функцию
alb-logging-function
. - Удалите кластер
alb-logging-cluster
. - Удалите лог-группу
alb-logging-group
.