Configurando um ambiente serverless com Golang localmente

Nos últimos dias, precisei trabalhar com serverless em Golang, mas infelizmente não encontrei muitos recursos em português (embora o conteúdo técnico em inglês seja predominante, às vezes os recursos em português podem ajudar quem está começando)

Por esse motivo, estou escrevendo este artigo para você (ou até mesmo para mim no futuro, caso precise rs), que está começando ou quer fazer algo com serverless usando Golang. Para isso, partirei do pressuposto que você já sabe o que é o modelo serverless e como ele funciona.

Meu problema

Eu já havia trabalhado com serverless antes, porém com o ambiente Node.js. O desafio da vez era fazer um Worker de métricas utilizando Go. Então, pesquisei como executar o código Go em um ambiente serverless e descobri que é possível usar o próprio gerenciador de pacotes do Node para baixar as dependências e rodar o binário Go na máquina.

Mas vamos lá, na prática é mais fácil de entender:

Requisitos:

  • Gerenciador de pacotes do Node (NPM)
  • Golang
  • Biblioteca aws-lambda-go
  • Ter instalado o framework Serverless globalmente na sua máquina
  • Docker (para ter o ambiente em que é executado o binário)

Passo 1: Criar package.json

Digite o comando para iniciar o package.json no seu projeto:

npm init -y

Passo 2: Instalar dependências

Baixar o serverless-offline pluguin como dependência de dev:

npm i -D serverless-offline

Instale as bibliotecas de aws-lambda do go:

go get github.com/aws/aws-lambda-go
go get github.com/aws/aws-sdk-go

Passo 3: Hello World com lambda function:

Crie um arquivo main.go no seu projeto:

package main

import (
	"net/http"
	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

type Response events.APIGatewayProxyResponse

func Handler(request events.APIGatewayProxyRequest) (Response, error) {
	return Response{
		StatusCode: http.StatusOK,
		Body: "{hello: world}",
	}, nil
}

func main() {
	lambda.Start(Handler)
}

Passo 4: Configurando serverless.yaml

Agora, crie o arquivo serverless.yaml no seu projeto e cole a seguinte configuração:

service: meu-projeto-serverless
frameworkVersion: '3'

plugins:
	- serverless-offline

provider:
	name: aws
	runtime: go1.x
	region: us-east-1
	stage: local

custom:
	serverless-offline:
	noPrependStageInUrl: true

package:
	patterns:
		- '!./**'
		- './bin/**'

functions:
	hello-world:
		handler: bin/hello-world
		package:
			include:
				- ./bin/hello-world
		events:
			- http:
				path: /hello-world
				method: get
				cors: true
				private: false

Passo 5: configurando Makefile

Por último, podemos configurar nosso make file, que irá buildar nosso binário go:

clean:
	go clean
	rm -rf ./bin

build: clean
	go mod tidy
	env GOARCH=amd64 GOOS=linux go build -ldflags="-s -w" -o bin/hello-world main.go

dev:
	sls offline --useDocker start --host 0.0.0.0

E pronto, agora você pode buildar seu projeto com um:

make build

E rodar ele localmente com:

make dev

Conclusão

Por fim, queria dizer para vocês que sempre tenho um certo trabalhinho para configurar aplicações serverless localmente, mas é sempre bom ter esse conhecimento para não ter que "testar em produção".

Dito isso, espero que tenham gostado e, mais importante, espero ter ajudado alguém com meus probleminhas internos, hehe. E se você quiser dar uma olhada mais afundo, aqui o repositório com o código que desenvolvi.