Отправка селфи без серверов: Как использовать Twilio MMS, Amazon Lambda и API Gateway от Amazon

Автор: | 02.08.2026

Мир был бы совсем другим, если бы настройка бэкенд-серверов была такой же простой, как сделать селфи. В таком мире вы бы смотрели на выступление любимой группы, а кто-то поднял бы свой компьютер в воздух, загородил бы музыкантов и настраивал бэкенд своего приложения. Конечно, это фантазия. Однако приложения для MMS без серверов стали реальностью благодаря работе Мэтта Ауэрбаха.

С недавно анонсированной Amazon Lambda вы можете запускать свой код без необходимости настройки серверов. Используя эту новую свободу, Мэтт создал приложение для Twilio MMS, которое записывает данные в корзину S3, а затем инициирует ответ от Twilio отправителю селфи.

Без лишних слов приступим к созданию. Оригинальный пост Мэтта можно посмотреть на GitHub здесь.

Вот как выглядит архитектура этого решения.

Этот пример использует Twilio для сохранения изображения с вашего мобильного телефона в облако AWS. Пользователь отправляет изображение через MMS на номер телефона Twilio, который отправляет запрос на конечную точку Amazon API Gateway, запускающую функцию Lambda. Приложение затем возвращает общедоступную ссылку на изображение в AWS S3. Это приложение использует AWS Lambda, API Gateway, DynamoDB и S3. Оно на 100% бессерверное!

Lambda — это вычислительный сервис, который выполняет ваш код в ответ на события. События инициируются ресурсами в вашей среде AWS или через API Gateway. В нашем случае функция Lambda запускается конечной точкой API Gateway, к которой обращается Twilio после получения MMS. Функция Lambda отвечает за запись информации о пользователе в DynamoDB, сохранение изображения в S3 с метаданными и возврат ответа Twilio.

API Gateway — это полностью управляемый API как сервис, где вы можете создавать, публиковать, поддерживать, мониторить и защищать API любого масштаба. В этом приложении мы используем API Gateway для создания конечной точки, на которую Twilio отправляет GET-запрос. API Gateway преобразует URL-кодированный запрос от Twilio в объект JSON, чтобы Lambda могла его обработать. Наконец, API Gateway принимает ответ от Lambda и формирует XML-объект для Twilio.

DynamoDB — это нереляционная база данных от Amazon. В этом приложении DynamoDB используется для хранения данных пользователей. S3 предоставляет разработчикам объектное хранилище с практически неограниченной масштабируемостью. Мы используем S3 для хранения изображений, полученных через MMS.

Ссылка на S3

Пошаговая инструкция по настройке, разработке и развертыванию этого приложения в AWS.

— Войдите в AWS или создайте учетную запись.

— Выберите регион в консоли и придерживайтесь его на протяжении всей работы с приложением. Используйте либо us-east-1, us-west-2, либо eu-west-1.

— Создайте таблицу в DynamoDB с одним хеш-ключом в качестве первичного ключа типа String. Дополнительные индексы не нужны, и вы можете оставить пропускную способность чтения/записи на уровне 1 для этого примера. Скриншот

— Создайте корзину S3 для приема изображений MMS. Например, mauerbac-ingest

— Создайте роль IAM с доступом к корзине S3 и таблице DynamoDB.

— Создайте или войдите в учетную запись Twilio и создайте номер телефона с возможностью MMS.

— Создайте новую функцию Lambda. Я предоставил функцию, так что можно пропустить шаблон.

— Дайте ей имя и описание. Используйте Python 2.7 в качестве среды выполнения.

— Используйте предоставленную функцию Lambda, lambda_function.py. Ознакомьтесь с модулем и задайте несколько переменных: учетные данные Twilio, имя таблицы DynamoDB и регион, а также корзину S3 для приема данных. Мы загрузим её в виде .zip-файла, так как нашей функции требуются несколько внешних библиотек, таких как Twilio Python SDK. Сожмите httplib2, pytz, twilio и lambda_function.py и загрузите как .zip-файл.

— Обработчик функции Lambda указывает Lambda, какой модуль .py использовать и соответствующий метод. Например, main_function.lambda_handler вызовет метод def lambda_handler() внутри main_function.py. Назовем его lambda_function.lambda_handler, чтобы он соответствовал lambda_function.py.

— Выберите роль, созданную ранее на подготовительных этапах.

— В дополнительных настройках рекомендую изменить время ожидания на 10 секунд (httplib2 требует немного больше времени). Максимальное время ожидания в настоящее время — 60 секунд.

— Просмотрите и создайте функцию.

— Создайте новый API. Дайте ему имя и описание. Это будет наша RESTful-конечная точка.

— Создайте ресурс. Путь должен быть, например, /addphoto.

— Нам нужно добавить метод к этому ресурсу. Создайте метод GET с интеграцией Lambda и выберите созданную ранее функцию. API Gateway не может обрабатывать POST-запросы, которые закодированы в URL, поэтому мы используем GET как обходное решение.

— Теперь настроим интеграционный запрос. GET-запрос от Twilio будет типа application-x-www-form-urlencoded. Этот шаг интеграции сопоставит этот тип с объектом JSON, который требуется Lambda. На странице интеграционных запросов создайте шаблон сопоставления. Тип содержимого — application/json, а шаблон:

Подробнее об интеграционных запросах.

$input.params() разбирает объект запроса на соответствующие переменные и позволяет шаблону сопоставления создать объект JSON. Скриншот

5. Убедимся, что ответ корректен. Twilio требует валидный XML. Измените модель ответа для кода 200 на тип содержимого: application/xml. Оставьте модели пустыми. Скриншот

6. Lambda не может возвращать правильный XML, поэтому API Gateway должен его сформировать. Это делается в интеграционном ответе с помощью другого шаблона сопоставления. На этот раз создайте тип содержимого: application/xml и шаблон:

Наша функция Lambda возвращает только строку тела SMS. Здесь мы формируем XML-объект и используем $inputRoot как строку. Вот как это выглядит.

7. Теперь развернем этот API, чтобы его протестировать! Нажмите кнопку Deploy API.

— Теперь у нас должна быть общедоступная конечная точка GET. Например: https://xxxx.execute-api.us-west-2.amazonaws.com/prod/addphoto

— Направьте ваш номер Twilio на эту конечную точку.

— Наше приложение теперь должно быть подключено. Подведем итог: Twilio отправляет GET-запрос с изображением MMS, номером отправителя и текстом на API Gateway. API Gateway преобразует GET-запрос в объект JSON, который передается функции Lambda. Lambda обрабатывает объект, записывает пользователя в DynamoDB и сохраняет изображение в S3. Lambda возвращает строку, которую API Gateway использует для создания XML-объекта для ответа Twilio пользователю.

— Сначала протестируем функцию Lambda. В выпадающем меню Actions выберите Configure sample event. Нам нужно сымитировать объект JSON, передаваемый API Gateway. Пример:

Нажмите Test. Внизу страницы вы увидите результат выполнения и журнал вывода в CloudWatch logs. Это очень полезно для отладки.

— Для тестирования API Gateway требуется клиент, который отправляет запросы на конечную точку. Мне лично нравится расширение Chrome Advanced Rest Client. Отправьте GET-запрос на конечную точку и посмотрите её ответ. Убедитесь, что ссылка на S3 работает. Также можно протестировать, отправив MMS на номер телефона и проверив журналы Twilio.

— Убедитесь, что ваша функция Lambda использует правильную роль IAM. Роль должна иметь возможность чтения/записи в DynamoDB и S3.

— Все взаимодействия с Lambda регистрируются в CloudWatch logs. Просматривайте журналы для отладки.

— Форумы Lambda/API Gateway