Сервис-ориентированная архитектура с AWS Lambda: пошаговое руководство
Опубликовано: 2022-03-11При создании веб-приложений необходимо сделать множество вариантов, которые могут либо помочь, либо помешать вашему приложению в будущем, как только вы их зафиксируете. Такие варианты, как язык, инфраструктура, хостинг и база данных, имеют решающее значение.
Одним из таких вариантов является создание сервисного приложения с использованием сервисно-ориентированной архитектуры (SOA) или традиционного монолитного приложения. Это распространенное архитектурное решение, затрагивающее как стартапы, так и крупные компании.
Сервис-ориентированная архитектура используется большим количеством известных единорогов и ведущих технологических компаний, таких как Google, Facebook, Twitter, Instagram и Uber. Казалось бы, этот архитектурный паттерн работает для крупных компаний, но подойдет ли он вам?
В этой статье мы расскажем о сервис-ориентированной архитектуре и о том, как можно использовать AWS Lambda в сочетании с Python для простого создания масштабируемых и экономичных сервисов. Чтобы продемонстрировать эти идеи, мы создадим простой сервис загрузки изображений и изменения их размера, используя Python, AWS Lambda, Amazon S3 и несколько других соответствующих инструментов и сервисов.
Что такое сервис-ориентированная архитектура?
Сервис-ориентированная архитектура (SOA) не нова, она уходит корнями в прошлое несколько десятилетий. В последние годы его популярность как шаблона росла из-за того, что он предлагает множество преимуществ для веб-приложений.
SOA — это, по сути, абстракция одного большого приложения на множество взаимодействующих между собой небольших приложений. Это соответствует нескольким передовым методам разработки программного обеспечения, таким как развязка, разделение задач и архитектура с единой ответственностью.
Реализации SOA различаются по степени детализации: от очень небольшого количества сервисов, которые охватывают большие области функциональности, до многих десятков или сотен небольших приложений в так называемой «микросервисной» архитектуре. Независимо от уровня детализации, специалисты по SOA в целом согласны с тем, что это ни в коем случае не бесплатный обед. Как и многие передовые методы разработки программного обеспечения, это инвестиции, которые потребуют дополнительного планирования, разработки и тестирования.
Что такое AWS Lambda?
AWS Lambda — это сервис, предлагаемый платформой Amazon Web Services. AWS Lambda позволяет загружать код, который будет выполняться в контейнере по требованию, управляемом Amazon. AWS Lambda будет управлять предоставлением и управлением серверами для запуска кода, поэтому все, что требуется от пользователя, — это упакованный набор кода для запуска и несколько параметров конфигурации для определения контекста, в котором работает сервер. Эти управляемые приложения называются лямбда-функциями.
AWS Lambda имеет два основных режима работы:
Асинхронный/управляемый событиями:
Лямбда-функции могут запускаться в ответ на событие в асинхронном режиме. Любой источник событий, такой как S3, SNS и т. д., не будет блокироваться, и функции Lambda могут использовать это во многих отношениях, например, для создания конвейера обработки для некоторой цепочки событий. Существует множество источников информации, и в зависимости от источника события будут передаваться в функцию Lambda из источника событий или опрашиваться на наличие событий с помощью AWS Lambda.
Синхронный/Запрос->Ответ:
Для приложений, требующих синхронного возврата ответа, Lambda можно запустить в синхронном режиме. Обычно это используется в сочетании с сервисом API Gateway для возврата HTTP-ответов от AWS Lambda конечному пользователю, однако функции Lambda также можно вызывать синхронно посредством прямого вызова AWS Lambda.
Функции AWS Lambda загружаются в виде ZIP-файла, содержащего код обработчика в дополнение к любым зависимостям, необходимым для работы обработчика. После загрузки AWS Lambda будет выполнять этот код по мере необходимости и масштабировать количество серверов от нуля до тысяч при необходимости без какого-либо дополнительного вмешательства со стороны потребителя.
Лямбда-функции как эволюция SOA
Базовая SOA — это способ структурировать вашу кодовую базу в небольшие приложения, чтобы использовать преимущества приложений способами, описанными ранее в этой статье. Исходя из этого, в центре внимания оказывается способ связи между этими приложениями. SOA, управляемая событиями (также известная как SOA 2.0), допускает не только традиционную прямую связь между службами SOA 1.0, но и распространение событий по всей архитектуре для сообщения об изменениях.
Архитектура, управляемая событиями, — это шаблон, который естественным образом способствует слабой связанности и компонуемости. Создавая события и реагируя на них, службы могут быть добавлены ad-hoc для добавления новых функций к существующему событию, а несколько событий могут быть объединены для обеспечения более широких функциональных возможностей.
AWS Lambda можно использовать в качестве платформы для простого создания приложений SOA 2.0. Есть много способов вызвать лямбда-функцию; от традиционного подхода с использованием очередей сообщений в Amazon SNS до событий, создаваемых файлом, загружаемым в Amazon S3, или электронным письмом, отправляемым с помощью Amazon SES.
Реализация простой службы загрузки изображений
Мы будем создавать простое приложение для загрузки и извлечения изображений с использованием стека AWS. Этот пример проекта будет содержать две лямбда-функции: одна работает в режиме запроса-> ответа, которая будет использоваться для обслуживания нашего простого веб-интерфейса, а другая будет обнаруживать загруженные изображения и изменять их размер.
Первая лямбда-функция будет выполняться асинхронно в ответ на событие загрузки файла, инициированное в корзине S3, в которой будут храниться загруженные изображения. Он возьмет предоставленное изображение и изменит его размер, чтобы он соответствовал размеру изображения 400x400.
Другая лямбда-функция будет обслуживать HTML-страницу, предоставляя пользователю как функциональность для просмотра изображений, размер которых изменен другой нашей лямбда-функцией, так и интерфейс для загрузки изображения.
Начальная конфигурация AWS
Прежде чем мы сможем начать, нам нужно настроить некоторые необходимые сервисы AWS, такие как IAM и S3. Они будут настроены с помощью веб-консоли AWS. Однако большую часть конфигурации также можно выполнить с помощью утилиты командной строки AWS, которую мы будем использовать позже.
Создание сегментов S3
S3 (или Simple Storage Service) — это сервис хранения объектов Amazon, который предлагает надежное и экономичное хранилище любых данных. Мы будем использовать S3 для хранения загружаемых изображений, а также измененных версий изображений, которые мы обработали.
Сервис S3 можно найти в раскрывающемся списке «Службы» в консоли AWS в подразделе «Хранилище и доставка контента». При создании корзины вам будет предложено ввести как имя корзины, так и выбрать регион. Выбор региона, близкого к вашим пользователям, позволит S3 оптимизировать задержку и стоимость, а также некоторые нормативные факторы. Для этого примера мы выберем регион «Стандарт США». Этот же регион позже будет использоваться для размещения функций AWS Lambda.
Стоит отметить, что имена корзин S3 должны быть уникальными, поэтому, если выбранное имя занято, вам потребуется выбрать новое уникальное имя.
Для этого примерного проекта мы создадим два сегмента хранилища с именами «test-upload» и «test-resized». Ведро «тестовая загрузка» будет использоваться для загрузки изображений и хранения загруженного изображения перед его обработкой и изменением размера. После изменения размера изображение будет сохранено в корзину «тестового размера», а необработанное загруженное изображение будет удалено.
Разрешения на загрузку S3
По умолчанию разрешения S3 являются ограничительными и не позволяют внешним пользователям или даже пользователям без прав администратора читать, записывать, обновлять или удалять какие-либо разрешения или объекты в корзине. Чтобы изменить это, нам нужно будет войти в систему как пользователь с правами на управление разрешениями корзины AWS.
Предполагая, что мы находимся в консоли AWS, мы можем просмотреть разрешения для нашего сегмента загрузки, выбрав сегмент по имени, нажав кнопку «Свойства» в правом верхнем углу экрана и открыв свернутый раздел «Разрешения».
Чтобы разрешить анонимным пользователям загружать в это ведро, нам нужно будет отредактировать политику ведра, чтобы разрешить конкретное разрешение, разрешающее загрузку. Это достигается с помощью политики конфигурации на основе JSON. Такие политики JSON широко используются в AWS в сочетании с сервисом IAM. Нажав кнопку «Изменить политику корзины», просто вставьте следующий текст и нажмите «Сохранить», чтобы разрешить загрузку общедоступных изображений:
{ "Version": "2008-10-17", "Id": "Policy1346097257207", "Statement": [ { "Sid": "Allow anonymous upload to /", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::test-upload/*" } ] }
После этого мы можем проверить правильность политики корзины, попытавшись загрузить изображение в корзину. Следующая команда cURL сделает свое дело:
curl https://test-upload.s3.amazonaws.com -F 'key=test.jpeg' -F '[email protected]'
Если возвращается ответ с диапазоном 200, мы будем знать, что конфигурация для сегмента загрузки была успешно применена. Теперь наши корзины S3 должны быть (в основном) настроены. Позже мы вернемся к этому сервису в консоли, чтобы связать наши события загрузки изображений с вызовом нашей функции изменения размера.
Разрешения IAM для Lambda
Все роли Lambda выполняются в контексте разрешений, в данном случае «роль», определяемая службой IAM. Эта роль определяет любые и все разрешения, которые функция Lambda имеет во время ее вызова. Для целей этого примерного проекта мы создадим общую роль, которая будет использоваться между обеими функциями Lambda. Однако в производственном сценарии рекомендуется более точная детализация в определениях разрешений, чтобы гарантировать, что любые уязвимости безопасности изолированы только от определенного контекста разрешений.
Службу IAM можно найти в подразделе «Безопасность и идентификация» раскрывающегося списка «Службы». Сервис IAM — это очень мощный инструмент для управления доступом к сервисам AWS, и предоставленный интерфейс может поначалу показаться немного сложным, если вы не знакомы с подобными инструментами.
Оказавшись на странице панели инструментов IAM, в левой части страницы можно найти подраздел «Роли». Отсюда мы можем использовать кнопку «Создать новую роль», чтобы вызвать многошаговый мастер для определения разрешений роли. Давайте использовать «лямбда_роль» в качестве имени нашего общего разрешения. После перехода со страницы определения имени вам будет предложено выбрать тип роли. Поскольку нам требуется только доступ к S3, нажмите «Роли сервисов AWS» и в поле выбора выберите «AWS Lambda». Вам будет представлена страница политик, которые можно прикрепить к этой роли. Выберите политику «AmazonS3FullAccess» и перейдите к следующему шагу, чтобы подтвердить создаваемую роль.
Важно отметить имя и ARN (имя ресурса Amazon) созданной роли. Это будет использоваться при создании новой функции Lambda для определения роли, которая будет использоваться для вызова функции.
Примечание. AWS Lambda автоматически регистрирует все выходные данные вызовов функций в сервисе ведения журналов AWS Cloudwatch. Если эта функциональность желательна, что рекомендуется для производственной среды, в политики для этой роли необходимо добавить разрешение на запись в поток журналов Cloudwatch.
Код!
Обзор
Теперь мы готовы начать кодирование. Предположим, что на этом этапе вы настроили команду «awscli». Если у вас его нет, следуйте инструкциям на странице https://aws.amazon.com/cli/, чтобы настроить awscli на своем компьютере.
Примечание: код, используемый в этих примерах, укорочен для удобства просмотра на экране. Для получения более полной версии посетите репозиторий по адресу https://github.com/gxx/aws-lambda-python/.
Во-первых, давайте создадим структуру скелета для нашего проекта.
aws-lambda-python/ - image_list/ - handler.py - list.html - Makefile - requirements.txt - image_resize/ - handler.py - resize.py - Makefile - requirements.txt - .pydistutils.cfg
В нашей структуре есть два подкаталога, по одному для каждой из наших лямбда-функций. В каждом из них у нас есть общие файлы handler.py, Makefile и requirements.txt. Файл handler.py будет содержать метод для вызова каждой из лямбда-функций и может считаться точкой входа для функций. Файл requirements.txt будет содержать список наших зависимостей, поэтому мы можем легко указывать и обновлять требования. Наконец, команда Makefile, которую мы будем использовать, обеспечит простой механизм взаимодействия с awscli. Это значительно упростит процесс создания и обновления нашей лямбда-функции.
Вы заметите файл .pydistutils.cfg в корне каталога нашего проекта. Этот файл необходим, если вы работаете с Python в Homebrew. Из-за метода развертывания лямбда-функции (описанного в следующем разделе) этот файл необходим. Подробнее см. в репозитории.
Лямбда-функция изменения размера изображения
Код
Начиная с функции resize_image, мы заморозим зависимость Wand, нашу библиотеку обработки изображений, сохранив Wand==0.4.2
в файле requirements.txt. Это будет единственная зависимость для нашей лямбда-функции image_resize. Функция resize_image в resize.py должна будет обрабатывать ресурс изображения из библиотеки Wand и изменять его размер в соответствии с указанными параметрами ширины и высоты. Чтобы сохранить изображение, размер которого изменяется, мы будем использовать алгоритм изменения размера «наилучшего соответствия», который будет поддерживать соотношение изображения исходного изображения, уменьшая размер изображения, чтобы он соответствовал указанным ширине и высоте.
def resize_image(image, resize_width, resize_height): ... original_ratio = image.width / float(image.height) resize_ratio = resize_width / float(resize_height) # We stick to the original ratio here, regardless of what the resize ratio is if original_ratio > resize_ratio: # If width is larger, we base the resize height as a function of the ratio of the width resize_height = int(round(resize_width / original_ratio)) else: # Otherwise, we base the width as a function of the ratio of the height resize_width = int(round(resize_height * original_ratio)) if ((image.width - resize_width) + (image.height - resize_height)) < 0: filter_name = 'mitchell' else: filter_name = 'lanczos2' image.resize(width=resize_width, height=resize_height, filter=filter_name, blur=1) return image
С учетом этого требуется функция обработчика, чтобы принять событие, сгенерированное изображением, загруженным S3, передать его функции resize_image
и сохранить полученное изображение с измененным размером.

from __future__ import print_function import boto3 from wand.image import Image from resize import resize_image def handle_resize(event, context): # Obtain the bucket name and key for the event bucket_name = event['Records'][0]['s3']['bucket']['name'] key_path = event['Records'][0]['s3']['object']['key'] response = boto3.resource('s3').Object(bucket_name, key_path).get() # Retrieve the S3 Object # Perform the resize operation with Image(blob=response['Body'].read()) as image: resized_data = resize_image(image, 400, 400).make_blob() # And finally, upload to the resize bucket the new image s3_connection.Object('test-resized', key_path).put(ACL='public-read', Body=resized_data) # Finally remove, as the bucket is public and we don't want just anyone dumping the list of our files! s3_object.delete()
Развертывание
Когда код будет готов, его нужно будет загрузить в Amazon Lambda в качестве новой функции Lambda. Здесь в игру вступает Makefile, добавленный в структуру каталогов. Этот Makefile будет использоваться для развертывания определений функций Lambda, которые мы создаем.
ROLE_ARN = arn:aws:iam::601885388019:role/lambda_role FUNCTION_NAME = ResizeImage REGION = us-west-1 TIMEOUT = 15 MEMORY_SIZE = 512 ZIPFILE_NAME = image_resize.zip HANDLER = handler.handle_resize clean_pyc : find . | grep .pyc$ | xargs rm install_deps : pip install -r requirements.txt -t . build : install_deps clean_pyc zip $(ZIPFILE_NAME) -r * create : build aws lambda create-function --region $(REGION) \ --function-name $(FUNCTION_NAME) \ --zip-file fileb://$(ZIPFILE_NAME) \ --role $(ROLE_ARN) \ --handler $(HANDLER) \ --runtime python2.7 \ --timeout $(TIMEOUT) \ --memory-size $(MEMORY_SIZE) update : build aws lambda update-function-code --region $(REGION) \ --function-name $(FUNCTION_NAME) \ --zip-file fileb://$(ZIPFILE_NAME) \ --publish
Основными функциями этого Makefile являются «создание» и «обновление». Эти функции сначала упаковывают текущий каталог, который представляет весь код, необходимый для запуска функции Lambda. Затем все зависимости, указанные в файле requirements.txt
, будут установлены в текущий подкаталог для упаковки. На этапе упаковки содержимое каталога заархивируется для последующей загрузки с помощью команды «awscli». Наш Makefile можно адаптировать для использования в другом определении функции Lambda.
В утилите Makefile мы определяем несколько переменных, необходимых для создания/обновления нашего образа. Настройте их по мере необходимости, чтобы команды Makefile работали должным образом.
-
ROLE_ARN
: это имя ресурса Amazon, которое идентифицирует нашу роль, под которой должна запускаться функция Lambda. -
FUNCTION_NAME
: имя функции Lambda, которую мы создаем/обновляем. -
REGION
: регион, в котором будет создана/обновлена лямбда-функция. -
TIMEOUT
: Тайм-аут в секундах до того, как вызов Lambda будет уничтожен. -
MEMORY_SIZE
: размер памяти в мегабайтах, к которой функция Lambda будет иметь доступ при вызове. -
ZIPFILE_NAME
: имя заархивированного пакета, содержащего код функции Lambda и зависимости. -
HANDLER
: Абсолютный путь импорта в точечной записи функции-обработчика.
После настройки запуск команды make create
сгенерирует что-то похожее на следующий вывод:
$ make create pip install -r requirements.txt -t . ... find . | grep .pyc| xargs rm zip image_resize.zip -r * ... aws lambda create-function --region ap-northeast-1 \ --function-name ResizeImage2 \ --zip-file fileb://image_resize.zip \ --role arn:aws:iam::11111111111:role/lambda_role \ --handler handler.handle_resize \ --runtime python2.7 \ --timeout 15 \ --memory-size 512 { "CodeSha256": "doB1hsujmZnxZHidnLKP3XG2ifHM3jteLEBvsK1G2nasKSo=", "FunctionName": "ResizeImage", "CodeSize": 155578, "MemorySize": 512, "FunctionArn": "arn:aws:lambda:us-west-1:11111111111:function:ResizeImage", "Version": "$LATEST", "Role": "arn:aws:iam::11111111111:role/lambda_role", "Timeout": 15, "LastModified": "2016-01-10T11:11:11.000+0000", "Handler": "handler.handle_resize", "Runtime": "python2.7", "Description": "" }
Тестирование
После выполнения команды создания функция изменения размера наших изображений доступна для использования, однако она не была подключена к корзине S3 для получения событий. Мы по-прежнему можем протестировать функцию через консоль AWS, чтобы убедиться, что функция правильно обрабатывает события загрузки файлов S3. На панели инструментов AWS Lambda, которую можно найти в подразделе «Вычисления» раскрывающегося списка «Сервисы», выберите имя созданной нами функции. На этой странице сведений о функции Lambda есть раскрывающийся список «Действия», содержащий параметр «Настроить тестовое событие».
При нажатии на нее откроется модальное окно, позволяющее указать тестовое событие и несколько примеров шаблонов. Выберите пример «S3 Put» и замените все упоминания имени корзины именем настроенной корзины. Как только это будет настроено, последующее использование кнопки «Тест» на странице функции Lambda вызовет функцию Lambda, как если бы ранее настроенное событие действительно произошло.
Чтобы отслеживать любые трассировки стека ошибок или сообщения журнала, вы можете просмотреть поток журнала в Cloudwatch. Новая группа журналов будет создана одновременно с созданием функции Lambda. Эти потоки журналов полезны и могут быть переданы в другие службы.
Подключение к событиям корзины S3
Вернувшись на панель инструментов S3, разверните свернутый раздел «События», расположенный в меню «Свойства», чтобы отобразить форму «Уведомления о событиях». Обязательными полями для заполнения являются поля «События» и «Отправить». В разделе «События» выберите событие «Объект создан (все)». Это позволит перехватывать все события, которые создают объект в корзине загрузки. Для ввода «Отправлено» выберите переключатель «Лямбда-функция». Появится новый раздел с раскрывающимся списком, содержащим лямбда-функцию «ResizeImage», которую мы настроили в качестве опции. После нажатия «Сохранить» любые события «Создание объекта» теперь будут направляться в качестве входных данных для вызова лямбда-функции «ResizeImage».
Теперь у нас есть основные функции приложения. Давайте запустим еще один тест cURL, чтобы убедиться, что все работает должным образом. Используйте cURL для загрузки изображения в корзину S3 и вручную проверьте, загружается ли изображение в корзину изменения размера.
curl https://test-upload.s3.amazonaws.com -F 'key=test.jpeg' -F '[email protected]'
После выполнения этой команды изображение с измененным размером должно быть создано в корзине «test-resized» через 50-1000 мс в зависимости от того, была ли функция Lambda уже «прогрета».
Список лямбда-функций изображения
Код
Функция ListImage Lambda извлечет список изображений с измененным размером и отобразит их на HTML-странице для пользователя. Эта HTML-страница также предоставляет пользователю возможность загружать собственные изображения. Jinja2 используется в функции для рендеринга HTML из определения шаблона. Как и прежде, эти требования указаны в файле requirements.txt
.
from __future__ import print_function import os import boto3 from jinja2 import Environment from jinja2 import FileSystemLoader def _render_template(image_urls): env = Environment(loader=FileSystemLoader(os.path.abspath(os.path.dirname(__file__)))) template = env.get_template('list.html') rendered_template = template.render(image_urls=image_urls) return rendered_template def handle_list_image(event, context): bucket = boto3.resource('s3').Bucket('test-resized') image_summaries = sorted((image_summary for image_summary in bucket.objects.all()), key=lambda o: o.last_modified) image_urls = [] for summary in image_summaries: image_urls.append( boto3.client('s3').generate_presigned_url( 'get_object', Params={ 'Bucket': summary.bucket_name, 'Key': summary.key } ) ) return {'htmlContent': _render_template(image_urls)}
<html> <head> <title>List Images</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> <script> var uploadImage = (function () { var inProgress = false; return function () { if (inProgress) { return; } inProgress = true; var formData = new FormData(); var fileData = $('#image-file').prop('files')[0]; formData.append('key', parseInt(Math.random() * 1000000)); formData.append('acl', 'public-read'); formData.append('file', fileData); $.ajax({ url: 'https://test-upload.s3.amazonaws.com/', type: 'POST', data: formData, processData: false, contentType: false, success: function (data) { window.location.reload(); } }); } })(); </script> <style type="text/css"> .image__container { float: left; width: 30%; margin-left: 2.5%; margin-right: 2.5%; max-width: 400px; } </style> </head> <body> <nav> <input type="file" onchange="uploadImage()" value="Upload Image" /> </nav> <section> {% for image_url in image_urls %} <div class="image__container"> <img src="{{ image_url }}" /> </div> {% endfor %} </section> </body> </html>
И снова мы можем изменить предыдущий Makefile и использовать команду create для развертывания нашей лямбда-функции.
Шлюз API
Функция ImageList Lambda завершена, однако она не может быть предоставлена пользователям. Это связано с тем, что функции Lambda можно вызывать только либо в ответ на событие из другой службы, либо программно. Именно здесь на помощь приходит сервис Amazon AWS API Gateway. Шлюз API можно найти в подразделе «Службы приложений».
Шлюз API — это способ моделирования конечных точек в виде набора ресурсов и методов, по сути интерфейса REST. Помимо возможности проверки и преобразования запросов, шлюз API выполняет и другие функции, такие как предоставление запросов на регулирование/ограничение скорости.
На панели управления шлюза API создайте новый API для обслуживания функции ListImage. Имя и описание можно настроить по своему усмотрению. После создания щелкните имя нового API, чтобы получить доступ к сведениям об API. Создайте новый ресурс для корневого URL «/». Этот URL-адрес будет использоваться для обслуживания HTML-страницы.
При просмотре сведений о корневой странице ресурсов добавьте метод GET. Установите «Тип интеграции» на «Лямбда-функция», установите «Лямбда-регион» на «us-west-1» или выбранный вами регион и введите имя лямбда-функции ListImage.
Прежде чем мы начнем сопоставлять наш ответ с выводом HTML, нам нужно определить «модель», которая будет определять схему для ответа от сервера в дополнение к сопоставлению этого ответа с типом контента. Выберите раздел «Модели» для API и нажмите «Создать», чтобы создать новую модель. Дайте модели имя «HTML» с типом контента «text/html» и определите схему следующим образом:
{ "$schema": "http://json-schema.org/draft-04/schema#", "title" : "HTML", "type" : "object" }
Вернувшись на панель управления API, выберите созданный нами ресурс и перейдите в раздел «Ответ интеграции». В этом разделе определяется любое преобразование, которое необходимо обработать после получения ответа от лямбда-функции перед передачей ответа на последний шаг.
Откройте раздел «Шаблоны сопоставления» и добавьте новый «Тип контента» «текст/html». Одновременно удалите старый «Тип контента». Справа измените раскрывающийся список с «Выходной транзит» на «Шаблон сопоставления». Это позволит нам изменить необработанный JSON, принятый API Gateway, и вместо этого использовать содержимое HTML внутри свойства «htmlContent» наших возвращаемых данных. Для шаблона сопоставления укажите «$input.htmlContent» в качестве шаблона. Наконец, измените раздел «Ответ метода», удалив «application/json» из «Модели ответа для 200» и добавив вместо него «text/html».
Возвращаясь к панели инструментов для API, в левом верхнем углу страницы есть кнопка с надписью «Развернуть API». Нажмите эту кнопку, чтобы обновить или создать API с указанными ресурсами, методами, моделями и сопоставлениями. Как только это будет сделано, URL-адрес будет отображаться для выбранного этапа развертывания (стадия по умолчанию). Наконец пример готов! Вы можете загрузить несколько файлов для тестирования и просмотра изображений с измененным размером.
Подведение итогов
AWS — это крупный сервис, и в ближайшее время он не исчезнет. Хотя привязка к поставщику всегда требует осторожности, AWS Lambda предлагает относительно простой сервис с богатым набором дополнительных параметров конфигурации. Использование сервисов, предоставляемых AWS, для реализации легко масштабируемых и удобных в сопровождении приложений обеспечит наибольшую выгоду от использования платформы AWS. AWS Lambda — это элегантное, масштабируемое и экономичное решение, поддерживаемое платформой корпоративного уровня, используемой очень большим количеством потребителей. Я считаю, что за «бессерверными» приложениями будущее. Дайте нам знать, что вы думаете в комментариях ниже.