Mariusz Richtscheid: Are you wondering about using serverless computing in your project? In this presentation, I will explain the basics of serverless architecture. I'm using an example of a real-life serverless project done at The Software House called Babelsheet (translation-management solution), and include many practical tips for any beginner starting their adventure with a serverless architecture.
2. SERVERLESS NODE.JS
ABOUT ME
‣ LEAD NODE.JS DEVELOPER IN
THE SOFTWARE HOUSE
‣ RICHTSCHEID@GMAIL.COM
‣ LINKEDIN.COM/IN/RICHTSCHEID
‣ GITHUB.COM/BAROGRAFMARIUSZ RICHTSCHEID
3. SERVERLESS NODE.JS
AGENDA
‣ ARE THERE SERVERS IN SERVERLESS?
‣ SHOULD I BOTHER?
‣ MOST COMMON CLOUD COMPUTING SERVICE MODELS
‣ WHICH PROVIDER TO CHOOSE?
‣ CHOOSING THE RIGHT FRAMEWORK
‣ HELLO WORLD EXAMPLE
‣ MIGRATING TRANSLATIONS SERVICE CALLED BABELSHEET TO
SERVERLESS
5. SERVERLESS NODE.JS
OF COURSE THERE ARE...
‣ SERVERS MANAGEMENT AND PROVISIONING
OUTSOURCED TO VENDOR
‣ DYNAMIC SCALING, NO NEED FOR CAPACITY
PLANNING
‣ PAY ONLY FOR WHAT YOU USE, OPTIMIZE FOR COST
SAVINGS
‣ TIME TO MARKET AND EXPERIMENTATION
6. SERVERLESS NODE.JS
WHAT ABOUT DEVOPS?
‣ A LOT OF IS OUTSOURCED BUT...
‣ YOU STILL NEED TO MONITOR YOUR APPLICATION
‣ AND HAVE STRATEGY FOR DEPLOYMENTS
‣ ALSO CONSIDER SECURITY, NETWORKING,
DEBUGGING, WHOLE SYSTEM SCALING, ETC.
8. SERVERLESS NODE.JS
‣ POSTLIGHT READABILITY API BEFORE SERVERLESS
• $10,000 MONTHLY COST
• 39 MILLION REQUESTS PER MONTH (AROUND 15 PER SECOND)
‣ AFTER SERVERLESS
• NEW SERVICE NAME IS MERCURY WEB PARSER
• $370 MONTHLY COST (API GATEWAY + LAMBDA)
9. SERVERLESS NODE.JS
THERE ARE ALWAYS SOME CONS
‣ VENDOR CONTROL AND LOCK-IN
‣ STATELESS, NO LONG-RUNNING PROCESSES
‣ LIMITS ON EXECUTION TIME, MEMORY
12. SERVERLESS NODE.JS
PAAS VS FAAS
‣ SYSTEM RUNS SERVER
PROCESS WHICH HANDLES
REQUESTS
‣ SCALING MEANS ADDING MORE
PROCESSES
‣ CHARGE PER RUNNING TIME
‣ NO LONG-RUNNING PROCESSES,
EACH REQUEST HANDLED BY
FUNCTION EXECUTION
‣ SCALING MEANS EXECUTING
MORE FUNCTIONS CONCURRENTLY
‣ CHARGE PER EXECUTION
20. SERVERLESS NODE.JS
PROS OF HAVING A FRAMEWORK
‣ AUTOMATES WHAT CAN BE DONE WITH AWS
CONSOLE OR CLI
‣ TRANSLATES SIMPLE CONFIGURATION FILE
INTO COMPLEX INFRASTRUCTURE
(CLOUDFORMATION UNDER THE HOOD)
‣ USUALLY PLUGGABLE
21. SERVERLESS NODE.JS
CHOOSING THE RIGHT FRAMEWORK
‣ PLATFORM AGNOSTIC (IN THEORY)
‣ MORE DEPLOYMENT OPTIONS
(MULTIPLE PROVIDERS, LESS
COMMANDS)
‣ WORSE INFRASTRUCTURE
EMULATION
AWS
SAM
‣ FOR AWS ONLY
‣ LESS DEPLOYMENT OPTIONS
‣ BETTER INFRASTRUCTURE
EMULATION (API GATEWAY,
LAMBDA API, FAKE EVENTS)
22. SERVERLESS NODE.JS
CHOOSING THE RIGHT FRAMEWORK
‣ PLATFORM AGNOSTIC (IN THEORY)
‣ MORE DEPLOYMENT OPTIONS
(MULTIPLE PROVIDERS, LESS
COMMANDS)
‣ WORSE INFRASTRUCTURE
EMULATION
AWS
SAM
‣ FOR AWS ONLY
‣ LESS DEPLOYMENT OPTIONS
‣ BETTER INFRASTRUCTURE
EMULATION (API GATEWAY,
LAMBDA API, FAKE EVENTS)
24. SERVERLESS NODE.JS
HELLO WORLD EXAMPLE
exports.handler = async
(event, context) => {
return {
statusCode: 200,
body: 'hello world'
};
};
INDEX.JS
‣EVENT
• INPUT DATA FROM OTHER SOURCES
‣CONTEXT
• REMAINING TIME
• REQUEST ID
• FUNCTION NAME
• ETC.
25. SERVERLESS NODE.JS
service: hello-world
provider:
name: aws
runtime: nodejs12.x
stage: dev
region: us-east-1
functions:
api:
handler: index.handler
events:
- http: ANY /
- http: 'ANY {proxy+}'
SERVERLESS.YML
HELLO WORLD EXAMPLE
‣EVENTS FROM:
• S3
• DYNAMODB
• SIMPLE NOTIFICATION SERVICE
• SIMPLE EMAIL SERVICE
• CLOUDFORMATION
• ALEXA
27. SERVERLESS NODE.JS
WHAT HAS JUST HAPPENED?
FUNCTIONFIRST INVOCATION RESULT
COLD START
CONTAINER
FUNCTIONSECOND INVOCATION RESULT
CONTAINER
EPHEMERAL CACHE
29. SERVERLESS NODE.JS
BABELSHEET
‣ TRANSLATIONS MANAGEMENT SYSTEM
‣ GOOGLE SPREADSHEET AS A USER INTERFACE
‣ GENERATES TRANSLATIONS IN VARIOUS FORMATS
THROUGH CLI OR WEB SERVER
‣ AVAILABLE AT HTTPS://GITHUB.COM/
THESOFTWAREHOUSE/BABELSHEET-JS
33. SERVERLESS NODE.JS
THINGS TO START WITH
‣ MIGHT BE STATEFUL
‣ SUPPORTS LONG-RUNNING
PROCESSES
BEFORE FAAS
‣ MUST BE STATELESS
‣ NO LONG-RUNNING
PROCESSES
AFTER FAAS
34. SERVERLESS NODE.JS
MORE STEPS FOR MIGRATION
‣ USE ENVIRONMENT VARIABLES TO PROVIDE CONFIG
‣ MAKE STORAGE ABSTRACTION, INJECT PROPER
STORAGE IMPLEMENTATION TO IOC CONTAINER
‣ WRITE FUNCTIONS HANDLERS (MORE OR LESS
GRANULAR)
‣ PREPARE STACK PROVISIONING
35. SERVERLESS NODE.JS
API ENTRY POINT (BEFORE)
import * as awilix from "awilix";
import * as dotenv from "dotenv";
import RedisStorage from "../shared/storage/redis";
import createContainer from "./container";
import Server from "./server/server";
dotenv.config();
const container = createContainer({
storage: awilix.asClass(RedisStorage)
});
const server = container.resolve<Server>("server").getApp();
server.listen(container.resolve("port"));
36. SERVERLESS NODE.JS
import * as awilix from "awilix";
import * as dotenv from "dotenv";
import RedisStorage from "../shared/storage/redis";
import createContainer from "./container";
import Server from "./server/server";
dotenv.config();
const container = createContainer({
storage: awilix.asClass(RedisStorage)
});
const server = container.resolve<Server>("server").getApp();
server.listen(container.resolve("port"));
API ENTRY POINT (BEFORE)
37. SERVERLESS NODE.JS
import * as awilix from "awilix";
import * as dotenv from "dotenv";
import * as serverless from "serverless-http";
import DynamoDbStorage from "../shared/storage/dynamoDb";
import createContainer from "./container";
import Server from "./server/server";
dotenv.config();
const container = createContainer({
storage: awilix.asClass(DynamoDbStorage)
});
const server = container.resolve<Server>("server").getApp();
export const handler = serverless(server);
API FUNCTION HANDLER (AFTER)
38. SERVERLESS NODE.JS
API FUNCTION HANDLER (AFTER)
import * as awilix from "awilix";
import * as dotenv from "dotenv";
import * as serverless from "serverless-http";
import DynamoDbStorage from "../shared/storage/dynamoDb";
import createContainer from "./container";
import Server from "./server/server";
dotenv.config();
const container = createContainer({
storage: awilix.asClass(DynamoDbStorage)
});
const server = container.resolve<Server>("server").getApp();
export const handler = serverless(server);
52. SERVERLESS NODE.JS
OPTIMIZATION STEPS
‣ HTTP CACHE ON API GATEWAY (REDUCE TIME,
COST)
‣ LOWER MEMORY LIMIT
‣ USE EXECUTION CONTEXT FOR LOCAL CACHE
‣ USE FAST STORAGE SOLUTION, E.G. REDIS
53. SERVERLESS NODE.JS
SUMMARY
‣ CALCULATE IF IT IS
FOR YOU, CONSIDER
PRICING AND
LIMITATIONS
‣ CHOOSE PROPER
PROVIDER AND
FRAMEWORK
‣ PREPARE YOUR APP
FOR GOING
SERVERLESS
‣ WRITE FUNCTION
HANDLERS,
PROVISIONING CONFIG
‣ DEPLOY, OPTIMIZE,
REPEAT