SlideShare una empresa de Scribd logo
SUMMIT
MEXICO CITY
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.SUMMIT
Cien usos con Serverless
Marian Claudiu Moldovan
CTO
Monoceros
DEV01
CTO @ Monoceros Labs
@marianmoldovan
Marian C. Moldovan
Somos un Estudio de Innovación
y creación de Experiencias Conversacionales.
Creamos aplicaciones de voz para asistentes como
Amazon Alexa y Google Assistant.
3x
3x
@marianmoldovan
Alexa, abre Veo Veo
@marianmoldovan
¿Serverless?
@marianmoldovan
Caso 1: ‘Apificar’ un script de web scraping
‘Me gustaría tener la lista de todos los servicios de AWS’
@marianmoldovan
Caso 1: ‘Apificar’ un script de web scraping
div[@class="lb-content-item"]/a/text()
@marianmoldovan
Stack lógico
Python + requests +
BeautifulSoup
@marianmoldovan
Código
from bs4 import BeautifulSoup
import requests, re
aws = requests.get('https://aws.amazon.com/es/products/')
bs = BeautifulSoup(aws.text)
products = bs.findAll("div", {"class": "lb-content-item"})
products = [div.find('a').find(text=True, recursive=False) for div in products]
print(products)
@marianmoldovan
Stack serverless
Chalice
+
AWS Lambda
+
API Gateway
@marianmoldovan
El código de una API
from bs4 import BeautifulSoup
import requests, re
from chalice import Chalice
app = Chalice(app_name='aws-products-scraping')
@app.route('/')
def index():
aws = requests.get('https://aws.amazon.com/es/products/')
bs = BeautifulSoup(aws.text)
products = bs.findAll("div", {"class": "lb-content-item"})
products = [div.find('a').find(text=True, recursive=False) for div in products]
return products
chalice deploy
@marianmoldovan
¿Beneficios?
● No hay necesidad de provisionar un servidor y
tenerlo encendido 24/7
● Tampoco configurar un servidor web
● Y desarrollar una app
○ Django? Flask? Express?
○ O poner un script en modo CGI
@marianmoldovan
Caso 2: Pruebas E2E sobre aplicaciones web
‘Me gustaría comprobar que el buscador de productos funciona adecuadamente’
@marianmoldovan
Para realizar test
test('log-in link', async () => {
const browser = await puppeteer.launch();
...
expect(firstLinkText).toEqual('Iniciar sesión');
})
@marianmoldovan
Stack lógico
Chromium
+
Puppeteer
@marianmoldovan
Código
const chromium = require('chrome-aws-lambda')
const browser = await chromium.puppeteer.launch()
const page = await browser.newPage({headless: false})
await page.goto('https://www.amazon.com.mx/')
await page.click('#twotabsearchtextbox')
await page.keyboard.type(product)
await page.click('.nav-input')
const productNames = await page.$$(' h2 > a > span')
// scraping
browser.close()
@marianmoldovan
Conclusiones
● Automatizar tareas sobre cliente, testing, scraping
● Otras alternativas:
○ Selenium
○ Webdriver.io
@marianmoldovan
Caso 3: Controlar por voz un robot BB8
‘Alexa, dile a BB8 que baile’
@marianmoldovan
Componentes
@marianmoldovan
Arquitectura
@marianmoldovan
Beneficios
● Configurar un broker de MQTT
● Desarrollar una app de backend
● Configurar DB
● Securizar todo
Tiempo de desarrollo reducido drásticamente
@marianmoldovan
Caso 4: Chatbots
@marianmoldovan
Hmmm...
¿IS THIS 2015?
@marianmoldovan
Framework
@marianmoldovan
Código para un Hello World bot
const botBuilder = require('claudia-bot-builder')
module.exports = botBuilder(function (message) {
return 'Hola Mundo'
})
@marianmoldovan
Despliegue y configuración
claudia create --region us-east-1 --api-module bot
claudia update --configure-telegram-bot
claudia update --configure-fb-bot
...
@marianmoldovan
Un boilerplate para chatbots serverless
return analytics.saveIncoming(response)
.then(memory.fetch)
.then(nlu).then(dialog)
.then(memory.save)
.then(analytics.saveOutgoing)
.then(respond);
github.com/marianmoldovan/serverless-chatbot-boilerplate
@marianmoldovan
Más info
https://medium.com/@marianmoldovan/arquitecturas-serv
erless-para-chatbots-407ba4a886be
@marianmoldovan
Conclusiones
● Agiliza el desarrollo
○ Hace más complejo hacer las cosas bien
● Compatible con cualquier plataforma mensajeria
● Arquitectura orientada a eventos
○ Menor coste y mayor elasticidad
● HTTPS por defecto
● El arranque en frío no es un problema para los
chatbots
@marianmoldovan
Caso 5: Chatbot proxy
@marianmoldovan
@marianmoldovan
La plataforma de chatbot usada solo
acepta eventos de texto
@marianmoldovan
Arquitectura
@marianmoldovan
Éxito
@marianmoldovan
@marianmoldovan
Caso 6: AWS Button
@marianmoldovan
No hay Birote para
el desayuno
@marianmoldovan
Caso 6: AWS Button
@marianmoldovan
Caso 6: AWS Button
var AWS = require("aws-sdk");
exports.handler = (event, context, callback) => {
var sns = new AWS.SNS();
var params = {
Message: 'Buenas, ¿me traería por favor dos birotes a casa por favor?',
TopicArn: "arn:aws:sns:..."
};
sns.publish(params, context.done);
};
@marianmoldovan
Caso 7: mBaaS para una app móvil
Una aplicación móvil,
geolocalizada con campañas
sociales para solicitar y ofrecer
bienes y servicios
@marianmoldovan
Rápido...
A implementar en un
hackathon, 24 horas
@marianmoldovan
¿Arquitectura?
@marianmoldovan
Hmm… ¿Switch?
function mainHandler(event, context) {
//console.log('Received event:', JSON.stringify(event, null, 2));
var operation = event.operation;
switch (operation) {
case 'create':
createProject(event, context);
break;
case 'list':
listProject(event, context);
break;
case 'search':
searchProject(event, context);
break;
default:
context.fail(new Error('Unrecognized operation "' + operation + '"'));
}
};
@marianmoldovan
Pero en pocas horas
@marianmoldovan
De prototipo a producto
@marianmoldovan
Arquitectura mBaaS
@marianmoldovan
De nuevo Claudia
@marianmoldovan
El handler de una ruta
api.get('/campaign/near', function(request) {
var requiredKeys = ['lat', 'lon'];
if(!_.every(requiredKeys, _.partial(_.has, request.queryString)))
return new api.ApiResponse({errorMessage: 'Missing parameters'}, 400);
return elsearch.near(request.queryString);
});
@marianmoldovan
El código de una API Hello World
var ApiBuilder = require('claudia-api-builder'),
api = new ApiBuilder();
module.exports = api;
api.get('/hello', function () {
return 'hello world';
});
@marianmoldovan
Conclusiones
● El tiempo de desarrollo es increíblemente corto
● Curva de aprendizaje corta
● CLI
○ Permisos de IAM
● Puedes hacer las cosas muy bien o muy mal
○ Libertad total
● Múltiples frameworks
@marianmoldovan
Juguemos a Elige el framework
45https://github.com/anaibol/awesome-serverless
@marianmoldovan
Caso 8: Una app serverless
@marianmoldovan
Stack serverless
Imágen: https://aws.amazon.com/es/amplify/
@marianmoldovan
Amplify está en todo
@marianmoldovan
Conclusiones
● Amplify entra hasta la cocina
○ Cliente - Backend - Recursos cloud
○ Dame el schema y te doy todo
● Curva de aprendizaje ‘interesante’
● Tiempo de desarrollo corto
● Mucha magia por detrás
@marianmoldovan
"appsync:*",
"apigateway:POST",
"apigateway:DELETE",
"apigateway:PATCH",
"apigateway:PUT",
"cloudformation:CreateStack",
"cloudformation:CreateStackSet",
"cloudformation:DeleteStack",
"cloudformation:DeleteStackSet",
"cloudformation:DescribeStackEvents",
"cloudformation:DescribeStackResource",
"cloudformation:DescribeStackResources",
"cloudformation:DescribeStackSet",
"cloudformation:DescribeStackSetOperation",
"cloudformation:DescribeStacks",
"cloudformation:UpdateStack",
"cloudformation:UpdateStackSet",
"iam:CreateRole",
Least privileges
"iam:DeleteRole",
"iam:DeleteRolePolicy",
"iam:GetRole",
"iam:GetUser",
"iam:PassRole",
"iam:PutRolePolicy",
"iam:UpdateRole",
"lambda:AddPermission",
"lambda:CreateFunction",
"lambda:DeleteFunction",
"lambda:GetFunction",
"lambda:GetFunctionConfiguration",
"lambda:InvokeAsync",
"lambda:InvokeFunction",
"lambda:RemovePermission",
"lambda:UpdateFunctionCode",
"lambda:UpdateFunctionConfiguration",
"s3:*"
@marianmoldovan
Least privileges
"cloudfront:CreateCloudFrontOriginAccessIdentity",
"cloudfront:CreateDistribution",
"cloudfront:DeleteCloudFrontOriginAccessIdentity",
"cloudfront:DeleteDistribution",
"cloudfront:GetCloudFrontOriginAccessIdentity",
"cloudfront:GetCloudFrontOriginAccessIdentityConfig",
"cloudfront:GetDistribution",
"cloudfront:GetDistributionConfig",
"cloudfront:TagResource",
"cloudfront:UntagResource",
"cloudfront:UpdateCloudFrontOriginAccessIdentity",
"cloudfront:UpdateDistribution",
"cognito-identity:CreateIdentityPool",
"cognito-identity:DeleteIdentityPool",
"cognito-identity:DescribeIdentity",
"cognito-identity:DescribeIdentityPool",
"cognito-identity:SetIdentityPoolRoles",
"cognito-identity:UpdateIdentityPool",
"cognito-idp:CreateUserPool",
"cognito-idp:CreateUserPoolClient",
"cognito-idp:DeleteUserPool",
"cognito-idp:DeleteUserPoolClient",
"cognito-idp:DescribeUserPool",
"cognito-idp:UpdateUserPool",
"cognito-idp:UpdateUserPoolClient",
"dynamodb:CreateTable",
"dynamodb:DeleteItem",
"dynamodb:DeleteTable",
"dynamodb:DescribeTable",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:UpdateTable",
@marianmoldovan
Least privileges
@marianmoldovan
Caso 9: Motor de procesamiento + cache
Polly + S3
@marianmoldovan
Código
const fileName = md5(params.VoiceId + params.Text);
const potentialURL = bucketLink + '/' + fileName + '.mp3';
request.head(potentialURL, function (error, response, body) {
if(response.statusCode === 200)
callback(null, {'voice': potentialURL})
else {
polly.synthesizeSpeech(params, function(err, data) {
s3.upload(s3Params, function(err, data) {
callback(null, {'voice': data.Location});
});
});
}
@marianmoldovan
Caso 10: Alexa Skills
@marianmoldovan
Fácil integración
@marianmoldovan
Incluso hospedada
@marianmoldovan
Alexa Skills Kit
@marianmoldovan
Fácil implementación
handle(handlerInput) {
...
const speakOutput = 'Hello World!';
return handlerInput.responseBuilder
.speak(speakOutput)
.getResponse();
}
@marianmoldovan
¿Persistencia y gestión automática de Dynamo?
exports.handler = Alexa.SkillBuilders.custom()
.addRequestHandlers(...)
.addErrorHandlers(ErrorHandler)
.addRequestInterceptors(...)
.addResponseInterceptors(ResponsePersistenceInterceptor)
.withTableName("ask-helloworld")
.withAutoCreateTable(true)
.lambda();
@marianmoldovan
Boilerplate - WIP
github.com/marianmoldovan/
alexa-node-boilerplate
@marianmoldovan
Testing local
it('should return outputSpeech', function () {
expect(done.response.outputSpeech.ssml).to.be.a('string')
});
it('should have shouldEndSession equal to false', function () {
assert.equal(done.response.shouldEndSession, false)
});
github.com/ashiina/lambda-local
@marianmoldovan
@marianmoldovan
Otros usos
Planificar ejecuciones con Cloudwatch
Procesamiento de mensajes de SQS
Backend para formularios web
Plataforma de tests A/B
Plataforma de analytics
Procesar ficheros de S3
Generar thumbnails
Mailing
...
@marianmoldovan
Caso 10: Tests A/B
github.com/Alephbet/gimel
@marianmoldovan
Caso 11: Procesar ficheros de S3
github.com/littlstar/s3-lambda
lambda
.context(context)
.forEach(object => {
// do something with object
})
.then(_ => console.log('done!'))
.catch(console.error)
@marianmoldovan
Caso 12: Backend para formularios web
github.com/danielireson/formplug-serverless
@marianmoldovan
En resumen
@marianmoldovan
Cosas malas
● Testing más complejo (pero posible)
● Permisos de IAM a librerias/CLIs
● Librerías nativas 💀
● Lambdas con soporte para HPC, GPUs
● Cold start
@marianmoldovan
Cosas buenas
● Perfecto para cómputo orientado a eventos
● Alta compatibilidad con servicios AWS
● Cloudformation
● Gran comunidad
○ Muchas librerias
○ Muchos lenguajes
● Compatible con sistemas de auth
● Más barato en la mayoría de los casos
@marianmoldovan
Links útiles
https://es.slideshare.net/BEEVA_es/ruling
-the-world-galaxy-with-your-voice-and-th
e-cloud
medium.com/@marianmoldovan
github.com/marianmoldovan
SUMMIT
MEXICO CITY

Más contenido relacionado

PDF
Dynamics crm-es
PDF
Progressive Web Apps
PDF
Construyendo aplicaciones Serverless
PDF
Serverless: La evolucion de la arquitectura a la nube
PDF
Construyedo Aplicaciones Serverless
PDF
Tecnologías para microservicios
PPTX
Comenzando con Arquitecturas sin servidores
PPTX
Aprende a crear y desplegar una aplicación de python que use APIs de BlueVia
Dynamics crm-es
Progressive Web Apps
Construyendo aplicaciones Serverless
Serverless: La evolucion de la arquitectura a la nube
Construyedo Aplicaciones Serverless
Tecnologías para microservicios
Comenzando con Arquitecturas sin servidores
Aprende a crear y desplegar una aplicación de python que use APIs de BlueVia

Similar a Cien usos con serverless (20)

PDF
Backend i os
PDF
Comenzando con aplicaciones serverless en AWS
PPTX
Comenzando con Arquitecturas sin servidores
PPTX
David Victoria - AWS Summit CDMX.pptx
PPTX
Comenzando con Arquitecturas sin servidores
PPTX
Serverless Wars
PPTX
Arquitectura API Rest.
PDF
Meetup En mi local funciona - Serverless... ¡en local! con Serverless Framewo...
PPTX
Serverless en tu idioma - ChilangoDev Ene 2017
PPTX
Serverless application repository
PDF
Micro vs Nano (servicios)
PPT
APIs de Telecomunicaciones
PPTX
Daniel rabinovich php conference
PPTX
Reestructuración y Optimización de una de una Aplicación Monolítica.
PDF
Transformation Track AWS Cloud Experience Argentina - Despegando y Desarrolla...
PDF
Programacion Web UGR - Tema 6.pdf
PPTX
Uso de Containers y Serverless para acelerar el desarrollo de aplicaciones mo...
PDF
Arquitecturas Serverless con IoT, Machine Learning y Asistentes de Voz
PDF
REST - deSymfony2012
Backend i os
Comenzando con aplicaciones serverless en AWS
Comenzando con Arquitecturas sin servidores
David Victoria - AWS Summit CDMX.pptx
Comenzando con Arquitecturas sin servidores
Serverless Wars
Arquitectura API Rest.
Meetup En mi local funciona - Serverless... ¡en local! con Serverless Framewo...
Serverless en tu idioma - ChilangoDev Ene 2017
Serverless application repository
Micro vs Nano (servicios)
APIs de Telecomunicaciones
Daniel rabinovich php conference
Reestructuración y Optimización de una de una Aplicación Monolítica.
Transformation Track AWS Cloud Experience Argentina - Despegando y Desarrolla...
Programacion Web UGR - Tema 6.pdf
Uso de Containers y Serverless para acelerar el desarrollo de aplicaciones mo...
Arquitecturas Serverless con IoT, Machine Learning y Asistentes de Voz
REST - deSymfony2012
Publicidad

Último (20)

PPTX
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
PPTX
Sesion 1 de microsoft power point - Clase 1
PDF
taller de informática - LEY DE OHM
PPTX
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
PDF
CyberOps Associate - Cisco Networking Academy
PDF
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
PDF
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PDF
SAP Transportation Management para LSP, TM140 Col18
PPTX
Presentación PASANTIAS AuditorioOO..pptx
PDF
Calidad desde el Docente y la mejora continua .pdf
PDF
Liceo departamental MICRO BIT (1) 2.pdfbbbnn
PPTX
Presentación de Redes de Datos modelo osi
PPTX
Propuesta BKP servidores con Acronis1.pptx
PDF
Influencia-del-uso-de-redes-sociales.pdf
PPT
El-Gobierno-Electrónico-En-El-Estado-Bolivia
PPTX
historia_web de la creacion de un navegador_presentacion.pptx
PPTX
Power Point Nicolás Carrasco (disertación Roblox).pptx
PPTX
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
PDF
Plantilla para Diseño de Narrativas Transmedia.pdf
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
Sesion 1 de microsoft power point - Clase 1
taller de informática - LEY DE OHM
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
CyberOps Associate - Cisco Networking Academy
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
Zarate Quispe Alex aldayir aplicaciones de internet .docx
SAP Transportation Management para LSP, TM140 Col18
Presentación PASANTIAS AuditorioOO..pptx
Calidad desde el Docente y la mejora continua .pdf
Liceo departamental MICRO BIT (1) 2.pdfbbbnn
Presentación de Redes de Datos modelo osi
Propuesta BKP servidores con Acronis1.pptx
Influencia-del-uso-de-redes-sociales.pdf
El-Gobierno-Electrónico-En-El-Estado-Bolivia
historia_web de la creacion de un navegador_presentacion.pptx
Power Point Nicolás Carrasco (disertación Roblox).pptx
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
Plantilla para Diseño de Narrativas Transmedia.pdf
Publicidad

Cien usos con serverless