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
| Recurso | Limite |
|---|---|
| Memória | 128 MB — 10.240 MB (incrementos 1 MB) |
| Timeout | 15 minutos (900s) |
| Payload (request/response) | 6 MB (sync), 256 KB (async) |
| /tmp storage | 512 MB a 10 GB |
| Concurrency | 1.000 (padrão, ajustável) |
| Cold start | ms 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.