Introdução às Funções Serverless em Go com AWS Lambda
\nA arquitetura Serverless se tornou um padrão para criar aplicações escaláveis e econômicas. AWS Lambda é um dos líderes nesta área, e Go (Golang) é a linguagem ideal para escrever funções serverless devido ao seu desempenho, inicialização rápida e tamanho pequeno do arquivo binário. Neste artigo, abordaremos o ciclo completo de trabalho: desde a criação da função mais simples até o deploy e monitoramento.
\nPor que Go? Ao contrário de Node.js ou Python, Go compila para um arquivo binário nativo, o que reduz o cold start para dezenas de milissegundos. Isso é crítico para sistemas de alta carga.
\n\nParte Principal
\n\n1. Criação e Estrutura de uma Função Lambda em Go
\nQualquer função Lambda em Go começa com a importação do pacote github.com/aws/aws-lambda-go/lambda. Vejamos um exemplo mínimo:
package main\n\nimport (\n "github.com/aws/aws-lambda-go/lambda"\n)\n\ntype MyEvent struct {\n Name string `json:"name"`\n}\n\ntype MyResponse struct {\n Message string `json:"message"`\n}\n\nfunc HandleRequest(event MyEvent) (MyResponse, error) {\n return MyResponse{Message: "Olá, " + event.Name + "!"}, nil\n}\n\nfunc main() {\n lambda.Start(HandleRequest)\n}\n\nPontos principais:
\n- \n
- Handler — é a função que o AWS Lambda chama. Ela pode receber e retornar qualquer tipo de dado (structs, strings, interfaces). \n
- Contexto — argumento opcional como primeiro parâmetro:
func HandleRequest(ctx context.Context, event MyEvent) (MyResponse, error). Permite cancelar a execução por timeout. \n - O erro (error) sinaliza ao Lambda uma falha na execução. \n
2. Tratamento de Eventos de Diferentes Serviços AWS
\nO Lambda é frequentemente usado como gatilho para eventos do S3, DynamoDB, SQS e API Gateway. Go suporta todos os tipos de eventos através do pacote github.com/aws/aws-lambda-go/events.
Exemplo para API Gateway (requisição HTTP):
\npackage main\n\nimport (\n "github.com/aws/aws-lambda-go/lambda"\n "github.com/aws/aws-lambda-go/events"\n)\n\nfunc handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {\n return events.APIGatewayProxyResponse{\n Body: "Hello, World!",\n StatusCode: 200,\n Headers: map[string]string{"Content-Type": "text/plain"},\n }, nil\n}\n\nfunc main() {\n lambda.Start(handler)\n}\n\nExemplo para S3 (novo objeto no bucket):
\npackage main\n\nimport (\n "context"\n "fmt"\n "github.com/aws/aws-lambda-go/lambda"\n "github.com/aws/aws-lambda-go/events"\n)\n\nfunc handler(ctx context.Context, s3Event events.S3Event) error {\n for _, record := range s3Event.Records {\n bucket := record.S3.Bucket.Name\n key := record.S3.Object.Key\n fmt.Printf("Novo arquivo: %s no bucket %s\\n", key, bucket)\n }\n return nil\n}\n\nfunc main() {\n lambda.Start(handler)\n}\n- \n
- Use
events.S3Event,events.SNSEvent,events.DynamoDBEvente outros. \n - Para eventos personalizados (ex.: do CloudWatch), use
json.Unmarshal. \n
3. Compilação, Deploy e Melhores Práticas
\nGo compila para Linux (arquitetura x86_64 ou arm64). Compile o arquivo binário para Lambda:
\n# Para x86_64\nGOOS=linux GOARCH=amd64 go build -o bootstrap main.go\n\n# Para ARM (Graviton) — mais barato e rápido\nGOOS=linux GOARCH=arm64 go build -o bootstrap main.go\n\nDepois, empacote em ZIP e faça o upload via AWS CLI ou console:
\nzip function.zip bootstrap\naws lambda create-function \\\n --function-name my-go-function \\\n --runtime provided.al2023 \\\n --role arn:aws:iam::XXXXXXXXXXX