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.