AWS Lambda – C# 中的函数
本章将详细介绍如何在 C# 中使用 AWS Lambda 函数。在这里,我们将使用 Visual Studio 编写代码并将其部署到 AWS Lambda。有关安装 Visual Studio 和将 AWS 工具包添加到 Visual Studio 的任何信息和帮助,请参阅本教程中的简介一章。完成 Visual Studio 的安装后,请按照以下步骤操作。请参阅相应的屏幕截图以更好地理解 −
步骤 1
打开 Visual Studio 并按照步骤创建新项目。单击文件 -> 新建 ->项目。

步骤 2
现在,将显示以下屏幕,您可以在其中选择 AWS Lambda for Visual C#。选择 AWS Lambda 项目 (.NET Core)。

您可以根据需要更改名称,此处将保留默认名称。单击确定继续。
下一步将要求您选择蓝图。

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

现在,选择 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 函数的起点。
字符串输入 −处理程序 字符串输入 的参数包含所有事件数据,例如 S3 对象、API 网关详细信息等。
ILambdaContext 上下文 − ILamdaContext 是一个具有上下文详细信息的接口。它包含 lambda 函数名称、内存详细信息、超时详细信息等详细信息。
Lambda 处理程序可以同步和异步方式调用。如果以同步方式调用(如上所示),则可以获得返回类型。如果是异步,则返回类型必须为 void。
现在,让我们部署 AWS Lambda C# 并进行测试。右键单击项目,然后单击发布到 AWS Lambda,如下所示 −


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

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

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

现在,让我们输入一些示例输入并再次 Invoke。请注意,我们在这里已在输入框中输入了一些文本,单击 invoke 时,相同的文本将以大写显示在响应部分中。日志输出显示在下方 −

现在,让我们检查 AWS 控制台以查看是否已创建该函数,因为我们已经从 Visual Studio 部署了该函数。
上面创建的 Lambda 函数是 使用 csharp 的 aws lambda,并且它在 AWS 控制台中显示如下屏幕截图所示 −




处理程序签名
处理程序是 AWS 执行的起点。处理程序的名称应定义为 −
ASSEMBLY::TYPE::METHOD
签名的详细信息解释如下 −
ASSEMBLY − 这是为创建的应用程序创建的 .NET 程序集的名称。它基本上是创建项目的文件夹的名称。
TYPE − 这是处理程序的名称。它基本上是命名空间.classname。
METHOD −这是函数处理程序的名称。
处理程序签名的代码如下所示。 −
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Amazon.Lambda.Core; // Assembly 属性使 Lambda 函数的 JSON 输入能够转换为 .NET 类。 [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# 中的 Context 对象
Context 对象提供有关 AWS 环境中运行时的有用信息。上下文对象中可用的属性如下表所示 −
Sr.No | 属性 &描述 |
---|---|
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 属性使 Lambda 函数的 JSON 输入能够转换为 .NET 类。 [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+""); context.Logger.Log("RemainingTime: " + context.RemainingTime+""); LambdaLogger.Log("LogGroupName: " + context.LogGroupName+""); } } }
在 C# 中调用上述代码时,您可以观察到的相关输出如下所示 −

在 AWS Console 中调用上述代码时,您可以观察到的相关输出如下所示 −

使用 C# 进行日志记录
对于日志记录,您可以使用两个函数 −
context.Logger.Log
LambdaLogger.Log
观察以下示例显示在这里 −
public void FunctionHandler(ILambdaContext context) { LambdaLogger.Log("函数名称:" + context.FunctionName+""); context.Logger.Log("剩余时间:" + context.RemainingTime+""); LambdaLogger.Log("LogGroupName:" + context.LogGroupName+""); }
上面给出的代码的相应输出显示在此处 −

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

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