Handling HTTP Requests with .NET 7 Native AOT on AWS Lambda

Want to talk with other .NET on AWS developers, ask questions, and share what you know? Join us on Slack!

If you have tried out native AOT with .NET 7, you will probably have seen the Microsoft documentation page that states - “it is currently not supported with ASP.NET Core, but only console apps”. So no Web API for now!

But, there are a couple of ways to create .NET 7 native AOT applications that handle HTTP requests from anywhere in the world with the AWS Lambda service. Even though you are not using a familiar controller or endpoint, you can achieve the same result.

In this post, I’ll show the simplest approach that uses an out-of-the-box template, and in a later post, I will show how to use Function URLs with native AOT Lambda functions.

If you want to find out more about .NET native AOT with Lambda functions, check out my previous post where I compared Lambda cold start times for the .NET 6 managed runtime, with the native AOT .NET 7 custom runtime. .NET 7 with native AOT had significantly faster cold start times.

Get the tools

Install or update the latest tooling, this lets you deploy, and run Lambda functions.

dotnet tool install -g Amazon.Lambda.Tools
dotnet tool update -g Amazon.Lambda.Tools

Install or update the latest Lambda function templates.

dotnet new --install Amazon.Lambda.Templates

Install .NET 7.

Install and run Docker Desktop.

Create the S3 bucket

The deployment tool needs an S3 bucket to store its template. Follow the instructions here to create an S3 bucket.

Create a new project

From the command line run -

dotnet new serverless.NativeAOT -n ServerlessNativeAOT

Change to the ServerlessNativeAOT/src/ServerlessNativeAOT directory and open up that project in your favorite IDE.

The project you just created contains two function handlers, one for the GET verb and one for the PUT verb.

Open the Functions.cs file, it contains the code that will be executed when the GET and PUT requests invoke the Lambda functions.

The code for each is very simple, and you don’t need to change anything.

Deploy the Lambda function

From the command line run -

dotnet lambda deploy-serverless --stack-name ServerlessNativeAOT --s3-bucket YOUR-BUCKET-NAME

This will build and deploy the application. It will take a while, especially the first time you run it as it downloads the Docker image to perform the build in.

Once it deploys, you will see a message like this -

Output Name                    Value
------------------------------ --------------------------------------------------
ApiURL                         https://xxxxxxxx.execute-api.us-east-1.amazonaws.com/Prod/

Testing it out

To exercise the GET function, open a browser and navigate to the ApiURL value from the previous step.

To exercise the PUT function, use a tool like Fiddler, Postman, Rest Client, etc to send a PUT request to the ApiURL value from the previous step.

Here is an example of a PUT request you can use with Rest Client for VS Code -

PUT https://xxxxxxxx.execute-api.us-east-1.amazonaws.com/Prod/ HTTP/1.1
content-type: application/json

comments powered by Disqus