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

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

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

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, где вы сможете делать аналитические запросы к данным из ваших логов.