Поиск по сайту:

Как запустить веб-API ASP.NET на AWS с помощью Lambda и API Gateway


AWS Lambda — это бессерверная платформа для запуска кода без управления базовым оборудованием. Он очень гибкий и может выполнять множество различных рабочих нагрузок, включая полные API-интерфейсы C# с использованием ASP.NET Core.

Подождите, вы можете сделать это на Lambda?

Ага! Вы можете не только запускать функции на основе среды выполнения .NET, но и отвечать на запросы, используя все инструменты, предоставляемые вам ASP.NET. Вы можете создавать API-интерфейсы, взаимодействующие с базами данных, например управляемую базу данных AWS RDS, и при этом полностью масштабируемые, работающие на бессерверных функциях.

В то время как предыдущие версии ASP.NET, работающие на .NET Framework (более старая среда выполнения только для Windows), как известно, были громоздкими, новый стек ASP.NET Core, работающий на .NET Core 3.1, и более новая .NET 5 сделали значительные улучшения производительности и использования памяти.

Обычно это невозможно, так как ASP.NET использует свой собственный веб-сервер HTTP под названием Kestrel для ответа на запросы, которые не будут работать, поскольку обрабатываются средой выполнения Lambda. Однако AWS предоставила гениальное решение для этого; традиционно установка ASP.NET обычно включает их веб-сервер Kestrel за IIS или NGINX. Это говорит с платформой ASP.NET для обработки запросов.

AWS создала прокси-класс Amazon.Lambda.AspNetCoreServer, который позаботится обо всем перед ASP.NET. Это позволяет вам повторно использовать большую часть вашего кода при соединении вашего API с Lambda.

Это означает, что вам нужно будет использовать API Gateway, но это неплохо, поскольку API Gateway очень полезен для управления вашим API. Это позволяет вам строго определять все правила, которые заставляют ваш API функционировать; конечно, вам потребуется настроить приложение ASP.NET для обработки всех запросов от шлюза API.

Тем не менее, это не будет лучшим опытом с точки зрения времени запуска. По сравнению с облегченными языками сценариев, такими как JavaScript и Python, пакеты .NET имеют гораздо больше накладных расходов. Есть несколько трюков, которые вы можете использовать для повышения производительности, и вы даже можете заплатить за это с помощью выделенной емкости. В противном случае вы должны быть готовы к времени холодного запуска около 1-2 секунд.

Это не означает, что каждое выполнение будет занимать 2 секунды для загрузки страницы. Как только происходит первая загрузка, все инициализируется и остается «горячим» в Lambda в течение 5 минут. Если кто-то еще запрашивает его, функция обработает запрос, как обычно на реальном сервере.

Настройка ASP.NET

AWS включает в себя генератор для проектов ASP.NET Lambda, который предварительно настроен с помощью стандартного кода и развертывания в CloudFormation. Мы рекомендуем вам начать здесь, протестировать все, а затем переместить код API, но если вы хотите вставить его в существующий проект, у AWS также есть руководство для этого.

Вам понадобится установленное расширение AWS Toolkit для Visual Studio, которым вы можете управлять в разделе «Расширения» в строке меню. Это то, что содержит шаблоны проектов для приложений AWS.

На главном экране-заставке Visual Studio создайте новый проект:

Вы, вероятно, захотите поместить это в отдельное решение, поэтому выберите «Пустое решение» в разделе «Другое».

Затем вы можете щелкнуть правой кнопкой мыши на панели файлов, чтобы добавить новый проект, и выбрать «Бессерверное приложение AWS» или «Бессерверное приложение AWS с тестами», в зависимости от того, что вы предпочитаете.

Убедитесь, что это на C#, если вы не хотите использовать F# по какой-то причине.

Также имейте в виду, что это проект «Бессерверное приложение», которое управляет всеми ресурсами через сервис AWS «инфраструктура как код» CloudFormation. Если вы просто хотели создать некоторые функции Lambda, для этого тоже есть проект.

Вы попадете в подменю, где сможете выбрать тип чертежа, который хотите построить. Выберите «ASP.NET Core Web API» и создайте проект.

По большей части это настроено как стандартный проект ASP.NET. Основное отличие состоит в том, что традиционный Program.cs заменен на LambdaEntryPoint.cs в качестве основной точки входа и содержит класс-оболочку, соединяющий код AWS с кодом ASP.NET IWebHostBuilder, который используется для запуска приложения.

После того, как все будет запущено, вам нужно будет скопировать контроллеры, модели и службы и заменить Startup.cs вашей конфигурацией.

Использование вашего API

Для развертывания этого проекта AWS включает встроенные параметры публикации с помощью расширения AWS Toolkit. Щелкните правой кнопкой мыши свой проект и выберите «Опубликовать в AWS Lambda…».

Вам нужно указать корзину для загрузки и указать имя для развертывания CloudFormation.

Загрузка и публикация займет секунду, но после этого вы сможете перейти в Консоль управления AWS Lambda, чтобы просмотреть свою функцию. Он будет иметь автоматически сгенерированное имя с использованием имени стека CloudFormation в качестве префикса.

В разделе «Конфигурация» > «Триггеры» вы можете просмотреть все триггеры шлюза API, которые вызывают эту функцию, и протестировать ее самостоятельно с помощью конечной точки.

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

Если вы хотите изменить его, вам нужно будет отредактировать serverless.template в своем проекте. Для получения дополнительной информации вы можете обратиться к нашему руководству по использованию AWS CloudFormation.