algnhsa is an AWS Lambda Go net/http
server adapter.
algnhsa enables running Go web applications on AWS Lambda and API Gateway or ALB without changing the existing HTTP handlers:
package main
import (
"fmt"
"net/http"
"strconv"
"github.com/nullify-platform/algnhsa"
)
func addHandler(w http.ResponseWriter, r *http.Request) {
f, _ := strconv.Atoi(r.FormValue("first"))
s, _ := strconv.Atoi(r.FormValue("second"))
w.Header().Set("X-Hi", "foo")
fmt.Fprintf(w, "%d", f+s)
}
func contextHandler(w http.ResponseWriter, r *http.Request) {
lambdaEvent, ok := algnhsa.APIGatewayV2RequestFromContext(r.Context())
if ok {
fmt.Fprint(w, lambdaEvent.RequestContext.AccountID)
}
}
func main() {
http.HandleFunc("/add", addHandler)
http.HandleFunc("/context", contextHandler)
algnhsa.ListenAndServe(http.DefaultServeMux, nil)
}
package main
import (
"net/http"
"github.com/nullify-platform/algnhsa"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "hi",
})
})
algnhsa.ListenAndServe(r, nil)
}
package main
import (
"net/http"
"github.com/nullify-platform/algnhsa"
"github.com/labstack/echo/v4"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "hi")
})
algnhsa.ListenAndServe(e, nil)
}
package main
import (
"net/http"
"github.com/nullify-platform/algnhsa"
"github.com/go-chi/chi"
)
func main() {
r := chi.NewRouter()
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hi"))
})
algnhsa.ListenAndServe(r, nil)
}
package main
import (
"github.com/nullify-platform/algnhsa"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/adaptor"
)
func main() {
app := fiber.New()
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, World!")
})
algnhsa.ListenAndServe(adaptor.FiberApp(app), nil)
}
First, build your Go application for Linux and zip it:
GOOS=linux GOARCH=amd64 go build -o handler
zip handler.zip handler
AWS provides plenty of ways to expose a Lambda function to the internet.
This is the easier way to deploy your Lambda function as an HTTP endpoint. It only requires going to the "Function URL" section of the Lambda function configuration and clicking "Configure Function URL".
-
Create a new HTTP API.
-
Configure a catch-all
$default
route.
-
Create a new REST API.
-
In the "Resources" section create a new
ANY
method to handle requests to/
(check "Use Lambda Proxy Integration"). -
Add a catch-all
{proxy+}
resource to handle requests to every other path (check "Configure as proxy resource").
-
Create a new ALB and point it to your Lambda function.
-
In the target group settings in the "Attributes" section enable "Multi value headers".