无服务器计算是一种云计算模型,它允许开发者构建和运行应用程序和服务,而无需管理服务器。开发者可以专注于编写代码,而无需担心底层的操作系统或硬件资源。无服务器计算的特点是函数是无状态的、事件驱动的,并且在容器中执行。使用无服务器函数,只需按需付费,即按请求次数付费,无需为闲置资源付费。
无服务器函数在以下场景中非常有用:当想要降低运营成本、简化部署复杂性、利用自动扩展的好处、快速上市时。例如,可能想要构建一个微服务来生成使用报告;可能想要在特定事件发生时触发后端/计算操作,如在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的编程模型概念。
函数处理器是启动Lambda函数执行的入口点。它接受输入数据作为第一个参数,Lambda上下文作为第二个参数。如果有长时间运行的计算任务,可以利用异步Lambda函数。更多细节请参考AWS Lambda开发者指南。
上下文对象作为第二个参数传递给处理器。上下文对象提供了有关AWS Lambda运行时的有用信息。这可以在函数内部使用,以控制AWS函数的执行。
一个设计良好的函数应该有适当的日志记录机制。AWS Lambda将所有日志写入CloudWatch,如果需要,可以用于分析/故障排除。在AWS函数中写日志有三种方式:
如果发生未处理的错误,异常将发送回有效载荷并记录到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密钥加密环境变量。确保帐户配置文件具有适当的访问权限。
从函数视图窗口调用函数。它允许配置环境变量并检查日志输出。也可以在云监视日志中查看详细的日志。
就是这样!第一个无服务器函数已经部署。