Serverless функции на C#: Полное руководство по AWS Lambda с .NET
Serverless-архитектура становится стандартом для современных приложений. AWS Lambda — один из самых популярных сервисов для выполнения кода без управления серверами. В этой статье мы разберем, как создавать serverless функции на C# с использованием .NET 6/8, настроить окружение, написать эффективный код и развернуть его в облаке.
Что такое AWS Lambda и почему C#?
AWS Lambda — это вычислительный сервис, который запускает ваш код в ответ на события и автоматически управляет вычислительными ресурсами. C# с .NET — отличный выбор для Lambda благодаря:
- Высокой производительности — .NET 6+ обеспечивает быстрый холодный старт (около 200-500 мс).
- Знакомому синтаксису — если вы уже пишете на C#, порог входа минимален.
- Богатой экосистеме — доступны все библиотеки NuGet.
- Интеграции с AWS — SDK для .NET позволяет легко работать с S3, DynamoDB, SQS и другими сервисами.
Serverless функции на C# идеально подходят для обработки файлов, REST API (через API Gateway), ETL-процессов и микросервисов.
Настройка проекта для AWS Lambda на C#
Для начала работы вам понадобится:
- .NET SDK 6.0 или выше
- Учетная запись AWS
- AWS CLI (рекомендуется)
- Инструмент
dotnet lambda(устанавливается черезdotnet tool install -g Amazon.Lambda.Tools)
Создадим новый проект:
dotnet new lambda.EmptyFunction --name MyFirstLambdacd MyFirstLambdaСтруктура проекта включает:
Function.cs— основной файл с логикой.aws-lambda-tools-defaults.json— настройки деплоя.MyFirstLambda.csproj— файл проекта с необходимыми пакетами.
Убедитесь, что в .csproj есть ссылки на пакеты:
<PackageReference Include="Amazon.Lambda.Core" Version="2.2.0" /><PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="2.3.1" />Написание первой serverless функции на C#
Откроем Function.cs и напишем простой обработчик, который принимает имя и возвращает приветствие:
using Amazon.Lambda.Core;using Amazon.Lambda.Serialization.SystemTextJson;
[assembly: LambdaSerializer(typeof(DefaultLambdaJsonSerializer))]
public class Function{ public string FunctionHandler(Input input, ILambdaContext context) { context.Logger.LogInformation($"Обработка запроса для: {input.Name}"); return $"Привет, {input.Name}! Время: {DateTime.UtcNow}"; }}
public class Input{ public string Name { get; set; }}Разберем ключевые моменты:
LambdaSerializer— указывает, как сериализовать/десериализовать JSON.SystemTextJson— быстрый и современный вариант.ILambdaContext— предоставляет информацию о текущем вызове: остаток времени, логгер, ID запроса.Input— простой POCO-класс для входных данных.
Для тестирования локально используйте:
dotnet lambda invoke-function MyFirstLambda --payload "{\\"Name\\": \\"Мир\\"}"Работа с AWS сервисами из Lambda
Реальная сила serverless функций на C# проявляется при интеграции с другими сервисами. Рассмотрим пример загрузки файла в S3:
using Amazon.S3;using Amazon.S3.Model;using Amazon.Lambda.Core;
public class S3Function{ private readonly IAmazonS3 _s3Client; public S3Function() { _s3Client = new AmazonS3Client(); // использует IAM роль Lambda }