MiddleData Analyst > SQL и данные > Качество данных
Короткий ответ Минимум два типа проверок — свежесть (данные за вчерашний день реально загружены к ожидаемому времени) и полнота (объём загруженных строк не аномально отличается от обычного объёма за день), с алертом в Slack/почту при нарушении порога. Как это работает подробнее Проверка свежести сравнивает MAX(loaded_at) или наличие строк с вчерашней датой с текущим временем и ожидаемым SLA пайплайна (например, «данные за вчера должны быть к 8:00»); проверка полноты сравнивает COUNT(*) за последний день с историческим средним/медианой за последние N дней с допустимым отклонением (например, ±30%). Пример кода Что использовать на практике На практике. Пороги отклонения лучше не брать «с потолка», а откалибровать по историческому разбросу объёма данных (учитывая день недели — выходные обычно отличаются от будней), и разделять алерты на «warning» (небольшое отклонение, можно разобраться в рабочее время) и «critical» (данных нет вообще, нужно реагировать немедленно). Проверка. запрос, возвращающий строки, сигнализ
alertingcompleteness
MiddleDevOps Engineer > Контейнеры и доставка > CI/CD и управление релизами
Короткий ответ Сразу после rollout нужно выполнить короткий набор критичных по бизнес-смыслу проверок (логин, создание заказа, ключевой health-эндпоинт, зависимость от БД) против только что задеплоенной версии, и если хотя бы одна критичная проверка не проходит в течение заданного времени — пайплайн автоматически выполняет откат (`kubectl rollout undo` или возврат трафика на стабильную версию), не дожидаясь, пока проблему заметят пользователи или дежурный инженер. Как это работает подробнее смоук-тесты — это маленький, быстрый (обычно до нескольких минут) набор end-to-end проверок, запускаемый как отдельная стадия пайплайна сразу после деплоя, перед тем как считать релиз завершённым. В отличие от readinessProbe (который проверяет готовность одного пода), smoke-тесты проверяют сквозной бизнес-сценарий через реальные API-вызовы. Пример кода Что использовать на практике На практике. важно держать набор именно маленьким и быстрым, покрывающим критичные пути (checkout, авторизация, основной API), а не дублировать
cicd-and-release-managementdevops
SeniorDevOps Engineer > Контейнеры и доставка > Безопасность и DevSecOps
Короткий ответ Единственного правильного решения здесь нет: разумная архитектура обычно строится вокруг одного или нескольких центральных secret-хранилищ (например, HashiCorp Vault как кросс-облачный уровень абстракции или нативные сервисы каждого облака с федерацией идентичности через OIDC), с динамической выдачей короткоживущих credentials там, где это возможно, и чёткой изоляцией по окружениям на уровне пространства имён/бэкенда, а не просто через naming convention. Как это работает подробнее в мультиоблачной среде можно либо завести единый центральный Vault-кластер, к которому все окружения обращаются через аутентификацию (Kubernetes auth method, AWS IAM auth), либо использовать нативные сервисы каждого провайдера (AWS Secrets Manager, Kubernetes Secrets + sealed-secrets) и синхронизировать между ними при необходимости. Независимо от выбора, динамические секреты (Vault database secrets engine, AWS STS) предпочтительнее статических, так как ограничивают время жизни credential и автоматизируют ротацию без в
awscredential-rotation
SeniorDevOps Engineer > Контейнеры и доставка > CI/CD и управление релизами
Короткий ответ Единого архитектурного решения нет — на масштабе важно спроектировать низколатентную оценку флагов без похода в сеть на каждый запрос (локальный кэш конфигурации флагов с периодическим обновлением или push-обновлениями), чёткое разделение типов флагов (kill switch, release, experiment, permission) с разным жизненным циклом и владением, встроенный аудит изменений флагов, и явную политику остановки — технический kill switch, который должен работать даже при недоступности самой flag-платформы (fail open/fail closed в зависимости от флага). Как это работает подробнее при высокой нагрузке поход в внешний сервис флагов на каждый запрос создаёт неприемлемую задержку и единую точку отказа; поэтому зрелые flag-платформы (LaunchDarkly, собственные решения) используют SDK с локальным in-memory кэшем конфигурации, который периодически обновляется или получает push-обновления через streaming-соединение, и могут продолжать работать по последней известной конфигурации при временной недоступности центрального
artifactscicd-and-release-management
MiddleDevOps Engineer > Контейнеры и доставка > Облачные платформы
Короткий ответ Типовая схема — по одной публичной и как минимум по две приватные подсети (для слоя приложения и слоя БД) в каждой из минимум двух AZ, с балансировщиком в публичных подсетях, инстансами приложения в приватных подсетях с выходом через NAT и базой данных в ещё более изолированных приватных подсетях без исходящего доступа в интернет вообще. Как это работает подробнее трафик снаружи попадает на балансировщик в публичной подсети, тот направляет его на инстансы приложения в приватных подсетях; инстансы приложения обращаются к базе данных в отдельных приватных подсетях, доступных только из подсети приложения через security group; каждый слой дублируется минимум в двух AZ. Пример кода Что использовать на практике Рекомендация. для каждого слоя создают отдельную security group с точечными правилами (например, DB security group разрешает вход только с App security group на порту БД); NAT gateway размещают в каждой используемой AZ, чтобы избежать единой точки отказа. Проверка. при тестировании подключение
cloud-networkinghigh-availability
MiddleDevOps Engineer > Контейнеры и доставка > Облачные платформы
Короткий ответ Для данных at rest включают шифрование дисков, объектного хранилища и базы данных средствами провайдера (с ключами провайдера или собственными ключами через KMS), а для in transit принудительно используют TLS для всех соединений между компонентами, не полагаясь на «доверенную» внутреннюю сеть как достаточную защиту. Как это работает подробнее шифрование at rest защищает данные на физическом носителе провайдера и обычно прозрачно для приложения; шифрование in transit защищает данные от перехвата при передаче по сети, в том числе внутри облака, где трафик может проходить через общую инфраструктуру. Пример кода Что использовать на практике Рекомендация. включают шифрование at rest при создании ресурса по умолчанию, используют собственные ключи шифрования там, где нужен контроль над ротацией и отзывом; для in transit терминируют TLS на балансировщике и дополнительно требуют TLS для соединения приложение-БД и HTTPS-эндпоинты объектного хранилища. Проверка. попытка подключиться к базе данных без TLS
cloud-securityencryption-at-rest
MiddleDevOps Engineer > Контейнеры и доставка > CI/CD и управление релизами
Короткий ответ Нужно настроить protected environment с обязательными reviewers (например, GitHub Environments с required reviewers или GitLab protected environment с deployment approval rules), запретив автору merge request подтверждать собственный деплой, и логировать, кто и когда дал подтверждение, для последующего аудита. Как это работает подробнее современные CI-системы поддерживают привязку окружения (environment) к списку пользователей или групп, чьё подтверждение требуется перед тем, как джоба деплоя в это окружение начнёт выполняться; автор PR по умолчанию может быть исключён из списка валидных approver'ов для собственного изменения, обеспечивая разделение обязанностей (segregation of duties). Пример кода Что использовать на практике На практике. это особенно важно в регулируемых средах, где требуется, чтобы деплой в прод подтверждал кто-то, кроме автора кода — снижает риск как случайных, так и намеренных злоупотреблений. Такие approval'ы стоит сопровождать краткой информацией о том, что именно будет
approval-gatescicd-and-release-management
SeniorDevOps Engineer > Контейнеры и доставка > CI/CD и управление релизами
Короткий ответ Единого правильного ответа нет — организация должна заранее определить допустимый уровень риска и иметь задокументированный (пусть и редко используемый) запасной путь ручного/локального релиза, доступ к копии критичных секретов для деплоя и альтернативный способ сборки и публикации артефакта в обход недоступного SaaS CI, явно принимая компромисс между стоимостью поддержки резервного пути и вероятностью такого отказа. Как это работает подробнее зависимость от одного внешнего CI-провайдера — single point of failure для всего релизного процесса; план восстановления обычно включает документированную процедуру ручной сборки и деплоя с локальной машины доверенного инженера (с теми же проверками безопасности, что и обычный пайплайн, насколько это возможно), резервную копию необходимых секретов в отдельном защищённом хранилище, независимом от CI-платформы, и заранее протестированный (хотя бы раз в квартал/полгода) runbook для такого сценария. Пример кода Сравнение Компромисс. инвестиции в полное резерв
artifactscicd-and-release-management
SeniorDevOps Engineer > Контейнеры и доставка > Облачные платформы
Короткий ответ Типичный подход — разделение ресурсов по отдельным аккаунтам/проектам на команду или окружение, централизованное управление identity через SSO/федерацию, использование организационных политик (SCP/organization policies) для общих ограничений и делегирование IAM внутри каждого аккаунта владеющей им команде; конкретная степень централизации против автономии команд — предмет компромисса, а не готовый рецепт. Как это работает подробнее landing zone задаёт baseline — обязательные guardrails на уровне организации (запрет отключения логирования, запрет публичных bucket, обязательное шифрование), которые применяются ко всем аккаунтам независимо от локальных IAM-настроек; внутри каждого аккаунта команда получает достаточную автономию для управления своими ролями в рамках этих guardrails. Пример кода Что использовать на практике Рекомендация. решение о степени изоляции зависит от размера организации, требований комплаенса и зрелости команд в самостоятельном управлении доступом; централизованный логин и е
auditcloud-governance
SeniorDevOps Engineer > Контейнеры и доставка > Облачные платформы
Короткий ответ Работающий процесс обычно сочетает техническую основу (обязательное тегирование, бюджеты и алерты на уровне команды, регулярные автоматические отчёты) с организационной моделью распределения ответственности (showback — просто показывать командам их расходы, или chargeback — реально выставлять им счёт внутри организации); выбор между ними зависит от зрелости организации и готовности к административным издержкам полноценного chargeback. Как это работает подробнее showback делает расходы каждой команды видимыми без прямых финансовых последствий, что уже часто снижает расточительность за счёт самого факта видимости; chargeback реально относит затраты на бюджет команды, создавая прямой финансовый стимул оптимизировать, но требует точного и согласованного механизма распределения общих/shared затрат, иначе споры о «справедливости» подрывают доверие к системе. Пример кода Что использовать на практике Рекомендация. начинают с обязательного тегирования и базовых бюджетных алертов как минимально необходим
budgetschargeback