AWS Lambda – C# 函数



本章将详细解释如何在 C# 中使用 AWS Lambda 函数。在这里,我们将使用 Visual Studio 来编写代码并将其部署到 AWS Lambda。有关安装 Visual Studio 和向 Visual Studio 添加 AWS 工具包的任何信息和帮助,请参阅本教程中的**简介**章节。完成 Visual Studio 的安装后,请按照以下步骤操作。请参考相应的屏幕截图以便更好地理解:

步骤 1

打开 Visual Studio 并按照步骤创建新项目。点击**文件 -> 新建 -> 项目**。

Introduction

步骤 2

现在,将显示以下屏幕,您可以在其中选择**用于 Visual C# 的 AWS Lambda**。选择**AWS Lambda 项目 (.NET Core)**。

Visual Csharp

如果需要,您可以更改名称,这里将保留默认名称。单击**确定**继续。

下一步将要求您选择一个**蓝图**。

Select Blueprint

在此示例中选择**空函数**,然后单击**完成**。它将创建一个新的项目结构,如下所示:

Solution Explorer

现在,选择**Function.cs**,这是创建 AWS Lambda 的事件和上下文的处理程序的主要文件。

Functions.cs 文件的显示如下:

Csharp Function

您可以使用以下命令将输入和输出参数序列化到 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 函数名称、内存详细信息、超时详细信息等详细信息。

Lambda 处理程序可以同步和异步方式调用。如果像上面那样以同步方式调用,则可以具有返回类型。如果是异步的,则返回类型必须是 void。

现在,让我们部署 AWS Lambda C# 并测试它。右键单击项目并单击**发布到 AWS Lambda**,如下所示:

Publish Explorer

Upload Lambda

填写**函数名称**并单击**下一步**。下一个显示的屏幕是**高级函数详细信息**,如下所示:

Advanced Function

输入**角色名称、内存**和**超时**详细信息。请注意,这里我们选择了已创建的现有角色,并使用了 128MB 内存和 10 秒超时。完成后,单击**上传**以发布到 AWS Lambda 控制台。

Uploading Function

上传 AWS Lambda 函数后,您将看到以下屏幕。单击**调用**以执行创建的 AWS Lambda 函数。目前,它显示错误,因为它需要根据编写的代码输入一些内容。

Invoke

现在,让我们输入一些示例输入并再次**调用**它。请注意,我们在这里在输入框中输入了一些文本,并且在单击**调用**后,响应部分中以大写形式显示了相同的文本。日志输出显示如下:

Function Lambda

现在,让我们也检查 AWS 控制台,看看是否创建了函数,因为我们是从 Visual Studio 部署的函数。

上面创建的 Lambda 函数是**使用 csharp 的 aws lambda**,在 AWS 控制台中显示如下面的屏幕截图所示:

Create Function Csharp

Function Code Info Execution Role Csharp

Basic Setting Csharp

处理程序签名

处理程序是 AWS 执行的起点。处理程序的名称应定义为:

ASSEMBLY::TYPE::METHOD

签名的详细信息解释如下:

**程序集 –** 这是为创建的应用程序创建的 .NET 程序集的名称。它基本上是创建项目的文件夹的名称。

**类型 –** 这是处理程序的名称。它基本上是命名空间.类名。

**方法 –** 这是函数处理程序的名称。

处理程序签名的代码如下所示:

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**,类型是命名空间.类名,即**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 请求 ID

6

LogStreamName

Cloudwatch 日志流名称

7

LogGroupName

Cloudwatch 组名称

8

ClientContext

与 AWS 移动 SDK 一起使用时,有关客户端应用程序和设备的信息

9

Identity

与 AWS 移动 SDK 一起使用时,有关 amazon cogbnito 身份的信息

10

RemainingTime

函数终止之前的剩余执行时间

11

Logger

与上下文关联的记录器

示例

在本节中,让我们在 C# 中的 AWS Lambda 中测试上述一些属性。观察下面给出的示例代码:

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#**中调用上述代码时,您可以观察到的相关输出如下所示:

Context Object Csharp

当您在**AWS 控制台**中调用上述代码时,您可以观察到的相关输出如下所示:

Context Object Output

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

上面给出的代码的相应输出显示在此处:

Logging Using Csharp

您可以从 CloudWatch 获取日志,如下所示:

Log Group

C# 中 Lambda 函数的错误处理

本节讨论 C# 中的错误处理。对于错误处理,必须扩展**Exception** 类,如下面的示例所示:

示例

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!"
}
广告