LESSONS LEARNED FROM AWS LAMBDA
@pierodibello
No ops, just code
Lessons learned from
@dedaniel_xp

Intro

WHAT IS AWS?

CLOUD COMPUTING PLATFORM
AMAZON WEB SERVICES
what does it offer?

-
COMPUTE
-
networking
-
storage
-
DATABASE
-
SECURITY
-
DEVELOPER TOOLS
-
MANAGEMENT TOOLS
-
MANY OTHERS


Full architecture case

serverless architecture



What, why, how

WHAT IS LAMBDA?

-
NO-OPS
-
EVENT DRIVEN
-
SCALE AUTOMATICALLY
-
ONLY PAY FOR WHAT YOU USE
SERVERLESS COMPUTE SERVICE
NO-OPS

-
Server and OS maintenance
-
Server provisioning
-
Monitor and logging
ZERO ADMIN
EVENT DRIVEN

-
Events coming from AWS resources (S3, DynamoDB, KINESIS, SNS, CLOUDWATCH, ...)
-
HTTP requests VIA API GATEWAY
RUN CODE IN RESPONSE TO EVENTS
HIGH AVAILABILITY

-
Your code runs in response to every trigger within milliseconds
-
Lambda will scale automatically TO MATCH THE INCOMING LOAD
JUST UPLOAD YOUR CODE
ZERO DOWNTIME DEPLOYMENT

-
EACH LAMBDA IS VERSIONED
JUST UPLOAD THE NEW VERSION OF YOUR FUNCTION
http://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html
ONLY PAY FOR WHAT YOU USE

You are charged based on
-
the number of requests for your functions, plus
-
the time your code executes and the memory it allocates
You don't pay anything when your code isn't running.
LAMBDA BENEFITS

-
Requests can be scaled, so there is no over- or under-server capacity provisioning
-
Application providers don’t pay for idle computing power
-
The system is implicitly fault tolerant as it does not rely on managing machine servers
-
Metrics and logging become a universal right for which all app developers should have access
FREE TIER FOR ALL!

YOU GOT FOR FREE EACH MONTh:
-
The first 1 million requests
-
The first 400,000 GB-seconds of compute time
PRICING

-
$0.20 per 1 million requests thereafter
-
$0.00001667 for every GB-second
More info: http://aws.amazon.com/lambda/pricing/


USE YOUR OWN LANGUAGES

-
Node.js (v0.10, v4.3)
-
Java 8
-
Python 2.7
-
...and more to come
NO NEW LANGUAGES/FRAMEWORKS TO LEARN
HEAD TOWARDS MICROSERVICES

-
independently deployable
-
PICk YOUR LANGUAGEs
-
NANOSERVICES?
each function is a SMALL service
All that glitters is not gold

-
THE Execution Environment IS OPAQUE
-
COLD STARTUP
Some things you get TO BE AWARE OF WITH AWS Lambda
THE EXECUTION ENVIRONMENT IS OPAQUE

-
don't keep state on the container
-
don't make assumptions on the Linux OS under the hood
-
don't assume two function calls will land on the same container
BE STATELESS
THE EXECUTION ENVIRONMENT IS NOT UNDER YOU CONTROL

-
With Lambda you cannot log in to MACHINES, or customize the operating system or language runtime
-
You exchange this flexibility with the “no-ops, just code” paradigm.
-
If you need control, choose a IAAS solution
COLD STARTUP

-
Java is the slowest in the startup, the fastest once warmed
-
python is the fastest to startup
The first call to a function could take longer
be ready to think in microservices!

-
longer deploys
-
too much coupling between functions
If you think your app as a monolith, you'll have the same monolith FOR each and every function
FROM DEV TO PRODUCTION

you can have as many different stages as you want, using named alias to different versions of your lambda
ALTERNATIVES TO AWS LAMBDA

-
GOOGLE CLOUD FUNCTIONS
-
AZURE FUNCTIONS
-
Webtask
-
Iron.io
-
IBM OpenWhisk
https://cloud.google.com/functions/
https://azure.microsoft.com/en-us/services/functions/
AWS LAMBDA vs HEROKU

-
heroku: FOCUS ON THE application level
-
LAMBDA: FOCUS ON THE single function level
paas vs serverless
HOW TO LAMBDA

OUR PROJECT BUILT ON LAMBDA

-
THE PROJECT
-
THE architecture
-
THE CODE
-
LESSONS LEARNED
A SOCIAL NETWORK FOR fashion PHOTOGRAPHERS
THE PROJECT

-
~ 150k photographers
-
~ 400k PHOTOS
-
~ 3k uploaded images each day
-
2 photo editors
A SOCIAL NETWORK FOR fashion and ART PHOTOGRAPHERS
The Architecture


The client is an AngularJS app
THE LAMBDA IS IN NODE.JS
introducing the serverless framework

Build web, mobile and IoT applications with serverless architectures using AWS Lambda and API GATEWAY

serverless framework

-
HELPS IN DRIVING YOUR DEVELOPMENT ON A CLEAR PATH, HIDING ALL THE WORK NEEDED TO CONFIGURE, WIRE AND UPLOAD A LAMBDA TO AWS
-
RUN/TEST AWS LAMBDA FUNCTIONS LOCALLY, OR REMOTELY
-
AUTO-DEPLOYS, VERSIONS & ALIASES LAMBDA FUNCTIONS AND API ENDPOINTS
-
INTERACTIVE CLI DASHBOARD TO EASILY SELECT AND DEPLOY FUNCTIONS AND ENDPOINTS
The code: a function definition

{
"name": "photosAll",
"customName": false,
"customRole": false,
"handler": "photos/photosAll/handler.handler",
"runtime": "nodejs4.3",
"timeout": 6,
"memorySize": 1024,
"custom": {},
"endpoints": [
{
"path": "photos",
"method": "GET",
"type": "AWS",
"authorizationType": "none",
"authorizerFunction": false,
"apiKeyRequired": false,
"requestParameters": {},
"requestTemplates": "$${apiRequestTemplate}",
"responses": "$${apiResponses}"
}
],
"events": [],
"vpc": {
"securityGroupIds": ["${securityGroupId}"],
"subnetIds": ["${subnetId}"]
},
"environment": "$${environment}"
}
The code: a Handler

'use strict';
var PhotoRepository = require('../../lib/photo/PhotoRepository');
var PhotographerRepository = require('../../lib/photographer/PhotographerRepository');
var PhotoDetail = require('../../lib/photo/PhotoDetail');
var LambdaRequest = require('../../lib/LambdaRequest');
var Auth = require('../../lib/Auth');
module.exports.handler = function(event, context) {
var request = new LambdaRequest(event, context);
var loggedPhotographer;
Auth.getUser(request.getParams())
.then(function(user) {
if (!user) {
return null;
}
return PhotographerRepository.findByUserId(user.getId());
})
.then(function(photographer) {
loggedPhotographer = photographer;
return PhotoRepository.findAllApprovedBy(request.getParams());
})
.then(function(collection) {
var jsonCollection = collection.toJSON();
jsonCollection.items.map((photo) => PhotoDetail(photo, loggedPhotographer));
return jsonCollection;
})
.then(request.succeed)
.catch(request.fail)
.finally(request.tearDown);
};
Thanks!
@pierodibello
@xpeppers
