Building AWS Lambda Functions with .NET 6

Somebody who likes to code
Search for a command to run...

Somebody who likes to code
No comments yet. Be the first to comment.
In a previous post, we reviewed how to build AWS Lambda Functions with .NET 6. In today's post, we will see how to deploy them using Terraform. Before starting, we need to fulfill a few pre-requisites: Have a IAM User with programmatic access. Setup...
Google processes tens of thousands of code changes every day across a codebase of hundreds of millions of lines. The secret isn't magic tooling — it's a documented, principled approach to code review

Amazon Simple Notification Service (SNS) looks straightforward on the surface — publish a message, deliver it to subscribers — but the gap between a topic that "works in dev" and one that is productio

Amazon Simple Queue Service (SQS) is deceptively simple to get started with, but surprisingly easy to misconfigure in ways that cause silent message loss, runaway costs, duplicate processing storms, o

HTTP API is the right default choice for the majority of .NET serverless workloads. At 70% less cost than REST API, lower latency, and native JWT authorization, it covers most production requirements

AWS Lambda has become a cornerstone of modern serverless architectures, but writing a function that "just works" is very different from writing one that is performant, cost-effective, secure, and read

Serverless computing has gained popularity in the last few years primarily because it allows a true platform-as-a-service environment, letting developers focus on coding rather than back-end operations. Under this context, AWS Lambda is one of the best alternatives to start using this hosting model for our .NET 6 applications.
Install the Amazon Lambda Templates:
dotnet new -i Amazon.Lambda.Templates
Now we can see the list of AWS Lambda Templates installed running this command dotnet new --list --tag lambda:
Template Name Short Name Language Tags
---------------------------------------------------- -------------------------------------------- -------- ---------------------
Empty Top-level Function lambda.EmptyTopLevelFunction [C#] AWS/Lambda/Serverless
Lambda Annotations Framework (Preview) serverless.Annotations [C#] AWS/Lambda/Serverless
Lambda ASP.NET Core Minimal API serverless.AspNetCoreMinimalAPI [C#] AWS/Lambda/Serverless
Lambda ASP.NET Core Web API serverless.AspNetCoreWebAPI [C#],F# AWS/Lambda/Serverless
Lambda ASP.NET Core Web API (.NET 6 Container Image) serverless.image.AspNetCoreWebAPI [C#],F# AWS/Lambda/Serverless
Lambda ASP.NET Core Web Application with Razor Pages serverless.AspNetCoreWebApp [C#] AWS/Lambda/Serverless
Lambda Custom Runtime Function (.NET 6) lambda.CustomRuntimeFunction [C#],F# AWS/Lambda/Function
Lambda Detect Image Labels lambda.DetectImageLabels [C#],F# AWS/Lambda/Function
Lambda Empty Function lambda.EmptyFunction [C#],F# AWS/Lambda/Function
Lambda Empty Function (.NET 6 Container Image) lambda.image.EmptyFunction [C#],F# AWS/Lambda/Function
Lambda Empty Serverless serverless.EmptyServerless [C#],F# AWS/Lambda/Serverless
Lambda Empty Serverless (.NET 6 Container Image) serverless.image.EmptyServerless [C#],F# AWS/Lambda/Serverless
Lambda Giraffe Web App serverless.Giraffe F# AWS/Lambda/Serverless
Lambda Simple Application Load Balancer Function lambda.SimpleApplicationLoadBalancerFunction [C#] AWS/Lambda/Function
Lambda Simple DynamoDB Function lambda.DynamoDB [C#],F# AWS/Lambda/Function
Lambda Simple Kinesis Firehose Function lambda.KinesisFirehose [C#] AWS/Lambda/Function
Lambda Simple Kinesis Function lambda.Kinesis [C#],F# AWS/Lambda/Function
Lambda Simple S3 Function lambda.S3 [C#],F# AWS/Lambda/Function
Lambda Simple SNS Function lambda.SNS [C#] AWS/Lambda/Function
Lambda Simple SQS Function lambda.SQS [C#] AWS/Lambda/Function
Lex Book Trip Sample lambda.LexBookTripSample [C#] AWS/Lambda/Function
Order Flowers Chatbot Tutorial lambda.OrderFlowersChatbot [C#] AWS/Lambda/Function
Serverless Detect Image Labels serverless.DetectImageLabels [C#],F# AWS/Lambda/Serverless
Serverless Simple S3 Function serverless.S3 [C#],F# AWS/Lambda/Serverless
Serverless WebSocket API serverless.WebSocketAPI [C#] AWS/Lambda/Serverless
Step Functions Hello World serverless.StepFunctionsHelloWorld [C#],F# AWS/Lambda/Serverless
We can install the AWS Toolkit for Visual Studio to have the same templates installed.
Install the Amazon Lambda Tools:
dotnet tool install -g Amazon.Lambda.Tools
Run the following commands to create the project and solution:
dotnet new lambda.EmptyFunction -n SimpleHTTPAPI -o .
dotnet new sln -n aws-lambda-sandbox
dotnet sln add --in-root src/SimpleHTTPAPI
Open the solution in your Visual Studio and add the following Nuget package to the project:
Modify the Function.cs file as follows:
using Amazon.Lambda.APIGatewayEvents;
using Amazon.Lambda.Core;
using System.Net;
using System.Text.Json;
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
namespace SimpleHTTPAPI;
public class Function
{
public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
{
context.Logger.LogInformation("Request: " + JsonSerializer.Serialize(request));
var response = new APIGatewayProxyResponse
{
StatusCode = (int)HttpStatusCode.OK,
Body = "Hello World",
Headers = new Dictionary<string, string> { { "Content-Type", "text/plain" } }
};
return response;
}
}
Edit the original 'aws-lambda-tools-defaults.json' file to have:
{
"Information": [
"This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.",
"To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.",
"dotnet lambda help",
"All the command line options for the Lambda command can be specified in this file."
],
"profile": "[profile]",
"region": "[region]",
"configuration": "Release",
"function-runtime": "dotnet6",
"function-memory-size": 256,
"function-timeout": 30,
"function-handler": "SimpleHTTPAPI::SimpleHTTPAPI.Function::FunctionHandler",
"function-url-enable": true,
"function-name": "SimpleHTTPAPI"
}
us-east-2.default and was defined at the moment to set up your AWS CLI.At this point, we can test the application using the Mock Lambda Test Tool profile included in the project.
Time to deploy, run the following command:
dotnet lambda deploy-function --project-location src/SimpleHTTPAPI
You will be asked which IAM role you want to use, select the *** Create new IAM Role *** option, and enter a name for the IAM Role. Finally, you will be asked what permissions to grant, select AWSLambdaBasicExecutionRole. And that's it, your Lambda is up and running in AWS:

Open the Function URL to see the response of the endpoint.
Now let's see how easy it is to deploy an ASP.NET Core Web API:
dotnet new webapi -n ASPNETCoreWebAPI
dotnet sln add ASPNETCoreWebAPI
Add the following Nuget package:
Modify the Program.cs file as follows:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddAWSLambdaHosting(LambdaEventSource.HttpApi);
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
And add the aws-lambda-tools-defaults.json file with the following content:
{
"Information": [
"This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.",
"To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.",
"dotnet lambda help",
"All the command line options for the Lambda command can be specified in this file."
],
"profile": "[profile]",
"region": "[region]",
"configuration": "Release",
"function-runtime": "dotnet6",
"function-memory-size": 256,
"function-timeout": 30,
"function-handler": "ASPNETCoreWebAPI",
"function-url-enable": true
}
Run the command to start the deployment and follow the steps of the previous example to complete it:
dotnet lambda deploy-function --project-location ASPNETCoreWebAPI

Open the Function URL to see the Swagger page of the API:
All the code is available here. Thanks and happy coding.