无服务器计算:AWS Lambda与C#入门指南

无服务器计算是一种云计算模型,它允许开发者构建和运行应用程序和服务,而无需管理服务器。开发者可以专注于编写代码,而无需担心底层的操作系统或硬件资源。无服务器计算的特点是函数是无状态的、事件驱动的,并且在容器中执行。使用无服务器函数,只需按需付费,即按请求次数付费,无需为闲置资源付费。

无服务器函数在以下场景中非常有用:当想要降低运营成本、简化部署复杂性、利用自动扩展的好处、快速上市时。例如,可能想要构建一个微服务来生成使用报告;可能想要在特定事件发生时触发后端/计算操作,如在DynamoDB表中插入记录;可能想要快速开发和部署一个文件处理服务。更多场景请参考AWS文档。

AWS Lambda是构建无服务器函数的流行选项之一。AWS Lambda于2014年推出,最初支持Node.js、Java和Python编程语言。2016年12月,AWS宣布支持使用.NET Core 1.0运行时的C#编程语言开发Lambda函数。这使得.NET开发者可以利用他们的C#技能构建无服务器函数。

本文将引导通过一个简单的事件注册函数,使用AWS Lambda和C#开发。但在开始之前,让先了解AWS Lambda的编程模型概念。

函数处理器(Function Handler)

函数处理器是启动Lambda函数执行的入口点。它接受输入数据作为第一个参数,Lambda上下文作为第二个参数。如果有长时间运行的计算任务,可以利用异步Lambda函数。更多细节请参考AWS Lambda开发者指南。

上下文对象(Context Object)

上下文对象作为第二个参数传递给处理器。上下文对象提供了有关AWS Lambda运行时的有用信息。这可以在函数内部使用,以控制AWS函数的执行。

日志记录(Logging)

一个设计良好的函数应该有适当的日志记录机制。AWS Lambda将所有日志写入CloudWatch,如果需要,可以用于分析/故障排除。在AWS函数中写日志有三种方式:

  • 使用Console.WriteLine或Console.WriteLine方法
  • 使用Amazon.Lambda.Core.LambdaLogger类的Log方法
  • 使用Context.Logger.Log方法

异常(Exceptions)

如果发生未处理的错误,异常将发送回有效载荷并记录到CloudWatch。可以在CloudWatch中查看函数记录的异常。

开始动手

步骤1:安装AWS Toolkit for Visual Studio。可以在找到AWS Toolkit for Visual Studio。

步骤2:创建新的AWS Lambda项目(.NET Core)并选择空函数蓝图。它将创建项目并在Function.cs中包含FunctionHandler。

步骤3:使用Nuget包管理器或编辑Project.JSON文件安装AWSSDK.DynamoDBV2和AWSSDK.Lambda。

JavaScript { "title": "Title", "description": "Description", "version": "1.0.0-*", "buildOptions": {}, "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0" }, "Microsoft.Extensions.Configuration.Json": "1.1.0", "Amazon.Lambda.Core": "1.0.0*", "Amazon.Lambda.Serialization.Json": "1.0.1", "Amazon.Lambda.Tools": { "type": "build", "version": "1.2.1-preview1" }, "AWSSDK.DynamoDBv2": "3.3.2.1", "AWSSDK.Lambda": "3.3.2.6" }, "tools": { "Amazon.Lambda.Tools": "1.2.1-preview1" }, "frameworks": { "netcoreapp1.0": { "imports": "dnxcore50" } } }

观察以下由空函数模板创建的Assembly属性。它基本上是自解释的。它基本上是必需的,以序列化Lambda函数的输入/输出参数:

步骤4:在FunctionHandler中编写逻辑(即Lambda函数的入口点)。

在以下示例中,创建了一个注册表在DynamoDB中,如果它不存在。然后,插入记录。基本上,在对Lambda函数的第一次请求中,将在插入记录之前创建一个表,而在每次后续请求中,记录将被插入到表中。(在现实世界的场景中,可能已经有一个表。)

为了建立与DynamoDB的连接,需要指定accessKey、secretKey和服务URL。在开发.NET应用程序时,所有人都在配置文件中维护连接字符串和其他可配置信息,以便不必更改代码,可以指向相同的代码到开发、暂存或生产环境。

AWS Lambda有环境变量的概念。可以在部署时将所有可配置值设置在环境变量中,然后使用System.Environment.GetEnvironmentVariable方法访问这些变量。花了一段时间才弄清楚如何将可配置值传递给C# Lambda函数。最初,以为lambdaContext将持有配置信息,但后来发现环境变量可以通过System.Environment访问。

C# public Function() { _accessKey = Environment.GetEnvironmentVariable("AccessKey"); _secretKey = Environment.GetEnvironmentVariable("SecretKey"); _serviceUrl = Environment.GetEnvironmentVariable("ServiceURL"); }

以下代码是函数处理器,接受Customer POCO对象(具有Name和EmailId成员)作为第一个参数,Lambda对象上下文作为第二个参数。前面解释了不同的日志记录到云监视的方法。在以下代码中使用了所有三种方法:

C# // Function Handler is an entry point to start execution of Lambda Function. // It takes Input Data as First Parameter and ObjectContext as Second public async Task FunctionHandler(Customer customer, ILambdaContext context) { // Write Log to Cloud Watch using Console.WriteLine. Console.WriteLine("Execution started for function - {0} at {1}", context.FunctionName , DateTime.Now); // Create dynamodb client var dynamoDbClient = new AmazonDynamoDBClient(new BasicAWSCredentials(_accessKey, _secretKey), new AmazonDynamoDBConfig { ServiceURL = _serviceUrl, RegionEndpoint = RegionEndpoint.APSoutheast2}); // Create Table if it does not exist await CreateTable(dynamoDbClient, TableName); // Insert record in dynamodb table LambdaLogger.Log("Insert record in the table"); await dynamoDbClient.PutItemAsync(TableName, new Dictionary { { "Name", new AttributeValue(customer.Name) }, { "EmailId", new AttributeValue(customer.EmailId) }, }); // Write Log to cloud watch using context.Logger.Log Method context.Logger.Log(string.Format("Finished execution for function -- {0} at {1}", context.FunctionName, DateTime.Now)); }

步骤5:将代码部署到AWS Lambda服务。

有三种不同的方法可以将C# Lambda函数部署到AWS Lambda服务。一种是使用AWS Toolkit for Visual Studio,另一种是使用AWS控制台。为了演示的目的,将使用AWS Toolkit。

在解决方案资源管理器中右键单击项目,然后单击“发布到AWS Lambda”。

确保正确输入了程序集名称、类型名称和方法名称,否则将在运行时获得LambdaException。

配置执行内存、超时、VPC、角色和环境变量。也可以使用KMS密钥加密环境变量。确保帐户配置文件具有适当的访问权限。

从函数视图窗口调用函数。它允许配置环境变量并检查日志输出。也可以在云监视日志中查看详细的日志。

就是这样!第一个无服务器函数已经部署。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485