Во многих моих побочных проектах я использую AWS Lambda для большого разнообразия вещей. Но самое распространенное, для чего я использую это, — это автоматизировать много обыденных и повторяющихся задач, которые мне часто приходится выполнять. Не поймите меня неправильно, без сервера отлично подходит для многих вещей. Но это фантастика для того, чтобы превратить эти одноразовые задачи, которые никогда не бывают разочами, в легкие кусочки кода.
Мой самый длинный боковой проект- Ultimate Fantasy Supercross . Я не буду вдаваться в большое длительное вступление в проект, потому что Вы можете прочитать об этом здесь Анкет Но достаточно сказать, что я использую .net Core и AWS Lambda довольно немного в этом проекте.
Многие одноразовые задачи и задания Cron, связанные с UFSX, я превратился в функции Lambda. Это было удобно для того, чтобы превратить эти одноразовые задачи в повторяемые части кода, которые я могу запускать снова и снова.
До недавнего времени многие из этих задач были один на один. Это означает, что одна задача может быть одной .csproj
Файл и, следовательно, одна функция AWS Lambda.
Но чем больше этих проектов я начал создавать, тем больше это было немного странно. Потребил ли каждая функция Lambda свой собственный файл проекта? Я обнаружил, что у меня есть отдельные проекты для вещей, которые имели очень похожие функциональные возможности. Объединение их в один проект имел большой смысл.
Как возникла проблема
Потому что UFSX был построен с использованием .NET Я много использовал инструментарий AWS для Visual Studio. Для тех, кто не знаком, эти инструменты предоставляют удобные ярлыки прямо в Visual Studio. Ниже приведен тот, который показывает, как вы можете публиковать непосредственно в AWS Lambda.
Этот ярлык создал и развертывал мои одноразовые функции Lambda на ветерок. Но ярлык, из коробки немного ограничивает. Шорткат позволяет вам развернуть только одну функцию AWS Lambda на проект.
Вот как я закончил с моделью, в которой я был, одна функция Lambda на проект. Инструмент, который я использовал, подтолкнул меня в направлении, которое может или не может быть подходящим. Не беспокоиться о том, что люди AWS уже думали об этом И я просто никогда не проводил исследования.
Несколько функций AWS Lambda на .NET Основной проект
Оказывается, имея несколько функций AWS Lambda в одном .csproj
выполнимо с небольшим количеством облачной информации AWS.
Чтобы определить несколько функций без серверов в одном проекте, мы сначала добавили Serverless.template
к нашему проекту. Вы также можете сделать это, используя также инструментарий AWS. Щелкните правой кнопкой мыши проект с помощью вашей функции AWS Lambda. Затем перейдите к разделу «Добавить» и выберите шаблон AWS без сервера.
Начальный Serverless.template
Есть довольно много вещей в этом.
{ "AWSTemplateFormatVersion": "2010-09-09", "Transform": "AWS::Serverless-2016-10-31", "Description": "Starting template for an AWS Serverless Application.", "Parameters": {}, "Resources": { "DefaultFunction": { "Type": "AWS::Serverless::Function", "Properties": { "Handler": ":: :: ", "Runtime": "dotnetcore2.1", "CodeUri": "", "Description": "Default function", "MemorySize": 256, "Timeout": 30, "Role": null, "Policies": ["AWSLambdaFullAccess"], "Events": { "ProxyResource": { "Type": "Api", "Properties": { "Path": "/{proxy+}", "Method": "ANY" } } } } } }, "Outputs": { "ApiURL": { "Description": "API endpoint URL for Prod environment", "Value": { "Fn::Sub": "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/" } } } }
Мы не собираемся проходить все, что вы можете настроить здесь. Но это шаблон облачной информации, поэтому параметры практически безграничны. Для целей этого сообщения в блоге давайте посмотрим, как вы можете использовать этот шаблон, чтобы определить несколько функций AWS Lambda в одном .NET .NET Основной проект.
Под Ресурсы
Мы видим DefaultFunction
. Это конфигурация для этой функции лямбда. Если мы хотим определить две функции Lambda в одном файле проекта, нам нужно определить другой блок таким же образом.
{ "AWSTemplateFormatVersion": "2010-09-09", "Transform": "AWS::Serverless-2016-10-31", "Description": "Starting template for an AWS Serverless Application.", "Parameters": {}, "Resources": { "FunctionOne": { "Type": "AWS::Serverless::Function", "Properties": { "FunctionName": "FunctionOne", "Handler": "AWS.Example.Project::AWS.Example.Project.Function::FunctionOneHandler", "Runtime": "dotnetcore2.1", "CodeUri": "", "Description": "", "MemorySize": 1024, "Timeout": 180, "Role": "", "Policies": ["AWSLambdaFullAccess"] } }, "FunctionTwo": { "Type": "AWS::Serverless::Function", "Properties": { "FunctionName": "FunctionTwo", "Handler": "AWS.Example.Project::AWS.Example.Project.Function::FunctionTwoHandler", "Runtime": "dotnetcore2.1", "CodeUri": "", "Description": "", "MemorySize": 1024, "Timeout": 180, "Role": " ", "Policies": ["AWSLambdaFullAccess"] } } } }
Выше у нас теперь есть две функции, определенные в нашем Serverless.template
, Функция
и Functiontwo
Анкет Здесь важная вещь — это путь в Обработчик
поле. Это полный путь к обработчику функции в вашем проекте. Это следует за формой
Анкет
Так как вы это разверните?
Теперь, когда у нас есть шаблон, который может развернуть несколько функций Lambda из одного проекта, как мы его на самом деле развертываем?
Что ж, если графический интерфейс является вашим инструментом, инструментарий AWS может справиться с этим для вас. Когда мы выбираем «публиковать в AWS Lambda …», нам представлены другой рабочий процесс, когда наш проект содержит Serverless.template
файл.
Вместо того, чтобы получить диалог для загрузки функции Lambda, мы теперь получаем диалог для публикации приложения без сервера AWS. Это потому, что у нас есть шаблонный файл, определяющий несколько ресурсов.
Для тех, кто предпочитает работать над командной строкой, там также есть опция.
Пока у вас установлен инструментарий AWS для Visual Studio, все, что вы можете сделать там, вы также можете сделать из командной строки. Чтобы развернуть наш проект, содержащий несколько функций Lambda, нам нужно запустить его из папки, содержащей проект.
$ dotnet lambda deploy-serverless
Это все, что нужно, вызов построит ваш проект, загрузите источник в Lambda и обновите стек CloudFormation.
Вывод
Это удобное решение, которое пригодится, так как я добавляю все больше и больше серверов к Ultimate Fantasy Supercross. Поскольку у меня теперь есть работоспособное решение, используя этот подход, я начал размещать аналогичные функции Lambda в один и тот же файл проекта.
Когда дело доходит до этого, будьте осторожны.
Чем больше функций вы начинаете добавлять в один проект, тем больше зависимостей на функцию вы можете представить. Кроме того, ваши пакеты развертывания функций могут стать больше и, следовательно, вызвать проблемы с производительностью.
Для простых типов рабочих мест Cron это работает хорошо. Но это может быть не подходит для других типов рабочих нагрузок.
Хотите проверить другие мои проекты?
Я большой поклонник сообщества разработчиков. Если у вас есть какие -либо вопросы или вы хотите поговорить о различных идеях, касающихся рефакторинга, Обратитесь в Twitter или бросить комментарий ниже.
Вне блогов я создал Учитесь AWS, используя его курс Анкет В курсе мы сосредоточены на изучении веб -сервисов Amazon, фактически используя его для размещения, защиты и доставки статических веб -сайтов. Это простая проблема со многими решениями, но она идеально подходит для наращивания вашего понимания AWS. Недавно я добавил две новые бонусные главы к курсу, которые сосредоточены на инфраструктуре в качестве кода и непрерывного развертывания.
Оригинал: «https://dev.to/kylegalbraith/how-to-write-multiple-aws-lambda-handlers-in-a-net-core-project-12o4»