/lambda-go-extras

This module provides a middleware layer for github.com/aws/aws-lambda-go.

Primary LanguageGoApache License 2.0Apache-2.0

lambda-go-extras

This module provides a middleware layer for github.com/aws/aws-lambda-go. This project is heavily based on https://github.com/justinas/alice.

GitHub Actions status Go Report Card Documentation

Why?

Having used the github.com/aws/aws-lambda-go package for a while now I have found it annoying switching between the Go standard libraries http package and this library. After some review I think the thing I miss the most is the ability to chain a list of handlers, with each link responsible for a part of the puzzle.

Being able to compose these chains offers a lot of flexibility and reuse across projects.

Given the default way of using the github.com/aws/aws-lambda-go is via the Start(handler interface{}) function, which is very flexible, but not easily extended due it's dynamic nature. So I have moved to using the less used func StartHandler(handler Handler) which is more idiomatic with its Handler being just an interface with a single Invoke method. This module has extended this with a simple middleware chain inspired by alice as mentioned above.

Usage

This illustrates how easy it is to dump the input and output payloads using a simple middleware chain.

package main

import (
	"context"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
	"github.com/rs/zerolog"
	"github.com/wolfeidau/lambda-go-extras/lambdaextras"
	lmw "github.com/wolfeidau/lambda-go-extras/middleware"
	"github.com/wolfeidau/lambda-go-extras/middleware/raw"
	zlog "github.com/wolfeidau/lambda-go-extras/middleware/zerolog"
)

var (
	commit    = "unknown"
	buildDate = "unknown"
)

func main() {
	flds := lmw.FieldMap{"commit": commit, "buildDate": buildDate}

	ch := lmw.New(
		raw.New(raw.Fields(flds)),   // raw event logger which prints input and output of handler
		zlog.New(zlog.Fields(flds)), // inject zerolog into the context
	).Then(lambdaextras.GenericHandler(processSQSEvent))

	// use StartWithOptions as StartHandler is deprecated
	lambda.StartWithOptions(ch)
}

func processSQSEvent(ctx context.Context, sqsEvent events.SQSEvent) (string, error) {
	zerolog.Ctx(ctx).Info().Msg("sqsEvent")
	return "ok", nil
}

There are two bundled middleware, these are

  • github.com/wolfeidau/lambda-go-extras/middleware/raw - raw event logger which outputs input and output events which also includes aws_request_id and the fields you provide at initialisation.
  • github.com/wolfeidau/lambda-go-extras/middleware/zerolog - configures the context with a zerolog logger which includes aws_request_id and the fields you provide at initialisation.

License

This code was authored by Mark Wolfe and is licensed under the Apache 2.0 license.