PS. Это перевод моей статьи на английском. Давно я не писал на Хабре. Сразу прощу прощения, много на русском не пишу. Не скажу что у меня и английский шикарный. Но к сожалению проживание за рубежом ухудшает мой русский и медленно развивает английский.  Если вы пользуетесь AWS Athena для анализа логов, то часто хочется найти источник IP адресов. К сожалению AWS Athena не предоставляет этого из коробки. К счастью MaxMind предоставляет базы данных GeoIP таблиц, которые позволяют вычислить местоположение по IP адресам. Есть платная и бесплатная версия. В этой статье я покажу как создать AWS Lambda функцию, которая каждую неделю будет скачивать последнюю базу данных с MaxMind на S3. Эту базу данных можно использовать в AWS Athena для написания SQL запросов для анализа, например, веб логов. Для скачивания даже бесплатных баз данных GeoLite 2 с MaxMind вам нужно будет создать аккаунт. После создания аккаунта, в Services можно сгенерировать Service Key. Сохраните его. Мы будем использовать формат GeoLite2-City-CSV.  При помощи Service Key мы можем попробовать скачать базу данных при помощи curl Последние инструкции по скачиванию GeoIP баз данных можно найти тут. Для собственного проекта я создал S3 Bucket s3://app.loshadki.data, где я планирую разместить базу данных GeoIP. Размещать две таблицы я буду по путям s3://app.loshadki.datadata/geoip_blocks/data.csv.gz - база IP масок и их GEO положение s3://app.loshadki.datadata/geoip_locations/data.csv.gz - расшифровка GEO  в адреса (Страны, Города). Создайте новую Lambda функцию, я назвал свою GeoIP-Table-Update, и использую python:3.8. Я использую Environment Variables для некоторых настроек функции: MAXMIND_GEOIP_LICENSE - ваш Service Key от MaxMind. S3_BUCKET_NAME - S3 Bucket, куда собираетесь сохранять базу данных (я использую app.loshadki.data). S3_BUCKET_PREFIX - префикс для баз данных, я использую data Эта функцию может выполняться долгое время. Выставите Timeout в 5 минут. Я так же изменил Memory в 256MB, так как с большей памятью выделяется так же больше CPU, и я часто замечал что дешевле выполнять функции с более быстрым CPU, даже если не используется вся память. Мы будем запускать эту функцию раз в неделю, так что большой разницы не будет, сколько мы будем платить. Для автоматического выполнение этой функции раз в неделю создайте trigger. Выберете EventBridge (Cloud Watch Events), создайте новое правило upload-geoip-to-s3-weekly с правилом rate(7 days). Для того, чтобы AWS Lambda функция могла писать на S3, мы так же должны обновить разрешения, я обычно просто обновляю Role созданную автоматически. Добавьте разрешение Исходный код функции нижу. Вы можете просто скопировать и вставить его в редактор, сделать Deploy и запустить. Функцию будет работать несколько минут. По окончании, если все настройки верны, вы должны увидеть файлы на S3. Теперь мы можем создать таблицы в AWS Athena на базе CSV файлов, которые мы только что скопировали на S3. Первая таблица это IP адреса (не забудьте поменять расположение на S3, где вы храните CSV файлы) Вторая таблицы это расшифровка к странам и городам (опять не забудьте поменять S3 путь) Мы можем попробовать выполнить простой SQL запрос Таблица geoip_blocks определяет адреса блоками в CIDR кодировке, например 1.0.0.0/24, что определяет все адреса от 1.0.0.0 до 1.0.0.255. Текущая версия Presto поддерживает функции для проверки если IP адрес подходит для CIDR кодировки. Но к сожалению AWS Athena (даже версия 2) до сих пор не поддерживает эти функции, так как использует Presto 0.217. Но мы можем найти другой способ проверки. Один из способов это преобразование IP адресов в Integer, чтобы была возможность выполнять запросы вроде ip_start <= ip_address <= ip_end. Преобразовать IP адрес в Integer очень легко, формула простая ipv4[1]*256*256*256 + ipv4[2]*256*256 + ipv4[3]*256 + ipv4[4]. Ну и маску /24 просто нужно преобразовать в последний IP адрес диапазона. Самый простой вариант это просто создать View на базе таблицы geoip_blocks Например мы можем попробовать найти местоположение IP адреса 1.1.1.1. Нам нужно только преобразовать его в Integer опять. Ну и немного более сложный SQL запрос, если у вас хранятся логи от CloudFront, чтобы показать самые популярные страницы с группировкой по странам и городам. Вы можете использовать колонки postal_code или city_name вместе с country_name вместе с AWS QuickSight для создания отчетов. Я так же создал для себя CloudWatch Alert, если функция упадет больше 2х раз, чтобы знать если что-то сломалось.