Funções Serverless em Go: AWS Lambda de A a Z

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução às Funções Serverless em Go com AWS Lambda

\n

A 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.

\n

Por 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\n

Parte Principal

\n\n

1. Criação e Estrutura de uma Função Lambda em Go

\n

Qualquer 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:

\n\n
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\n

Pontos 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
\n\n

2. Tratamento de Eventos de Diferentes Serviços AWS

\n

O 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.

\n\n

Exemplo para API Gateway (requisição HTTP):

\n
package 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\n

Exemplo para S3 (novo objeto no bucket):

\n
package 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.DynamoDBEvent e outros.
  • \n
  • Para eventos personalizados (ex.: do CloudWatch), use json.Unmarshal.
  • \n
\n\n

3. Compilação, Deploy e Melhores Práticas

\n

Go 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\n

Depois, empacote em ZIP e faça o upload via AWS CLI ou console:

\n
zip function.zip bootstrap\naws lambda create-function \\\n    --function-name my-go-function \\\n    --runtime provided.al2023 \\\n    --role arn:aws:iam::XXXXXXXXXXX                

Blogs

Book Recommendations