无服务器与AWS Lambda on C#简介
无服务器架构(无服务器计算)是一种开发模式,开发者只需专注于业务逻辑代码,而基础设施(服务器、扩展、监控)由云提供商管理。AWS Lambda是实现无服务器函数最流行的服务之一,并且对.NET生态系统有出色的支持。
在本文中,我们将介绍使用C#在AWS Lambda上工作的完整流程:从创建项目到部署和调试。您将学习如何配置环境、编写高效函数、处理事件以及避免常见错误。本材料面向希望掌握Amazon Web Services中无服务器方法的C#开发者。
1. 环境配置与创建第一个项目
工具安装
使用C#在AWS Lambda上工作,您需要:
- .NET SDK 6.0或8.0版本(推荐最新的LTS版本)。
- AWS CLI — 用于管理AWS服务的命令行界面。
- Amazon.Lambda.Templates — .NET CLI的模板集。
- Docker Desktop(可选) — 用于通过Lambda模拟器进行本地测试。
通过终端安装Lambda模板:
dotnet new -i Amazon.Lambda.Templates创建项目
使用以下命令创建一个新的Lambda函数:
dotnet new lambda.EmptyFunction -n MyFirstLambda -o ./MyFirstLambdacd MyFirstLambda项目结构包含一个Function.cs文件,其中包含基类Function和一个处理程序方法。默认情况下,使用一个接受字符串并返回字符串的简单函数模板。
打开Function.cs并按如下方式修改:
using Amazon.Lambda.Core;using Amazon.Lambda.Serialization.SystemTextJson;
[assembly: LambdaSerializer(typeof(DefaultLambdaJsonSerializer))]
public class Function{ public string FunctionHandler(string input, ILambdaContext context) { context.Logger.LogInformation($"收到输入: {input}"); return $"你好, {input}! 您的函数执行成功。"; }}本地测试
要本地运行函数,请使用dotnet lambda invoke工具或Docker中的Lambda Runtime Interface Emulator (RIE)。使用RIE的示例:
docker run --rm -v "$PWD/bin/Release/net8.0/publish":/var/task:ro,delegated \ -p 9000:8080 \ public.ecr.aws/lambda/dotnet8:latest \ MyFirstLambda::MyFirstLambda.Function::FunctionHandler通过curl发送测试请求:
curl -X POST "http://localhost:9000/2015-03-31/functions/function/invocations" \ -d '"世界"'2. 处理不同类型的事件
与API Gateway配合使用(HTTP请求)
Lambda最常用于通过Amazon API Gateway作为REST API的后端。在这种情况下,处理程序接收APIGatewayProxyRequest对象并返回APIGatewayProxyResponse。
安装NuGet包:
dotnet add package Amazon.Lambda.APIGatewayEventsHTTP POST请求处理函数示例:
using Amazon.Lambda.APIGatewayEvents;using System.Text.Json;
public class Function{ public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) { context.Logger.LogInformation($"收到请求: {request.HttpMethod} {request.Path}");
// 解析请求体 var body = JsonSerializer.Deserialize<Dictionary<string, string>>(request.Body); var name = body?.GetValueOrDefault("name") ?? "访客";
//