Terraform Code Generation

Benzene includes tools to automatically generate Terraform configuration for your AWS Lambda functions, ensuring that your infrastructure stays in sync with your code.

Setup

The Terraform generation logic is contained in the Benzene.CodeGen.Terraform package.

Usage

You can use the TerraformLambdaBuilder to generate .tf files based on your service settings.

var terraformBuilder = new TerraformLambdaBuilder();

var codeFiles = terraformBuilder.BuildCodeFiles(new TerraformLambdaSettings
{
    Name = "my-service-func",
    EntryPoint = "MyNamespace::MyNamespace.StartUp::FunctionHandlerAsync",
    Timeout = 30,
    MemorySize = 2048,
    Domain = "my-domain",
    SubDomain = "my-subdomain"
});

// codeFiles is an ICodeFile[] — each has a Name (e.g. "lambda.tf") and Lines (the file content)
foreach (var file in codeFiles)
{
    File.WriteAllLines(file.Name, file.Lines);
}

Generated Resources

The tool typically generates:

EventBridge Rules

If your Lambda consumes EventBridge events (see Getting Started with AWS), TerraformEventBridgeRuleBuilder generates the EventBridge-side wiring: one aws_cloudwatch_event_rule whose event_pattern matches the detail-type of every message topic the Lambda handles, an aws_cloudwatch_event_target pointing the rule at the Lambda, and the aws_lambda_permission that lets EventBridge invoke it.

The topics can be listed explicitly, or — the interesting part — discovered from your [Message] handlers, so the generated rule can never drift from what the code actually handles:

var builder = new TerraformEventBridgeRuleBuilder();

var codeFiles = builder.BuildCodeFiles(new TerraformEventBridgeRuleSettings
{
    LambdaName = "my-service-func",
    EventBusName = "orders-bus",                    // optional — omit for the default bus
    Sources = new[] { "com.example.orders" }        // optional source filter
}, typeof(OrderCreatedHandler).Assembly);           // topics discovered from [Message] attributes

Handler versions are collapsed — every version of a topic shares one detail-type on the wire — and topics are sorted so the output is diff-stable.

Alternatively, set TerraformLambdaSettings.EventBridge and TerraformLambdaBuilder generates the rule files alongside the Lambda and IAM role (LambdaName defaults to the Lambda's Name):

var codeFiles = terraformBuilder.BuildCodeFiles(new TerraformLambdaSettings
{
    Name = "my-service-func",
    EntryPoint = "MyNamespace::MyNamespace.StartUp::FunctionHandlerAsync",
    EventBridge = new TerraformEventBridgeRuleSettings
    {
        Topics = new[] { "order.created", "order.updated" }
    }
});

Customization

The generated Terraform code follows Benzene's naming conventions and best practices for serverless deployments on AWS. You can customize the settings passed to the builder to adjust memory, timeouts, and other parameters.