kb.erickguedes.com
AWS: Cloud Computing na Prática

Lambda — Serverless Computing

Aula 5 de 8

AWS Lambda

Lambda executa código sem provisionar servidores. Você paga por execução e duração.

Limites Importantes

RecursoLimite
Memória128 MB — 10.240 MB (incrementos 1 MB)
Timeout15 minutos (900s)
Payload (request/response)6 MB (sync), 256 KB (async)
/tmp storage512 MB a 10 GB
Concurrency1.000 (padrão, ajustável)
Cold startms a segundos (Java/C# mais lentos)

Criando sua Primeira Lambda

# handler.py
import json
import os

def handler(event, context):
    """Lambda function handler."""
    name = event.get('name', 'Mundo')
    return {
        'statusCode': 200,
        'headers': {'Content-Type': 'application/json'},
        'body': json.dumps({
            'message': f'Olá, {name}!',
            'env': os.environ.get('STAGE', 'dev')
        })
    }
# Deploy via CLI
zip -r function.zip handler.py
aws lambda create-function \
  --function-name minha-funcao \
  --runtime python3.12 \
  --role arn:aws:iam::xxx:role/lambda-exec-role \
  --handler handler.handler \
  --zip-file fileb://function.zip \
  --memory-size 256 \
  --timeout 30

# Invocar
aws lambda invoke \
  --function-name minha-funcao \
  --payload '{"name": "AWS"}' \
  response.json
cat response.json

Eventos que Acionam Lambda

{
  "s3:ObjectCreated:*": "Novo arquivo no S3",
  "aws:sns": "Mensagem SNS",
  "aws:sqs": "Mensagem SQS",
  "apigateway:*": "HTTP request via API Gateway",
  "dynamodb:Insert": "Novo registro no DynamoDB Streams",
  "events:Rule": "Agendamento CloudWatch Events (cron)"
}

S3 Event + Lambda Lab

# 1. Criar bucket
aws s3 mb s3://meu-processador

# 2. Configurar notificação
aws s3api put-bucket-notification-configuration \
  --bucket meu-processador \
  --notification-configuration '{
    "LambdaFunctionConfigurations": [{
      "LambdaFunctionArn": "arn:aws:lambda:us-east-1:xxx:function:processar-imagem",
      "Events": ["s3:ObjectCreated:*"]
    }]
  }'

# 3. Conceder permissão S3 → Lambda
aws lambda add-permission \
  --function-name processar-imagem \
  --statement-id s3-invoke \
  --action lambda:InvokeFunction \
  --principal s3.amazonaws.com \
  --source-arn "arn:aws:s3:::meu-processador"

Layers — Dependências Compartilhadas

# Criar layer com bibliotecas Python
mkdir python
pip install requests -t python/
zip -r requests-layer.zip python/

aws lambda publish-layer-version \
  --layer-name requests-layer \
  --zip-file fileb://requests-layer.zip \
  --compatible-runtimes python3.12

aws lambda update-function-configuration \
  --function-name minha-funcao \
  --layers arn:aws:lambda:us-east-1:xxx:layer:requests-layer:1

Serverless com SAM (AWS Serverless Application Model)

# template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
  MinhaApi:
    Type: AWS::Serverless::Function
    Properties:
      Runtime: python3.12
      Handler: handler.handler
      Events:
        ApiEndpoint:
          Type: Api
          Properties:
            Path: /hello
            Method: GET
sam build
sam deploy --guided   # deploy interativo

Cold Starts — Mitigação

Estratégias para reduzir cold starts:
├── Provisioned Concurrency (manter N instâncias quentes)
├── SnapStart (Lambda + Java 11+)
├── Runtime leve (Python/Node melhor que Java/C#)
└── Menor pacote zip (evite dependências desnecessárias)
# Provisioned Concurrency
aws lambda put-provisioned-concurrency-config \
  --function-name minha-funcao \
  --qualifier 1 \
  --provisioned-concurrent-executions 5

Lambda não é para workloads longos. Use Provisioned Concurrency para produção sensível à latência. Sempre configure reserved concurrency para evitar throttling em cascata.