基于C#的AWS Lambda无服务器函数:从A到Z完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

无服务器与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.APIGatewayEvents


HTTP 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") ?? "访客";

//

博客

书籍推荐