Потратил два часа делая всё правильно.
Terraform. CodeBuild. IAM роли. VPC endpoints.
Я ошибался.
У нас есть AWS China аккаунт. Приложение для китайских пользователей.
Два ECS сервиса. 0.25 CPU. Минимум памяти. Приложение + MongoDB.
Вокруг: ALB, Service Discovery, ECR, VPC, EFS, пара VPC endpoints.
Итого ~1800 юаней в месяц. Всё работает.
Образ собирается на CircleCI, пушится в AWS CN ECR.
Потом пуш стал падать по таймауту - 10 минут.
Образ - всего 120 МБ. Проблема не в размере.
Проблема в том, что AWS China за Великим китайским файрволом.
Скорость внешнего канала непредсказуема. CircleCI в США толкает образ в cn-northwest-1 - лотерея по времени.
Думаю: переехать на CodeBuild. Логика железная.
CircleCI заливает только исходники - 5 МБ. Триггерит CodeBuild внутри CN.
CodeBuild сам собирает образ и пушит в ECR. Внешний канал - только для кода, не для 120 МБ образа.
Понедельник, 16:00. Два часа до конца рабочего дня.
Начал делать. Увлёкся.
Дополнительный модуль Terraform. Параметры в Terragrunt. IAM роли - там всегда отдельная история: разделение прав в AWS замороченное, не зря его везде упоминают отдельно.
Когда закончил и открыл схему - было приятно смотреть. Чисто. Логично. Внешний канал только для исходников. Образ никогда не пересекает файрвол.
Пришло время деплоить. Я всегда в этот момент делаю паузу - отвлечься, ещё раз просмотреть, иногда проговорить вслух. Помогает поймать то, что не замечаешь в процессе.
Поймал.
ECR VPC endpoints. Их два.
Я уже думал об этом когда впервые запускал ECS. Казалось странным: ECS без ECR не работает - почему я должен платить за два дополнительных эндпойнта? Ладно, тогда принял как данность.
Но сейчас я их добавил зачем?
Потом посчитал.
Каждый VPC endpoint - $0.01 в час за зону. Две зоны - $14 в месяц с эндпойнта. Два эндпойнта - $29 в месяц суммарно.
Образ собирается раз в полгода.
$348 в год. За два билда.
Убрал оба - работает и без них.
Ладно. Но потом думаю дальше.
Я потратил 2 инженерных часа. Это не бесплатно.
CircleCI раннер с увеличенным таймаутом - сколько он стоит за запуск раз в полгода?
Посчитал: копейки.
Итог: просто увеличил таймаут до 20 минут. Закрыл тикет.
Это не история про лень.
Это история про то, как легко начать делать правильно - и не заметить, что правильное решение стоит дороже проблемы.
Новый сервис. Новые права. Новые endpoints. Новые деньги. Каждый шаг логичен. Сумма - нет.
Инфраструктура обрастает сложностью не потому что кто-то хочет зла.
А потому что каждое отдельное решение выглядит разумно.
Именно это я проверяю на аудитах - не отдельные сервисы, а сумму решений.
→ itaudit.yushkov.org