Введение: Почему Serverless и C# — идеальная пара
Serverless-архитектура (или бессерверные вычисления) — это модель, при которой вы пишете код, не заботясь об управлении серверами. AWS Lambda — один из самых популярных сервисов для запуска такого кода. В связке с C# (.NET) вы получаете мощный, типобезопасный и производительный инструмент для создания микросервисов, API-обработчиков и фоновых задач.
В этой статье мы разберем весь путь: от настройки окружения до деплоя и мониторинга первой функции на C# в AWS Lambda. Материал подойдет как новичкам, так и опытным разработчикам, желающим систематизировать знания.
1. Подготовка окружения и создание проекта
1.1 Установка инструментов
Для работы с C# и AWS Lambda вам понадобятся:
- .NET SDK (8.0 или 6.0) — скачать с dotnet.microsoft.com;
- AWS CLI — для управления ресурсами из терминала;
- Amazon.Lambda.Tools — глобальный инструмент .NET для деплоя.
Установите Lambda Tools одной командой:
dotnet tool install -g Amazon.Lambda.Tools
1.2 Создание шаблона функции
Используйте встроенный шаблон для быстрого старта:
dotnet new lambda.EmptyFunction --name MyFirstLambda --profile default --region us-east-1
Эта команда создаст проект с файлом Function.cs и aws-lambda-tools-defaults.json для настроек деплоя.
2. Написание кода Serverless функции на C#
2.1 Базовая структура Lambda-функции
Каждая Lambda-функция — это метод, принимающий объект события и контекст выполнения. Рассмотрим простейший пример:
using Amazon.Lambda.Core;
using Amazon.Lambda.SQSEvents;
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
public class Function
{
public async Task<string> FunctionHandler(SQSEvent evnt, ILambdaContext context)
{
context.Logger.LogInformation("Получено сообщений: " + evnt.Records.Count);
foreach (var record in evnt.Records)
{
await ProcessMessageAsync(record.Body, context);
}
return "Обработано " + evnt.Records.Count + " сообщений";
}
private async Task ProcessMessageAsync(string messageBody, ILambdaContext context)
{
context.Logger.LogInformation("Обработка: " + messageBody);
await Task.Delay(100); // Имитация работы
}
}
Обратите внимание на атрибут LambdaSerializer — он указывает, как сериализовать/десериализовать JSON. Для C# рекомендуется SystemTextJson.
2.2 Работа с разными триггерами
AWS Lambda поддерживает множество источников событий. Вот пример для HTTP-запроса через API Gateway:
public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
{
var name = request.QueryStringParameters?.ContainsKey("name") == true
? request.QueryStringParameters["name"]
: "мир";
var responseBody = $"Привет, {name}!";
return new APIGatewayProxyResponse
{
StatusCode = 200,
Body = responseBody,
Headers = new Dictionary<string, string> { { "Content-Type", "text/plain" } }
};
}
Для работы с HTTP потребуется установить пакет Amazon.Lambda.APIGatewayEvents.
3. Деплой и тестирование функции
3.1 Локальное тестирование
Перед деплоем проверьте код локально с помощью dotnet lambda invoke:
dotnet lambda invoke --payload "{\"Records\": [{\"body\": \"Тест\"}]}"
Это сэкономит время и ресурсы AWS.
3.2 Деплой в облако
Выполните команду для публикации:
dotnet lambda deploy-function MyFirstLambda
Утилита автоматически упакует код в ZIP, загрузит в S3 и создаст Lambda-функцию. Вы можете указать роль IAM, таймаут и память в файле aws-lambda-tools-defaults.json:
{
"profile": "default",
"region": "us-east-1",
"configuration": "Release",
"function-runtime": "dotnet8",
"function-memory-size": 256,
"function-timeout": 30,
"function-handler": "MyFirstLambda::MyFirstLambda.Function::FunctionHandler"
}
3.3 Тестирование в консоли AWS
После деплоя перейдите в AWS Console → Lambda → MyFirstLambda → Тест. Создайте тестовое событие (например, для SQS) и нажмите «Тестировать». Вы увидите результат выполнения и логи.
4. Отладка, мониторинг и лучшие практики
4.1 Логирование и CloudWatch
Все вызовы context.Logger.LogInformation() автоматически попадают в Amazon CloudWatch Logs. Вы можете настроить метрики и алерты на ошибки:
- Откройте CloudWatch → Logs и найдите лог-группу
/aws/lambda/MyFirstLambda; - Создайте фильтр метрики для поиска слова
ERROR; - Настройте оповещение по email или Slack.
4.2 Оптимизация холодного старта
Для C# холодный старт может составлять 1–3 секунды. Снизить его помогут:
- Уменьшение размера пакета — используйте
dotnet lambda packageи проверьте, что не включены лишние зависимости; - Provisioned Concurrency — держит заданное количество экземпляров «горячими»