使用 AWS Lambda 和 C# 编写无服务器函数






4.13/5 (8投票s)
使用 AWS Lambda 和 C# 编写无服务器函数
什么是无服务器框架?
无服务器框架指的是构建无状态函数,这些函数不依赖于底层操作系统或硬件资源。它让开发者能够专注于构建无状态函数,而无需担心如何配置和扩展资源。
无服务器函数是无状态的、事件驱动的,并在容器中执行。使用无服务器函数,您按照“按需付费”模式(PAYG)收费,也就是说,您无需为闲置资源付费。您只需为代码执行的每次请求付费。
何时使用无服务器框架
在您希望降低运营成本、部署复杂性、利用自动扩展的优势以及缩短产品上市时间的情况下,无服务器函数非常有用。
例如
- 您想构建一个微服务,该服务将在收到请求时生成使用情况报告。
- 您想在特定事件(例如记录插入到
Dynamo
DB 表中)触发后端/计算操作。 - 您想快速开发和部署一个文件处理服务。
有关更多场景,请参阅 AWS 文档。
AWS Lambda 和编程语言选项
目前用于构建无服务器函数的最流行选项之一是 AWS Lambda。AWS Lambda 于 2014 年推出,支持 Node.Js、Java 和 Python 编程语言。
去年 12 月,AWS 宣布支持使用 C# 编程语言在 .NET Core 1.0 运行时上开发 Lambda 函数。这使 .NET 开发者能够利用其 C# 技能来构建无服务器函数。
我将带您了解一个使用 AWS Lambda 和 C# 开发的简单事件注册函数。但在开始之前,让我们先了解 AWS Lambda 的编程模型概念。
函数处理程序:函数处理程序是启动 Lambda 函数执行的入口点。它将输入数据作为第一个参数,将 Lambda 上下文作为第二个参数。如果您有长时间运行的计算任务,可以利用异步 Lambda 函数。有关更多详细信息,请参阅 AWS Lambda 开发人员指南。
上下文对象:上下文对象作为第二个参数传递给处理程序。上下文对象提供了有关 AWS Lambda 运行时的有用信息。这可以在函数内用于控制 AWS 函数的执行。
日志记录:设计良好的函数应具有适当的日志记录机制。AWS Lambda 将所有日志写入 Cloud Watch,如果需要,可用于分析/故障排除。有三种方法可以在 AWS 函数中编写日志:
- 使用
Console.write
或Console.writeline
方法 - 使用
Amazon.Lambda.Core.LambdaLogger
类的Log
方法 - 使用
Context.Logger.Log
方法
异常:在发生未处理的错误时,异常会作为 Payload 返回并记录到 CloudWatch。您可以查看 CloudWatch 中函数记录的异常。
开始吧
步骤 1
安装 Visual Studio 的 AWS Toolkit。您可以在 https://aws.amazon.com/visualstudio/ 找到 Visual Studio 的 AWS Toolkit。
第二步
创建新的 AWS Lambda 项目(.NET Core)并选择“空函数”蓝图。它将创建项目并在 Function.cs 中包含 FunctionHandler
。
步骤 3
使用 Nuget 包管理器或编辑 Project.JSON 文件安装 AWSSDK.DynamoDBV2
和 AWSSDK.Lambda
。
{
"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
和 service URL。在开发 .NET 应用程序时,我们都会将连接字符串和其他可配置信息维护在配置文件中,这样就无需更改代码,并且可以将相同的代码指向开发、暂存或生产环境。
AWS Lambda 具有环境变量的概念。您可以在部署时在环境变量中设置所有可配置值,然后使用 System.Environment.GetEnviornmentVariable
方法访问这些变量。我花了些时间才弄清楚如何将可配置值传递给 C# Lambda 函数。最初,我认为 lambdaContext
会包含配置信息,但后来才发现可以通过 System.Environment
. GetEnviornmentVariable
方法访问环境变量。
public Function()
{
_accessKey = Environment.GetEnvironmentVariable("AccessKey");
_secretKey = Environment.GetEnvironmentVariable("SecretKey");
_serviceUrl = Environment.GetEnvironmentVariable("ServiceURL");
}
下面的代码是函数处理程序,它接受 Customer
POCO 对象(具有 Name
和 EmailId
成员)作为第一个参数,并将 Lambda 对象上下文作为第二个参数。之前,我解释了向 CloudWatch 记录的不同方法。我在下面的代码中使用了所有三种方法。
//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 dynamodbtable
LambdaLogger.Log("Insert record in the table");
await dynamoDbClient.PutItemAsync(TableName, new Dictionary<string, AttributeValue>
{
{ "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 函数。一种是使用 Visual Studio 的 AWS Toolkit,另一种是使用 AWS Console。在本演示中,我们将使用 AWS Toolkit。
在 **Solution Explorer** 中右键单击项目,然后单击 **Publish to AWS Lambda**。
确保您已正确输入程序集名称、类型名称和方法名称,否则将在运行时遇到 LambdaException
。
配置执行内存、超时、VPC、角色和环境变量。您还可以使用 KMS 密钥加密环境变量。确保账户配置文件具有适当的访问权限。
从函数视图窗口调用函数。它允许您配置环境变量并检查日志输出。您还可以在 CloudWatch Logs 中查看详细日志。
就是这样!第一个无服务器函数已部署。
参考
完整源代码
您可以在我的 GitHub 上找到完整的源代码。
历史
- 2017 年 2 月 25 日:初始版本