AWS Lambda - Função em C #

Este capítulo irá explicar como trabalhar com a função AWS Lambda em C # em detalhes. Aqui, vamos usar o visual studio para escrever e implantar o código no AWS Lambda. Para obter qualquer informação e ajuda sobre a instalação do Visual studio e adição do kit de ferramentas AWS ao Visual Studio, consulte oIntroductioncapítulo neste tutorial. Depois de concluir a instalação do Visual Studio, siga as etapas fornecidas abaixo. Consulte as respectivas capturas de tela para uma melhor compreensão -

Passo 1

Abra seu Visual Studio e siga as etapas para criar um novo projeto. Clique emFile -> New -> Project.

Passo 2

Agora, a seguinte tela é exibida onde você seleciona AWS Lambda for Visual C#. SelecioneAWS Lambda Project (.NET Core).

Você pode alterar o nome se necessário, manterá aqui o nome padrão. CliqueOK continuar.

A próxima etapa solicitará que você selecione um Blueprint.

Selecione Empty function para este exemplo e clique em Finish. Ele criará uma nova estrutura de projeto conforme mostrado abaixo -

Agora, selecione Function.cs que é o arquivo principal onde o manipulador com evento e contexto é criado para AWS Lambda.

A exibição do arquivo Functions.cs é a seguinte -

Você pode usar o comando fornecido a seguir para serializar os parâmetros de entrada e saída para a função AWS Lambda.

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

Detalhes do manipulador para C #

O manipulador é exibido da seguinte forma -

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

Vários componentes do código acima são explicados abaixo -

FunctionHandler −Este é o ponto de partida da função C # AWS Lambda.

String input − Os parâmetros para o manipulador string input tem todos os dados do evento, como objeto S3, detalhes do gateway API etc.

ILambdaContext context −ILamdaContext é uma interface que contém detalhes de contexto. Tem detalhes como nome da função lambda, detalhes de memória, detalhes de tempo limite etc.

O manipulador Lambda pode ser chamado de forma sincronizada e assíncrona. Se chamado de forma sincronizada, conforme mostrado acima, você pode ter o tipo de retorno. Se assíncrono, o tipo de retorno deve ser nulo.

Agora, vamos implantar o AWS Lambda C # e testar o mesmo. Clique com o botão direito no projeto e clique emPublish to AWS Lambda como mostrado abaixo -

Encha o Function Name e clique em Next. A próxima tela exibida é aAdvanced Function Details como mostrado -

Introduzir o Role Name, Memory e Timeout. detalhes Observe que aqui nós selecionamos a função existente criada e usamos a memória como 128 MB e o tempo limite como 10 segundos. Quando terminar, cliqueUpload para publicar no console AWS Lambda.

Você pode ver a tela a seguir assim que a função AWS Lambda for carregada. CliqueInvokepara executar a função AWS Lambda criada. No momento, ele mostra erro, pois precisa de alguma entrada de acordo com o código escrito.

Agora, vamos inserir alguns exemplos de entrada e Invokeisso de novo. Observe que aqui inserimos algum texto na caixa de entrada e o mesmo clicando eminvokeé exibido em maiúsculas na seção de resposta. A saída do log é exibida abaixo -

Agora, vamos também verificar o console da AWS para ver se a função foi criada conforme implementamos a função do Visual Studio.

A função Lambda criada acima é aws lambda using csharp e o mesmo é exibido no console da AWS, conforme mostrado nas capturas de tela fornecidas abaixo -

Assinatura do manipulador

Handler é o ponto de partida para a execução do AWS. O nome do manipulador deve ser definido como -

ASSEMBLY::TYPE::METHOD

Os detalhes da assinatura são explicados a seguir -

ASSEMBLY- Este é o nome do assembly .NET para o aplicativo criado. É basicamente o nome da pasta de onde o projeto é criado.

TYPE- Este é o nome do manipulador. É basicamente o namespace.classname.

METHOD - Este é o nome do manipulador de função.

O código para assinatura do manipulador é mostrado abaixo -

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();
      }
   }
}

Observe que aqui a montagem é AWSLamda3, O tipo é namespace.classname que é AWSLambda3.Function e o método é FunctionHandler. Assim, a assinatura do manipulador éAWSLamda3::AWSLambda3.Function::FunctionHandler

Objeto de contexto em C #

Objeto de contexto fornece informações úteis sobre o tempo de execução no ambiente AWS. As propriedades disponíveis no objeto de contexto são mostradas na tabela a seguir -

Sr. Não Propriedades e descrição
1

MemoryLimitInMB

Isso fornecerá detalhes da memória configurada para a função AWS Lambda

2

FunctionName

Nome da função AWS Lambda

3

FunctionVersion

Versão da função AWS Lambda

4

InvokedFunctionArn

ARN usado para invocar esta função.

5

AwsRequestId

AWS request id para a função AWS criada

6

LogStreamName

Nome do fluxo de registro do Cloudwatch

7

LogGroupName

Nome do grupo Cloudwatch

8

ClientContext

Informações sobre o aplicativo cliente e dispositivo quando usado com AWS Mobile SDK

9

Identity

Informações sobre a identidade amazon cogbnito quando usada com o SDK móvel AWS

10

RemainingTime

Tempo de execução restante até a função ser encerrada

11

Logger

O registrador associado ao contexto

Exemplo

Nesta seção, vamos testar algumas das propriedades acima no AWS Lambda em C #. Observe o código de amostra fornecido abaixo -

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");            
      }
   }
}

A saída relacionada que você pode observar quando invoca o código acima em C# é como mostrado abaixo -

A saída relacionada que você pode observar quando invoca o código acima em AWS Console é como mostrado abaixo -

Log usando C #

Para registro, você pode usar duas funções -

  • context.Logger.Log

  • LambdaLogger.Log

Observe o seguinte exemplo mostrado aqui -

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");            
}

A saída correspondente para o código fornecido acima é mostrada aqui -

Você pode obter os logs do CloudWatch conforme mostrado abaixo -

Tratamento de erros em C # para função Lambda

Esta seção discute sobre o tratamento de erros em C #. Para tratamento de erros,Exception a classe deve ser estendida conforme mostrado no exemplo mostrado abaixo -

exemplo

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!");
     }
   }
}

A saída correspondente para o código fornecido acima é a seguinte -

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