Самая нелюбимая часть работы - terraform hell dependency и AnyCloudProvider(в данном примере AWS) deprecated resources/versions.
Вишенка на торте - вкупе с публичными модулями.
То есть "что-то скоро перестанет работать - обнови версию".
Просто обнови и всё! 😀
Простой пример: прилетает письмо от AWS "скоро python9 станет депрекейтед в AWS"
Никаких возражений, я полностью согласен с такой позицией. 100% верно.
Пилим таску "обновить версию рантайма везде", иначе через 180 дней превратимся в тыкву.
Проверяем есть ли у нас лямбды 3.8/3.9.
aws lambda list-functions --region us-east-1 --output text --query "Functions[?Runtime=='python3.8'].FunctionArn"
aws lambda list-functions --region us-east-1 --output text --query "Functions[?Runtime=='python3.9'].FunctionArn"
Увы, есть. Находим один аж с 3.8. С него и начнём.
Казалось бы - в чём сложность? Версию апдейтни.
Попытка обновить версию самого модуля - получаю ошибку, что террраформ версии 1.5.3 не подходит, тут нужно минимум 1.5.7. Просто так указать ему версию рантайма не прокатывает - он не в курсе про такой параметр в этой старой версии.
Хорошо, везде обновляем терраформ на 1.5.7, но теперь ругается на провайдеры, terraform/aws. Их тоже надо обновить.
Обновляем и их повсеместно. Прогоняем план - последовательно находим 4 бага - в github issues, обновляем раз за разом разные версии, вроде прошли к какой-то, в котором багов нет. Появляются даже какие-то костыли с lifecycle.
В двадцатый раз уже terraform plan - появились обязательные поля у части ресурсов, а они не указаны.
И так по кругу. Хистори показало печаль 😭
history | tail -n 200 | grep plan | wc -l
59
И вот что тут делать?
- либо дальше повышать версию за версией, добавлять/убавлять параметры, чтобы стейт с кодом был идентичным, пока это говно не заработает
- сделать роллбек всех сделанных изменений кода с версиями, повесить техдолг
Потрачено уже немалое количество времени и принимаю решение - делаю роллбек.
Нужен рабочий и код и стейт. А роллбек ничего и не дал. 🚶♀
В лямбде версия рантайма уже 3.12 и откатить обратно к 3.8 не даёт - нет даже такого поля(а скоро и не станет 3.9).
Да что же такое. Значит ни первое и ни второе решение, предложенное выше.
В итоге просто иду на страницу модуля старой версии, копирую все ресурсы as is, пишу свой модуль и свои версии зависимостей. Убираю несколько лишних ресурсов и прав к ним.
Запускаю лямбду - ошибка питон кода, ведь он был написан для 3.8, а у меня 3.12.
Переписываю питон скрипт, проверка - всё работает.
Обновляю сразу все зависимости до последнего актуального, чтобы оно дольше проработало.
Выпиливаю публичный модуль, документирую свой модуль, план, фиксирую версии, терраформ апплай - всё работает.
Вот так, попытка "просто сделать апдейт версии питон рантайм лямбды" вышло в 5 часов абсолютно глупой работы. Итог плохой:
- мне он не нравится
- технический долг немного вырос
Из хорошего
- выпили ещё один сомнительный модуль, который своими зависимостями ломает вообще всё к херам.
- не поломали код и стейт
- обновили все лямбды до 3.12 (не только от старого паблик модуля, а везде)
Мне кажется, тут нет правых, виноватых. Хороших и плохих решений.
Эта ситуация возникала не раз, уж слишком у нас много зависимостей в нашем коде, инфраструктуре и работе. Особенно сторонних модулях.
Можно сколь угодно обвинять "а чо ты раньше не обновился?", "а чо ты на 1.5.3 сидишь как сыч?" и многое другое.
Не хватает ресурсов, чтобы всё держать в обновлённом состоянии. Увы.