Перейти к основному содержимому

Репликация логов в Object Storage при помощи Yandex Data Streams

· 4 мин. чтения

Cloud Logging отличный сервис для просмотра логов. Но у него есть одно ограничение — время хранения. Сейчас, пока сервис в стадии превью это 3 дня, позже с выходом в General Availability это время вероятно увеличат, но все равно оно вряд ли будет бесконечным, и уж тем более это не будет бесплатно.

А теперь вопрос: что делать если вам хочется (ну чтобы через год сравнить) или необходимо (по каким-нибудь юридическим или регуляторным причинам) хранить логи достаточно продолжительное время, от года и более. А еще делать это максимально просто и дешево.

Решение есть! А самое прекрасное, что нам почти не понадобится нечего дополнительно настраивать, если вы уже настроили поставку логов через Fluentbit, как я рассказывал в двух предыдущих постах про поставку логов из контейнера.

Проще всего настроить долгосрочное хранение логов поставляя их через Yandex Data Streams при помощи протокола AWS Kinesis Data Streams, а затем складывая их в Yandex Object Storage при помощи Yandex Data Transfer.

Теперь давайте разберем этот способ подробнее по шагам.

Логи.

В этот раз я не буду подробно останавливаться на генерации логов. Тем кому необходим пример советую обратиться к одному из туториалов, что я упомянул выше.

Я буду считать, что необходимый Input для сбора логов у вас уже настроен.

Настройка секретов

В этот раз нам даже не понадобится никакой плагин. Для поставки воспользуемся одним из стандартных Output’ов Fluentbit — Amazon Kinesis Data Streams.

К сожалению, в отличие от плагина от Yandex мы не сможем воспользоваться авторизацией при помощи IAM-токена, который можно получить привязав сервисный аккаунт к ВМ. Нам придется каким-то образом доставить на ВМ статические ключи авторизации в формате AWS (access и secret key). Например, как я предлагал в туториале про доставку секретов зашифрованных KMS.

Важно: удостоверьтесь заранее, что сервисный аккаунт, от имени которого выписаны ключи, имеет необходимые права на запись в YDS — минимум yds.writer. YDS кэширует ACL, поэтому, если вы спохватившись назначите права после того как сделаете первую неудачную запись, применение новых ролей для этого сервиса может затянуться.

systemd

Если вы запустили Fluentbit как systemd unit, то вам нужно отредактировать файл с настройками unit’а (/lib/systemd/system/td-agent-bit.service), добавив в секцию Serviceследующие строки с переменными окружения:

[Service]
Environment=AWS_CONFIG_FILE=... Environment=AWS_SHARED_CREDENTIALS_FILE=...

Переменные AWS_CONFIG_FILE и AWS_SHARED_CREDENTIALS_FILE должны содержать пути до файлов .aws/config и .aws/credentials соответственно.

Пример содержимого этих фалов:

.aws/credentials
[default]
aws_access_key_id = 5Yd7F94k-BMWIPWIMpj4
aws_secret_access_key = eRSQ7f0o8Itn1vZXY-Xcu1Zt_UHLNv4vhI6fROPp
.aws/config
[default]
region = ru-central1

Контейнер

Вам нужно замаунтить файл с секретами внутрь контейнера, добавим маппинг путей в секцию volumes в docker-compose.yml и так же указать путь до него в переменной окружения, тоже в docker-compose.yml, но в секции environment.

Конфигурация Fluentbit и YDS

Для начала нам нужно создать стрим, в который мы будем поставлять наши логи. В туториале я создам минимально возможный стрим, в продакшене, вам стоит оценить поток ваших логов и конфигурировать стрим исходя из ваших параметров.

Если у вас еще нет базы YDB, то при создании потока вам нужно будет создать её. Если же у вас есть базы, вы можете выбрать одну из уже существующих.

Создаем новую базу YDB

Минимальный YDS бесплатен

Теперь нужно добавить в конфиги Fluentbit еще одну секцию [OUTPUT], в которой описать настройки Amazon Kinesis Data Streams плагина.

Значение stream нужно собрать из двух частей обозначенных на скриншоте выше.

[OUTPUT]
Name kinesis_streams
Match *
region ru-central-1
stream /ru-central1/b1glihojf6il6g7lvk98/etnbsg3d51gq7ooo2l6m/s3-logs
workers 1
endpoint https://yds.serverless.yandexcloud.net/

Data Transfer

Теперь можно перейти на вкладку Трансферы и приступить к созданию Data Transfer.

Для начала нам нужно создать два эндпоинта: источник и приемник.

Источник будет типа Yandex Data Stream и подключим мы в него только что созданный стрим.

Источник

Нажав на кнопку «Предварительный просмотр», если вы к тому моменту уже запустили поставку логов, вы сможете убедиться, что все настроено корректно. Откроется попап с примерами записей из источника. У меня это выглядело так.

Далее перейдем к созданию приемника. Выберем для него тип Object Storage. Нужно заполнить бакет куда будет идти поставка. Остальные поля можно оставить со значениями по умолчанию. Подробнее про эти настройки можно узнать в документации.

Теперь можно создать собственно трансфер, указав свежесозданные эндпоинты в соответствующих полях формы.

Остается лишь активировать наш трансфер, чтобы он начал перекладывать данные.

Готово. Можно убедиться, что в Object Storage появились логи в формате JSON.

Также можно настроить приемники других типов, например, ClickHouse, где вы сможете делать аналитические запросы к данным из ваших логов.