Пам‘ятаєте попередній пост про те що треба трохи даних обробити та зробити дешборд? Ну авжеж, це ж тільки два тижні тому було. А знаєте, чим я займався ці два тижні?.. Не тільки цим, але я просто в ужасі. Не читайте далі, якщо технічні подробиці вас лякають.
Зробити скрипт, який закидує дані з цсв у постгрес у мене вийшло за день з невеличким. А ось потім щось пішло не так... Чомусь я вирішив замість простої схеми «осьо віртуальний сервер, там все запустили й поїхали», що треба якомога більше managed все мати, щоб потім це не підтримувати. Амазон же ж багато всього пропонує!
Значить вимальовується така схема: завантажуємо файли в S3, це триггерить Lambda, яка файл обробляє і складає в інший бакет, звідки його читає Athena через Glue, а показує дані QuickSight. Я зазвичай дотримуюсь правила «не більше однієї незнайомої технології на проєкт», але цей казався маленьким і гідним того, щоб зробити один раз надійно.
1️⃣ Lambda
Я тут задовбався, але може окремо напишу — в мене вийшло 5 абзаців, а в телеграмі є обмеження на довжину повідомлення. :( З цікавого в результаті: парсинг пайтоном ікселю на 7 мб на ноуті займає 7 секунд, на хецнері за 5 євро - 14, на лямбді - 40-50.
2️⃣ QuickSight
Зібрали дешборд на квіксайті, і виявилося що оновлення буде не дуже в реалтаймі. Ну типу можемо кілька разів на день оновлювати, але часто (або по триггеру з лямбди, що теж потенційно часто) - буде дорого. Ооок, але наче працює, давайте покажемо світу? Хрін там! Публічним квіксайт зробити неможливо!
3️⃣ Athena
У цей момент я психанув, зарентив ec2 і запхав туди метабейз. Для метабейзу є сторонній коннектор для Афіни, тож, думаю, зара буде все супер. Метабейз поїхав, побачив дані, їх схему, єєє, перемога. Зараз все буде.
Тільки дата, за якою я хочу мати фільтр, це строка, а не date чи timestamp. Тому Афіна каже "вибачте, для цього оператор >=" застосовувати неможливо. Окей, знайшов, що схема даних визначається у Glue, змінив на timestamp зі string, як справи? Помилка, каже, Hive таку дату розпарсити не може.
Тож зробив я додаткову колонку, date.timestamp() * 1000
— ну там же ж Хайв, він точно захоче міллісекунди (я такий здогадливий, це жах). Фух, запрацювало!
Повільно тільки... Ну ладно, Metabase вміє кешувати результати, тож у середньому може буде не сильно боляче. Ну і ще фільтрація чутлива до регістру, наче баг в метабейзі — але це можна обійти, переробив запроси на SQL замість конструювання в інтерфейсі.
4️⃣ S3
Ну все, залишилося тільки навчити замовника завантажувати файли в S3. А там теж інтерфейс мрії, купа кнопок, а ще неможливо зробити так, щоб користувач тільки 1 бакет бачив... Написав інструкцію, записав Loom з демкою, і в кінці навіть зідвонилися телефоном — і в неї білий екран замість прогрес-бару аплоаду. Я без дупля, що там за проблема, домовилися на наступний день у зумі подивитися.
Прокинувся зранку і закинув файл: наче все нормально, але трошки форматування цифр у коментарі не подобається. Ок, поправив скрипт, задеплоїв лямбду, закинув файл заново — і помітив, що в метабейзі дублюються дані.
А логіка в мене така: з клієнт-банку будуть окремі файли, і за один період у файла буде завжди одна й та сама назва. Тож я просто заміняю файл з такою ж назвою і тоді дублювання даних немає. От тільки я бачу дивне — у бакеті з результатом два файли з однаковим іменем. По всім докам і обговоренням в інтернеті такого бути не може, але я бачу. Ну жесть.
5️⃣ Інтерфейси
Хочу звернути особливу увагу, що це ж все low-code, тобто гемор. Всі налаштування відбуваються у купі форм на купі сторінок, кожна з яких завантажується мінімум кілька секунд, щось змінити — все ж unbundled — це піти потикатися у три-чотири різних сервіси, а потім у термінал подивитися логи лямбди. Цикл фідбека довжиною у хвилини, просто нереально повільно рухаєшся.
6️⃣ Ми тут
Схоже шо перероблю на шось простіше з постгресом. Бо я хз, хто цим може нормально користуватися. Здається, що AWS тримає людей у заручниках і викликає стокгольмский синдром.