AWS Lambda - функция в C #

В этой главе подробно объясняется, как работать с функцией AWS Lambda на C #. Здесь мы собираемся использовать Visual Studio для написания и развертывания кода в AWS Lambda. Для получения любой информации и помощи относительно установки Visual Studio и добавления инструментария AWS в Visual Studio см.Introductionглаву в этом руководстве. По завершении установки Visual Studio выполните действия, указанные ниже. Обратитесь к соответствующим снимкам экрана для лучшего понимания -

Шаг 1

Откройте Visual Studio и следуйте инструкциям по созданию нового проекта. Нажмите наFile -> New -> Project.

Шаг 2

Теперь отображается следующий экран, на котором вы выбираете AWS Lambda for Visual C#. ВыбратьAWS Lambda Project (.NET Core).

При необходимости вы можете изменить имя, оставив здесь имя по умолчанию. НажмитеOK продолжить.

На следующем шаге вас попросят выбрать Blueprint.

Выбрать Empty function для этого примера и щелкните Finish. Это создаст новую структуру проекта, как показано ниже -

Теперь выберите Function.cs который является основным файлом, в котором создается обработчик с событием и контекстом для AWS Lambda.

Отображение файла Functions.cs выглядит следующим образом -

Вы можете использовать приведенную ниже команду для сериализации входных и выходных параметров в функцию AWS Lambda.

[assembly: 
LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

Подробности обработчика для C #

Обработчик отображается следующим образом -

public string FunctionHandler(string input, ILambdaContext context) {
   return input?.ToUpper();
}

Различные компоненты приведенного выше кода объясняются ниже -

FunctionHandler −Это отправная точка функции C # AWS Lambda.

String input − Параметры обработчика string input содержит все данные о событиях, такие как объект S3, детали шлюза API и т. д.

ILambdaContext context −ILamdaContext - это интерфейс с подробностями контекста. Он содержит такие детали, как имя лямбда-функции, детали памяти, детали тайм-аута и т. Д.

Обработчик Lambda можно вызывать синхронно и асинхронно. Если вызвать синхронизацию, как показано выше, вы можете получить возвращаемый тип. Если async, то возвращаемый тип должен быть недействительным.

Теперь давайте развернем AWS Lambda C # и протестируем то же самое. Щелкните проект правой кнопкой мыши и выберитеPublish to AWS Lambda как показано ниже -

Заполните Function Name и нажмите на Next. Следующий отображаемый экран - этоAdvanced Function Details как показано -

Введите Role Name, Memory а также Timeout. подробности Обратите внимание, что здесь мы выбрали существующую роль, созданную и использовавшую память как 128 МБ, и тайм-аут как 10 секунд. По завершении нажмитеUpload для публикации в консоли AWS Lambda.

После загрузки функции AWS Lambda вы увидите следующий экран. НажмитеInvokeдля выполнения созданной функции AWS Lambda. В настоящее время он показывает ошибку, поскольку требует ввода данных в соответствии с написанным кодом.

Теперь давайте введем пример ввода и Invokeснова. Обратите внимание, что здесь мы ввели текст в поле ввода и то же самое при нажатииinvokeотображается в верхнем регистре в разделе ответов. Вывод журнала отображается ниже -

Теперь давайте также проверим консоль AWS, чтобы увидеть, создана ли функция, когда мы развернули функцию из Visual Studio.

Созданная выше лямбда-функция aws lambda using csharp и то же самое отображается в консоли AWS, как показано на скриншотах, приведенных ниже -

Подпись обработчика

Обработчик - это начальная точка для выполнения AWS. Имя обработчика должно быть определено как -

ASSEMBLY::TYPE::METHOD

Детали подписи поясняются ниже -

ASSEMBLY- Это имя сборки .NET для созданного приложения. По сути, это имя папки, в которой создается проект.

TYPE- Это имя обработчика. По сути, это namespace.classname.

METHOD - Это имя обработчика функции.

Код для подписи обработчика показан ниже -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Amazon.Lambda.Core;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace AWSLambda3 {
   public class Function {

      /// <summary>
      /// A simple function that takes a string and does a ToUpper
      /// </summary>
      /// <param name="input"></param>
      /// <param name="context"></param>
      /// <returns></returns>
      public string FunctionHandler(string input, ILambdaContext context) {
         return input?.ToUpper();
      }
   }
}

Обратите внимание, что здесь сборка AWSLamda3, Тип - namespace.classname, который AWSLambda3.Function и метод FunctionHandler. Таким образом, подпись обработчикаAWSLamda3::AWSLambda3.Function::FunctionHandler

Объект контекста в C #

Объект контекста предоставляет полезную информацию о среде выполнения в среде AWS. Свойства, доступные в объекте контекста, показаны в следующей таблице -

Старший Нет Свойства и описание
1

MemoryLimitInMB

Это даст подробную информацию о памяти, настроенной для функции AWS Lambda.

2

FunctionName

Имя функции AWS Lambda

3

FunctionVersion

Версия функции AWS Lambda

4

InvokedFunctionArn

ARN используется для вызова этой функции.

5

AwsRequestId

Идентификатор запроса AWS для созданной функции AWS

6

LogStreamName

Имя потока журнала Cloudwatch

7

LogGroupName

Название группы Cloudwatch

8

ClientContext

Информация о клиентском приложении и устройстве при использовании с AWS Mobile SDK

9

Identity

Информация об идентификаторе amazon cogbnito при использовании с AWS Mobile SDK

10

RemainingTime

Оставшееся время выполнения до завершения функции

11

Logger

Регистратор, связанный с контекстом

пример

В этом разделе давайте протестируем некоторые из указанных выше свойств в AWS Lambda на C #. Обратите внимание на пример кода, приведенный ниже -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Amazon.Lambda.Core;
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace AWSLambda6 {
   public class Function {

      /// <summary>
      /// </summary>
      /// <param name="input"></param>
      /// <param name="context"></param>
      /// <returns></returns>
      public void FunctionHandler(ILambdaContext context) {
         LambdaLogger.Log("Function name: " + context.FunctionName+"\n");
         context.Logger.Log("RemainingTime: " + context.RemainingTime+"\n");
         LambdaLogger.Log("LogGroupName: " + context.LogGroupName+"\n");            
      }
   }
}

Соответствующий вывод, который вы можете наблюдать, когда вызываете приведенный выше код в C# как показано ниже -

Соответствующий вывод, который вы можете наблюдать, когда вызываете приведенный выше код в AWS Console как показано ниже -

Ведение журнала с использованием C #

Для ведения журнала вы можете использовать две функции -

  • context.Logger.Log

  • LambdaLogger.Log

Обратите внимание на следующий пример, показанный здесь -

public void FunctionHandler(ILambdaContext context) {
   LambdaLogger.Log("Function name: " + context.FunctionName+"\n");
   context.Logger.Log("RemainingTime: " + context.RemainingTime+"\n");
   LambdaLogger.Log("LogGroupName: " + context.LogGroupName+"\n");            
}

Соответствующий вывод для кода, приведенного выше, показан здесь -

Вы можете получить журналы из CloudWatch, как показано ниже -

Обработка ошибок в C # для лямбда-функции

В этом разделе обсуждается обработка ошибок в C #. Для обработки ошибок,Exception class должен быть расширен, как показано в примере, показанном ниже -

пример

namespace example {            
   public class AccountAlreadyExistsException : Exception {
      public AccountAlreadyExistsException(String message) :
         base(message) {
      }
   }
} 
namespace example {
   public class Handler {
     public static void CreateAccount() {
       throw new AccountAlreadyExistsException("Error in AWS Lambda!");
     }
   }
}

Соответствующий вывод для кода, приведенного выше, приведен ниже -

{
   "errorType": "LambdaException",
   "errorMessage": "Error in AWS Lambda!"
}