Funções Serverless em Go: AWS Lambda de A a Z
A arquitetura serverless tornou-se o padrão de facto para criar aplicações escaláveis e econômicas na nuvem. AWS Lambda é um dos serviços mais populares para executar código sem gerenciar servidores. Neste artigo, vamos abordar como criar, configurar e fazer deploy de funções serverless em Go (Golang) no AWS Lambda, desde o básico até técnicas avançadas.
Por que Go para AWS Lambda?
Go é a linguagem ideal para funções serverless. Ela compila em um único arquivo binário, tem tempo mínimo de cold start (geralmente menos de 100 ms) e baixo consumo de memória. Isso a torna uma das opções mais rápidas e baratas para Lambda.
- Início rápido: O binário compilado é executado instantaneamente.
- Baixo custo: O consumo mínimo de recursos reduz as contas da nuvem.
- Simplicidade de deploy: Um único arquivo — sem dependências no lado do servidor.
- Excelente integração: Suporte nativo ao AWS SDK para Go.
Configuração do ambiente e primeiro Handler
Antes de escrever código, certifique-se de ter instalado:
- Go versão 1.19+
- Utilitário AWS CLI (configurado com chaves de acesso)
- Make ou qualquer sistema de build (opcional)
Crie um novo módulo e instale o pacote oficial para Lambda:
mkdir my-lambda-functioncd my-lambda-functiongo mod init my-lambda-functiongo get github.com/aws/aws-lambda-go/lambdaAgora vamos escrever uma função simples que retorna uma saudação:
package main
import ( "context" "github.com/aws/aws-lambda-go/lambda")
type MyEvent struct { Name string `json:"name"`}
type MyResponse struct { Message string `json:"message"`}
func HandleRequest(ctx context.Context, event MyEvent) (MyResponse, error) { if event.Name == "" { event.Name = "Convidado" } return MyResponse{Message: "Olá, " + event.Name + "!"}, nil}
func main() { lambda.Start(HandleRequest)}Este código recebe um JSON com o campo name e retorna uma saudação personalizada. Observe: a função deve ser exportável (começar com letra maiúscula) e a assinatura deve corresponder estritamente às expectativas do runtime.
Compilação e deploy no AWS Lambda
Para um binário compatível com Linux (que é o que o Lambda espera), use a compilação cruzada:
GOOS=linux GOARCH=amd64 go build -o bootstrap main.gozip function.zip bootstrapO nome do arquivo de saída obrigatoriamente deve ser bootstrap — este é um requisito do runtime Go no AWS Lambda.
Agora vamos criar a função via AWS CLI:
aws lambda create-function \ --function-name my-go-function \ --runtime provided.al2023 \ --role arn:aws:iam::123456789012:role/lambda-execution-role \ --handler bootstrap \ --zip-file fileb://function.zipObserve o --runtime provided.al2023 — este é o runtime especial para Go (baseado no Amazon Linux 2023). Se você tiver uma versão antiga, use provided.al2.
Após a criação, teste a função:
aws lambda invoke --function-name my-go-function \ --payload '{"name": "Mundo"}' output.jsoncat output.jsonVocê deve ver: {"message":"Olá, Mundo!"}
Trabalhando com eventos AWS (S3, DynamoDB, API Gateway)
O verdadeiro poder do Lambda se revela na integração com outros serviços AWS. Vejamos um exemplo de handler para eventos do S3:
package main
import ( "context" "fmt" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda")
func HandleS3Event(ctx context.Context, s3Event even