Сделайте ваше приложение безопаснее за 15 минут или меньше

Очень важно проверить, какой контент загружают наши пользователи. Мы не хотим, чтобы на нашем веб-сайте в первую очередь было хардкорное порно или насилие. К счастью, если мы создаем наше приложение с помощью AWS, мы можем использовать целый набор сервисов искусственного интеллекта, которые маркируют и проверяют все виды контента. Давайте посмотрим, как мы можем использовать стандартные блоки AWS для автоматической проверки изображений и видео наших пользователей, выполнив несколько простых шагов.

Мы будем пользоваться следующими услугами:

Самая крутая особенность бессерверного подхода заключается в том, что для одного запроса и одного миллиона запросов потребуется примерно одинаковое время. Наше приложение будет масштабироваться автоматически, и мы будем платить только за использованные ресурсы. Мы будем готовы к огромному количеству пользователей и сможем предоставить им такую ​​же скорость и качество.

Наши пользователи могут загружать изображения и видео в наше приложение, которые хранятся в корзине S3. Мы хотим, чтобы они были обработаны как можно быстрее. Загрузка нового файла в корзину создает новое событие, на которое мы можем подписаться. Мы можем запустить нашу лямбда-функцию сразу после завершения загрузки.

В реальном приложении также будет некоторая система, которая проверяет, что загружено в корзину. Нам определенно нужно проверить такие параметры, как размер и тип содержимого. Сейчас, для простоты, мы сосредоточимся только на части модерации контента.

Лямбда - это небольшая вычислительная единица, которая вызывается только при необходимости. Он может быть вызван из API или инициирован событиями из других сервисов. Мы запустили нашу первую лямбда-функцию всякий раз, когда появляется новый файл или обновляется в каталоге содержимого. Здесь хранятся изображения и видео. Работа первой Lamdba будет очень простой - она ​​запустит только пошаговую функцию, которая позаботится о процессе модерации за несколько шагов. AWS Step Function - это конечный автомат, который в зависимости от результата каждого шага может активировать правильное поведение.

Мы используем переменные среды для передачи ARN используемых ресурсов. Переменные среды могут быть определены непосредственно в шаблоне SAM, что сделает наше приложение более гибким. Такие параметры, как ARN ресурса или имя сегмента и базы данных, могут изменяться, и было бы очень сложно их отслеживать, если бы они были жестко запрограммированы в приложении.

Мы извлекли информацию, которая будет использоваться (имя корзины и файл, который был загружен), и передали ее в пошаговую функцию. Мы хотим иметь возможность модерировать изображения и видео. Об этих двоих нужно позаботиться немного по-разному. Модерация видео требует больше времени и другого подхода.

Первое, что нам нужно сделать, это определить тип файла. В этом случае изображения, которые мы хотим поддерживать, - это .png, .jpg и .mp4 для видео. Изображения будут переданы в настраиваемую функцию Lambda, которая получит метки модерации из Amazon Rekognition с помощью одного вызова API. Анализ видео занимает гораздо больше времени и запускает модерацию контента и ожидает результатов в очереди SQS. После этого мы сохраним метки файлов в базе данных. Посмотрим, как быстро мы сможем это сделать.

Мы начнем с определения нашей последовательности шагов пошаговой функции. Это можно сделать с помощью одного файла JSON.

Обнаружение MIME-типа - очень простая задача. Все, что нам нужно сделать, это использовать имя загруженного файла и mimetypes библиотеки.

В зависимости от обнаруженного MIME у нас есть три возможных пути: изображение, видео или другой. Если файл не является ни изображением, ни видео, мы закончим работу нашего конечного автомата как неудачную.

Мы будем получать доступ к сервисам AWS с помощью Boto3. Это python SDK, поддерживаемый AWS и предоставляющий очень простой API с отличной документацией. Мы хотим использовать только звуковые метки с порогом достоверности более 75%. Мы не хотим, чтобы в нашем приложении содержались сцены насилия и сексуального характера, поэтому мы будем отмечать их как небезопасные. Полный список доступных ярлыков можно найти здесь.

При использовании внешних сервисов AWS в наших Lambdas мы должны помнить о настройке надлежащих разрешений. Все можно определить прямо в шаблоне SAM .yaml. Весь исходный код можно найти в следующем репозитории.

С помощью одного вызова API мы модерировали наше изображение и можем передавать результаты дальше. Анализировать видео сложнее. Мы начнем с инициализации задания и предоставим тему в соцсети, которая получит сообщение. Очередь SQS подписана на эту тему, поэтому мы можем прослушивать входящие сообщения с заданным jobId. Модерация видео может занять некоторое время в зависимости от его размера и продолжительности. Он также может иметь гораздо больше меток, чем изображение, поэтому данные потенциально могут быть разбиты на страницы. Мы должны помнить об этом при сборе результатов.

У нас есть данные о загруженном контенте, поэтому пора сохранить их в постоянном хранилище. DynamoDB выглядит подходящим для этой работы.

Наш веб-сайт теперь защищен от оскорбительного контента, поэтому наши пользователи и их дети могут просматривать его без проблем. Каждый сервис, который использовался в этом примере, имеет право на уровень бесплатного пользования AWS, поэтому, если у вас нет нескольких активных пользователей, все будет бесплатно.

В реальном приложении мы также сохраняем информацию об ошибках во время процесса модерации, но это лишь краткая демонстрация.

Проблемы и устранение неисправностей

После завершения кажется, что все работает нормально, но во время разработки может возникнуть множество проблем. Мы попадаем в бесконечный цикл вызовов Lambda и получаем несколько десятков тысяч ненужных вызовов. Причина заключалась в ошибке в Lambda, которая была вызвана непосредственно событием S3. Мы запустили Step Function и хотели вернуть ответ в формате JSON. Ответ был неправильно отформатирован и вызвал ошибку. AWS посчитала, что Lambda не работает, и применила политику автоматического повторного ввода.

Всегда стоит потратить время на то, чтобы взглянуть на журналы CloudWatch и посмотреть, как работают ваши Lambdas.

Исходный код

Полный исходный код доступен в следующем репозитории: