Чуть не попали на 7 тысяч долларов на Vercel и Next.js по недосмотру
Вчера мы обнаружили, что пробили лимит по тратам на хостинге Vercel. Если бы не заметили это вовремя, получив емейл о превышении лимита, счет мог бы вырасти до $7 000.
Начну сразу с уроков для продактов, основателей и инженеров:
-
Если вы хотите, чтобы было быстро для пользователей, это может быть не просто не бесплатно, а мега-дорого. Нужно понимать косты эксплуатации.
-
Если у вас не установлены лимиты на расходы на инфраструктуру, вы можете обанкротиться, даже если у вас маленький масштаб.
Итак... Что произошло?
Мы добавили каталог подкастов на сайт. Сейчас в нём ~7K подкастов и 1,4M выпусков. На каждой странице есть изображение, которое подтягивается со сторонних хостов.
В самом начале разработки, более года назад, без полного понимания масштабов мы включили оптимизацию изображений в Next.js. Таким образом, на сайте картинки грузились не напрямую с источника, а сначала скачивались на Vercel, сжимались и только потом показывались пользователю.
Для юзеров это круто — страницы грузятся очень быстро!
Но Vercel берет $5 за каждую тысячу оптимизированных изображений. Оптимизация 1,4M картинок обошлась бы нам в $7K. А по мере роста каталога сумма могла вырасти до полумиллиона! На полном масштабе (~100M выпусков) счет за одну только оптимизацию картинок мог бы составить $500K.
При этом проблема не в пользователях. У нас нет многомиллионного пользовательского трафика. Эти затраты вызваны спайдерами (crawlers), которые углубляются в сайт и сканируют все страницы для индексации на поисковых системах и чтобы п.здить данные.
Теперь представьте худший сценарий: какой-то спайдер за несколько дней обходит весь сайт. В конце месяца приходит письмо: транзакция на несколько тысяч долларов отклонена, потому что у нас нет на счёте столько денег.
Что дальше? Либо платить, либо уговаривать Vercel списать долг. Оба варианта — такое себе.
Пока что мы отключили оптимизацию изображений и картинки грузятся напрямую с хостов, куда их положили подкастеры. Загрузка стала в разы медленнее. Обложки подкастов размером 3000х3000 пикселей, они могут быть по мегабайту и то и больше. На нашем сайте обложки в 10 раз меньше. С оптимизацией изображений загрузка была почти мгновенной (помимо сжатия, Vercel еще и раскидывал изображения по узлам CDN по всему миру).
Теперь у нас диллема — оставить как есть или запилить собственный механизм ужатия изображений и выкладывания их на CloudFlare. Наши приоритеты сейчас в другом месте, поэтому пока мы просто оставляем картинки без оптимизации и смиряемся с тем, что на медленных соединениях картинки могут грузиться долго.
Мы сильно напугались. Когда увидели емейл, мы сначала расслабились — думали, что если бюджет сработал, то и траты остановятся, но у Vercel нет такой функции. Они отправили нам емейл, а затраты продолжали расти по часам.
Так как боты поисковиков непредсказуемы, мы не были застрахованы от разовой индексации десятков тысяч страниц. Поэтому мы отнеслись к этой ситуации как к пожарной тревоге и пофиксили всё ночью.
На следующий день провел в режиме антикризисного пожарного. У нас опять подлетели косты на Vercel, когда боты Amazon и Claude заспамили нас 60-ю тысячами запросов за день.
Выяснилось, что мы по незнанию (ну и недосмотру, конечно же) сконфигурили Next.js оптимизировать все изображения, в том числе те, которые не хостятся на нашем сайте. И залетели на этом + создали дыру в безопасности на сайте. В теории наш сайт можно было использовать как API для сжатия изображений...
Краткий пост на английском тут. Он завирусился, наступил на больную мозоль... Мне уже написал продакт менеджер из Anthropic, а я в ответ полтора часа писал ему емейл про их ответственность перед владельцами сайтов. Посмотрим что из этого выйдет.
На следующей неделе напишу post-mortem, сделаем из этого всего PR moment. Пытаюсь договориться с Vercel о коллабе над блогом.
Весёлый выдался денёк.