Más contenido relacionado
La actualidad más candente (20)
Similar a Mejores prácticas y las difíciles lecciones aprendidas con las aplicaciones Serverless (20)
Más de Amazon Web Services LATAM (20)
Mejores prácticas y las difíciles lecciones aprendidas con las aplicaciones Serverless
- 1. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Boris Cortes
Solutions Architect | Amazon Web Services
Mejores Prácticas y las
Difíciles Lecciones
Aprendidas con las
Aplicaciones Serverless
- 2. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
https://secure.flickr.com/photos/mgifford/4525333972
¿Por qué
estamos aquí
hoy?
- 4. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Ningún servidor para
aprovisionar o administrar
Escala con el uso
No pagas por tiempo ocioso Disponibilidad y tolerancia
a fallos por defecto
Serverless significa…
- 5. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
SERVICIOS (CUALQUIERA)
Cambios en
el estado del
dato
Peticiones a
los endpoints
Cambios en el
estado del
recurso
FUENTE DEL
EVENTO
FUNCIÓN
Node.js
Python
Java
C#
C# / Powershell
Go
Aplicaciones Serverless
- 6. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Anatomía de una función Lambda
Tu Función
Runtime del
lenguaje
Entorno de
ejecución
Poder de
cómputo
- 7. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Anatomía de una función Lambda
Tu Función
Runtime del
lenguaje
Entorno de
ejecución
Poder de
cómputo
Donde puedes
impactar el
desempeño
- 8. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Anatomía de una función Lambda
Tu Función
Runtime del
lenguaje
Entorno de
ejecución
Poder de
cómputo
Donde puedes
impactar el
desempeño
- 9. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
El ciclo de vida de una función
Inicia
el runtime
Inicia tu
código
Inicio en frío completo
(full cold start)
Inicio en frío
parcial
Inicio en caliente
(warm start)
Descarga
tu código
Lanza un nuevo
contenedor
Optimizado por AWS Optimizado por ti
- 10. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Integración de AWS X-Ray con Serverless
• Lambda instrumentaliza todos las
peticiones en todos los lenguajes
soportados
• Lambda ejecuta un daemon de X-
Ray en todos los lenguajes que
poseen un SDK
var AWSXRay = require(‘aws-xray-sdk-core‘);
AWSXRay.middleware.setSamplingRules(‘sampling-rules.json’);
var AWS = AWSXRay.captureAWS(require(‘aws-sdk’));
S3Client = AWS.S3();
- 11. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Visualizando un inicio en frío en X-Ray
- 12. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Optimizando el poder de cómputo de una función
Lambda solamente expone un control de memoria, con el %
de un núcleo de CPU y red alocados proporcionalmente
Tu código es restringido por CPU, red o memoria? Puedes ser más barato
elegir más memoria.
- 13. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Asignación inteligente de recursos
Calza la asignación de recursos (hasta 3 GB!) con la lógica de la función
Estadísticas de una función Lambda que calculas 1.000 veces todos los
números primos menores o iguales a 1.000.000
128 MB 11,722965s $0,024628
256 MB 6,678945s $0,028035
512 MB 3,194954s $0,026830
1024 MB 1,465984s $0,024638
Green = Mejor Red = Peor
- 14. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Asignación inteligente de recursos
Paree la asignación (hasta 3 GB!) con la lógica de la función
Estadísticas de una función Lambda que calculas 1.000 veces todos los
números primos menores o iguales a 1.000.000
128 MB 11,722965s $0,024628
256 MB 6,678945s $0,028035
512 MB 3,194954s $0,026830
1024 MB 1,465984s $0,024638
Green = Mejor Red = Peor
+$0,00001-10,256981s
- 15. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Impacto de los cambios en memoria
50% de
aumento de
memoria
Percentil 95º
cambias de 3s
para 2.1s
https://blog.newrelic.com/2017/06/20/lambda-functions-xray-traces-custom-serverless-metrics/
- 16. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Multithreading? Quizás!
• <1.8GB sigue siendo con solo uno core
• Cargas de trabajo restringidas por CPU no perciben ninguna mejora
– procesos comparten los mismos recursos
• >1.8GB es multi core
• Cargas de trabajo restringidas por CPU tendrán mejoras pero
necesitan estar diseñadas para multithreading
• Cargas de trabajo restringidas por E/S podrán obtener
mejoras
• e.j. cálculos en paralelo para retornar
- 17. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
El ciclo de vida de una función dentro de una VPC
Descarga
tu código
Lanza un nuevo
contenedor
Inicia tu
código
Crea una
VPC ENI
Adjunta una
VPC ENI
Inicio en frío completo Inicio en
caliente
Inicia el
runtime
Inicio en
frío parcial
Optimizado por AWS Optimizado por ti
- 18. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Necesito una VPC?
Mi función
Lambda
debería estar
en una
VPC?
Mi función
accede a algún
otro recurso
dentro de una
VPC?
Mi función también
necesita acceder a
recursos a través
de internet pública?
No pongas la
función en una
VPC
Pon tu función
en una subnet
privada
Pon tu función
en una subnet
en que el tráfico
hacia internet
salga por un
NAT
Si Si
No No
- 19. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
VPC vs. Resiliencia
• Siempre configure al menos 2 Zonas de
Disponibilidad
• Entregue a sus funciones Lambda sus propias
subnets
• Entregue a las subnets de sus Lambdas un
rango de direcciones IP amplio para soportar la
carga potencial
• Si tu función necesitas comunicarse con algún
recurso por internet necesitarás un NAT
ENIs no son fáciles, lo sabemos. Estamos trabajando en eso 🤓
- 20. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
El hack del “ping” a través de CloudWatch Events
Comúnmente innecesario pero si los inicios fríos
tienen un impacto visible en el desempeño
general:
• Utilice un evento programado desde CloudWatch
Events para disparar un “ping” hacia una función
Lambda a través de una llamada a la API de Lambda
• No agregue un API Gateway
innecesariamente, por ejemplo
• Utilices un payload que logres probar, no un payload
real
• Tenga una función en tu código que maneja y
contesta apropiadamente
Función
Lambda
evento
(programado)
Amazon API
Gateway
Amazon
Kinesis
Lógica
normal de la
aplicación
Lógica del
“ping”
- 21. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Anatomía de una función Lambda
Tu Función
Runtime del
lenguaje
Entorno de
ejecución
Poder de
cómputo
Donde puedes
impactar el
desempeño
- 22. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Anatomía de una función Lambda
Función handler()
Función que es
ejecutada cuando la
función es llamada
Objeto del Evento
Datos enviados durante
la llamada de la función
Lambda
Objeto de Contexto
Métodos disponibles
para interacturar con la
información del runtime
(request ID, log group, etc.)
public String handleRequest(Book book, Context context) {
saveBook(book);
return book.getName() + " saved!";
}
- 23. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Entorno efímero de la función
• Lambda procesa un único evento por
contenedor
• No es necesario una ejecución no
bloqueante en el frontend
• Recuérdate – contenedores son
reutilizados
• Definición tardía de variables en el
scope global
• No definas variables que no necesites
– los inicios en frío son afectados
import boto3
client = None
def my_handler(event, context):
global client
if not client:
client = boto3.client("s3")
# process
- 24. const aws = require('aws-sdk');
const gm = require('gm').subClass({imageMagick: true});
const path = require('path');
const s3 = new aws.S3();
const destBucket = process.env.DEST_BUCKET;
exports.handler = function main(event, context) {
...
for (let i = 0; i < event.Records.length; i++) {
tasks.push(conversionPromise(event.Records[i], destBucket));
}
Promise.all(tasks)
.then(() => { context.succeed(); })
.catch((err) => { context.fail(err); });
};
function conversionPromise(record, destBucket) {
...
}
function get(srcBucket, srcKey) {
...
}
function put(destBucket, destKey, data) {
...
Fuente: Sepai App in AWS Serverless Application Repository
https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-
east-1:233054207705:applications~sepia
- 25. const aws = require('aws-sdk');
const gm = require('gm').subClass({imageMagick: true});
const path = require('path');
const s3 = new aws.S3();
const destBucket = process.env.DEST_BUCKET;
exports.handler = function main(event, context) {
...
for (let i = 0; i < event.Records.length; i++) {
tasks.push(conversionPromise(event.Records[i], destBucket));
}
Promise.all(tasks)
.then(() => { context.succeed(); })
.catch((err) => { context.fail(err); });
};
function conversionPromise(record, destBucket) {
...
}
function get(srcBucket, srcKey) {
...
}
function put(destBucket, destKey, data) {
...
Fuente: Sepai App in AWS Serverless Application Repository
https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-
east-1:233054207705:applications~sepia
Carga de dependencias y creación de conecciones hacia bases de
datos/otros servicios previos al Handler()
Función Handler() contiene lógica mínima
Lógica de negócio en sus propias funciones
- 26. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Función con lógica concisa
• Separe el Handler() (punto de entrada) de la lógica principal
• Lógica dinámica a través de configuración
• Por función – Variables de Entorno
• Múltiples funciones – Amazon Parameter Store/Secrets Manager
• Lea solamente lo que necesites. Por ejemplo:
• Bases de Datos indexadas apropiadamente
• Query filters en Aurora
• Utilice S3 Select
- 27. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Sin orquestación en el códigoInicio
Job#Xiniciado
HTTPPOST
HTTPPOST
Yaestamoslistos?
No!
Estamoslistos!
o
time.sleep(10)
💤😴
- 28. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Sin orquestación en el código
Utilice AWS Step Functions!
- 29. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Código de función eficiente
• Evite “funciones-monolito”
• Controle las dependencias en el paquete
de despliegue de tu función
• Optimice para tu lenguaje
- 30. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Modelos de ejecución en Lambda
Asíncrono (evento)
Amazon
SNS
Función en
AWS Lambda
Amazon
S3
reqs
Polling
Amazon
DynamoDB
Amazon
Kinesis
cambios
AWS Lambda
Función
Síncrono (push)
Amazon
API Gateway
Función en
AWS Lambda
/order
- 31. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Gateways y routers
• Elija un punto de entrada para la
aplicación
• Singular, cliente customizado?
Use el SDK de AWS
• No es client facing? Use endpoints
regionales en API Gateway
• Deseche eventos que no son relevantes
lo más pronto posible
• S3 – Prefijo del evento
• SNS – Filtrado de mensaje
- 32. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Controles de Concurrencia
• Concurrencia es un pool compartido por defecto
• Separar utilizando las configuraciones de concurrencia por cada función
• Actúa como reserva
• También actúa como concurrencia máxima por función
• Especialmente importante para bases de datos como RDS
• “Kill switch” – ajuste la concurrencia por función en cero
- 33. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Como sé que algo no está bien?
Esas herramientas están allá, ocúpenlas!
1. Activa X-Ray
1. Busque como decorar tus propias llamadas a través de los SDKs de X-
Ray
2. No subestimes las capacidades de logging en Lambda
1. Simples declaraciones “debug: en la función X” funcionan bien y son
fáciles de encontrar en CloudWatch Logs
3. Las métricas más útiles son aquellas que están más cerca
de tu cliente/caso de uso
1. Cuantas cosas esa función llamó/creó/procesó/etc.
- 34. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Lambda Dead Letter Queues (DLQ)
“Cualquier función Lambda invocada de forma asíncrona se reintenta
dos veces antes de que se descarte el evento. Si se producen errores en
los reintentos y no conoce el motivo, utilice colas de mensajes fallidos
(DLQ) para dirigir los eventos sin procesar a una cola de Amazon SQS o
a un tema de Amazon SNS para analizar el error.”
– https://docs.aws.amazon.com/es_es/lambda/latest/dg/dlq.html
• Actívalo! (para los casos de llamadas asíncronas)
• Monitorea a través de la métrica/alarma del tamaño de la fila en
SQS
• Si utilizas SNS, envíe los mensajes hacia algo durable y/o un
endpoint fiable para procesamiento
• Puedes enviar hacia funciones Lambda en otras regiones
• Si y cuando las cosas salgan mal DLQ puedes guardar la
información de los eventos al momento de la llamada
☠️
✉️
Q
- 35. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Lambda Dead Letter Queues (DLQ)
“Por defecto, una función Lambda fallida llamada asíncronamente es
reintentada dos veces, y de ahí el evento es descartado. Utilizando
Dead Letter Queues (DLQ) puedes indicar al servicio de Lambda que
eventos nos procesados deben ser enviados a una fila en Amazon SQS
o un tópico en Amazon SNS donde puedes tomar acciones
adicionales”.
– https://docs.aws.amazon.com/lambda/latest/dg/dlq.html
• Préndalo! (para los casos de llamadas asíncronas)
• Monitoree a través de la métrica/alarma del tamaño de la fila en
SQS
• Si utilizas SNS, envíe los mensajes hacia algo durable y/o un
endpoint fiable para procesamiento
• Puedes enviar hacia funciones Lambda en otras regiones
• Si y cuando las cosas salgan mal DLQ puedes guardar la
información de los eventos al momento de la llamada
☠️
✉️
Q
A partir de 28 de junio de 2018
puedes suscribir una función
Lambda para procesar
mensajes en la Dead Letter
Queue!
- 36. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Modelos de ejecución en Lambda
Polling
Amazon
SQS
mensajes
AWS Lambda
función
Nuevo Nuevo
- 37. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
- 38. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
aws.amazon.com/serverless
- 39. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Boris Cortes
borisco@amazon.com
@boriscorteshttps://www.flickr.com/photos/theredproject/3302110152/
- 40. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
?
https://secure.flickr.com/photos/dullhunk/202872717/