Deploying a .NET Lambda Function Using Terraform

Connor Stokes
3 min readMay 19, 2024

--

.NET

In the world of serverless computing, AWS Lambda has emerged as a powerful tool for executing code without the need to provision or manage servers. When combined with API Gateway, Lambda enables developers to build scalable and cost-effective APIs for their applications. In this blog post, we’ll explore how to get started deploying a .NET Lambda function using API Gateway via Terraform.

What is Terraform?

Terraform is an open-source infrastructure as code (IaC) tool created by HashiCorp. It allows you to define and provision infrastructure resources using a declarative configuration language. With Terraform, you can manage resources such as virtual machines, databases, and AWS Lambda functions in a version-controlled and reproducible manner.

Prerequisites

Before getting started, make sure you have the following prerequisites installed:

  1. AWS CLI: To interact with AWS services from the command line.
  2. Terraform: Download and install Terraform from the official website.
  3. .NET Core SDK: Install the .NET Core SDK for building .NET Lambda functions.

You can also install Amazon.Lambda.Tools which provide some useful templates and tools.

Step 1: Set Up Your AWS Credentials

Ensure that you have configured your AWS credentials either by setting environment variables or using the AWS CLI aws configure command.

Step 2: Create a .NET Lambda Function

Create a new directory for your project and navigate into it. Then, use the .NET CLI to create a new Lambda function:

dotnet new lambda.EmptyFunction -n LambdaFunctionAPI

This command creates a new .NET Lambda function project named LambdaFunctionAPI.

Step 3: Write Your Lambda Function Code

Navigate into the newly created project directory and open the Function.cs file. This file contains the handler method that will be executed when your Lambda function is invoked. Write your .NET code here, for example:

using Amazon.Lambda.Core;

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace LambdaFunctionAPI
{
public class Function
{
public string FunctionHandler(string input, ILambdaContext context)
{
return "Hello from Lambda!";
}
}
}

Step 4: Configure Your Terraform Infrastructure

Create a new directory named terraform in your project directory. Inside this directory, create a file named main.tf and add the following Terraform configuration:

provider "aws" {
region = "us-east-1"
}

terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}

data "aws_iam_policy_document" "lambda_assume_role_policy" {
statement {
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["lambda.amazonaws.com"]
}
}
}

resource "aws_iam_role" "lambda_role" {
name = "lambda-role"
assume_role_policy = data.aws_iam_policy_document.lambda_assume_role_policy.json
}

resource "aws_iam_policy_attachment" "lambda_attachment" {
name = "lambda-policy-attachment"
roles = [aws_iam_role.lambda_role.name]
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}

resource "aws_lambda_function" "my_lambda_function" {
filename = "deployment.zip"
function_name = "MyDotNetLambdaFunction"
role = aws_iam_role.lambda_role.arn
handler = "LambdaFunctionAPI::LambdaFunctionAPI.Function::FunctionHandler"
runtime = "dotnet6"
}

This Terraform configuration will provision an AWS Lambda function along with the necessary IAM role.

Step 5: Deploy Your Lambda Function

Run the following commands in your terminal to deploy your Lambda function using Terraform:

dotnet publish -c Release
cd terraform
terraform init
terraform apply

Step 6: Integrate Lambda Function with API Gateway

To expose your Lambda function via API Gateway, you’ll need to add an API Gateway resource and method to your Terraform configuration. Additionally, you’ll need to define an API Gateway deployment and stage.

resource "aws_lambda_permission" "lambda_permission" {
statement_id = "AllowMyDemoAPIInvoke"
action = "lambda:InvokeFunction"
function_name = "MyDotNetLambdaFunction"
principal = "apigateway.amazonaws.com"

source_arn = "${aws_api_gateway_rest_api.MyDemoAPI.execution_arn}/*"
}

Step 7: Test Your API

Once your API Gateway is deployed, you can test your API by invoking its endpoint using tools like cURL or Postman.

Congratulations! You’ve successfully deployed a .NET Lambda function using API Gateway using Terraform. This setup provides a scalable and cost-effective solution for building APIs in the AWS cloud. Explore further by adding additional features such as request validation, authorisation, and monitoring to your API Gateway setup. Happy coding!

--

--