AWS Lambda é o serviço de computação sem servidor definitivo em 2026. Execute código em resposta a eventos (solicitações HTTP, alterações de banco de dados, uploads de arquivos, tarefas agendadas) sem gerenciar servidores. Este guia cobre o Lambda desde a primeira função até a arquitetura sem servidor pronta para produção com Python e Node.js.
📋 Table of Contents
Por que Lambda sem servidor?
- Sem gerenciamento de servidor— AWS cuida de escalabilidade, aplicação de patches e disponibilidade
- Pague por uso— cobrado por 1 ms de execução (primeiros 1 milhão de solicitações gratuitas/mês)
- Escala infinita— dimensiona automaticamente de 0 a 10.000 execuções simultâneas
- Orientado por eventos— gatilhos do API Gateway, S3, DynamoDB, SQS, EventBridge
- Partidas a frio— inicialização em menos de um segundo para Python/Node.js com SnapStart
Olá mundo Lambda (Python)
# lambda_function.py
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event: dict, context) -> dict:
logger.info(f"Event: {json.dumps(event)}")
# context has: function_name, remaining_time_in_millis, memory_limit_in_mb
logger.info(f"Remaining time: {context.get_remaining_time_in_millis()}ms")
name = event.get("queryStringParameters", {}).get("name", "World")
return {
"statusCode": 200,
"headers": {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
},
"body": json.dumps({
"message": f"Hello, {name}!",
"requestId": context.aws_request_id,
})
}
Implantar com AWS SAM
# Install AWS SAM CLI
pip install aws-sam-cli
# Initialize project
sam init --runtime python3.12 --app-template hello-world
# Build
sam build
# Local test
sam local invoke HelloWorldFunction --event events/event.json
sam local start-api # runs locally on port 3000
# Deploy to AWS
sam deploy --guided # first time (interactive)
sam deploy # subsequent deploys
# template.yaml (SAM template)
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Globals:
Function:
Runtime: python3.12
Timeout: 30
MemorySize: 256
Environment:
Variables:
ENVIRONMENT: !Ref Environment
Layers:
- !Ref DependenciesLayer
Parameters:
Environment:
Type: String
AllowedValues: [dev, staging, production]
Resources:
ApiFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: src/
Handler: api.handler
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref UsersTable
- S3ReadPolicy:
BucketName: !Ref AssetsBucket
Events:
Api:
Type: Api
Properties:
Path: /{proxy+}
Method: ANY
Schedule:
Type: Schedule
Properties:
Schedule: rate(5 minutes)
DependenciesLayer:
Type: AWS::Serverless::LayerVersion
Properties:
ContentUri: dependencies/
CompatibleRuntimes: [python3.12]
UsersTable:
Type: AWS::DynamoDB::Table
Properties:
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: pk
AttributeType: S
- AttributeName: sk
AttributeType: S
KeySchema:
- AttributeName: pk
KeyType: HASH
- AttributeName: sk
KeyType: RANGE
FastAPI em Lambda (Mangum)
pip install fastapi mangum
# Package: put in layer or zip with requirements.txt
# main.py
from fastapi import FastAPI, Depends, HTTPException
from mangum import Mangum
from pydantic import BaseModel
app = FastAPI(
title="My API",
root_path="/production" # API Gateway stage
)
class User(BaseModel):
id: int
name: str
email: str
@app.get("/users/{user_id}")
async def get_user(user_id: int) -> User:
user = await db.get_user(user_id)
if not user:
raise HTTPException(404, "User not found")
return user
@app.post("/users")
async def create_user(user: User) -> User:
return await db.create_user(user)
# Lambda handler
handler = Mangum(app, lifespan="off")
Fontes de eventos
# S3 trigger — process uploaded files
def handle_s3_upload(event: dict, context) -> None:
for record in event.get('Records', []):
bucket = record['s3']['bucket']['name']
key = record['s3']['object']['key']
size = record['s3']['object']['size']
print(f"Processing {key} ({size} bytes) from {bucket}")
process_file(bucket, key)
# SQS trigger — process messages
def handle_sqs_messages(event: dict, context) -> dict:
batch_failures = []
for record in event.get('Records', []):
try:
body = json.loads(record['body'])
process_message(body)
except Exception as e:
# Return failed message IDs for retry
batch_failures.append({"itemIdentifier": record['messageId']})
return {"batchItemFailures": batch_failures}
# DynamoDB Streams trigger
def handle_db_changes(event: dict, context) -> None:
for record in event.get('Records', []):
if record['eventName'] == 'INSERT':
new_item = record['dynamodb']['NewImage']
on_user_created(new_item)
elif record['eventName'] == 'MODIFY':
old = record['dynamodb']['OldImage']
new = record['dynamodb']['NewImage']
on_user_updated(old, new)
# EventBridge scheduled task
def run_nightly_report(event: dict, context) -> None:
print(f"Running nightly report at {event['time']}")
generate_and_email_report()
Melhores práticas Lambda
- Mantenha as funções focadas– uma função, um propósito
- Reutilizar conexões— inicializa conexões DB/Redis fora do manipulador (elas persistem em invocações quentes)
- Use camadas Lambda— compartilha dependências entre funções, reduz o tamanho do pacote de implantação
- Defina a memória apropriada— mais memória = mais CPU, geralmente mais rápido+mais barato (teste 128-3008MB)
- Habilitar SnapStart(Java) /usar Graviton2(melhor preço-desempenho)
- Monitore partidas a frio— use o rastreamento de raio-X, mantenha as funções aquecidas para caminhos críticos
- Funções idempotentes— Lambda pode invocar várias vezes (pelo menos uma vez), projete de acordo
O AWS Lambda em 2026 é a maneira mais econômica de executar cargas de trabalho programadas, orientadas por eventos e API. Use SAM para desenvolvimento e implantação local, FastAPI+Mangum para APIs REST e configure a memória certa para sua carga de trabalho. Para APIs consistentemente quentes, considere Lambda com simultaneidade provisionada ou Fargate para serviços sempre ativos.
🔗 Share this article
✍️ Leave a Comment