Serverless функции на C#: AWS Lambda от А до Я — полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Почему 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 — держит заданное количество экземпляров «горячими»

Блоги

Рекомендаций по книгам