SlideShare a Scribd company logo
SERVERLESS
MARIUSZ RICHTSCHEID
GLIWICE, 28.01.2020
SERVERLESS NODE.JS
ABOUT ME
‣ LEAD NODE.JS DEVELOPER IN
THE SOFTWARE HOUSE

‣ RICHTSCHEID@GMAIL.COM

‣ LINKEDIN.COM/IN/RICHTSCHEID

‣ GITHUB.COM/BAROGRAFMARIUSZ RICHTSCHEID
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
ARE THERE SERVERS IN SERVERLESS?
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
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.
SHOULD I BOTHER?
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)
SERVERLESS NODE.JS
THERE ARE ALWAYS SOME CONS
‣ VENDOR CONTROL AND LOCK-IN

‣ STATELESS, NO LONG-RUNNING PROCESSES

‣ LIMITS ON EXECUTION TIME, MEMORY
MOST COMMON CLOUD COMPUTING
SERVICE MODELS
SOURCE: HTTPS://MEDIUM.COM/@SDORZAK/WHY-SERVERLESS-IS-THE-NEW-BLACK-E4FF9E9947E0
‣ AMAZON EC2

‣ GOOGLE
COMPUTE
ENGINE
‣ AWS LAMBDA

‣ GOOGLE
CLOUD
FUNCTIONS
‣ AWS ELASTIC
BEANSTALK 

‣ HEROKU

‣ GOOGLE APP
ENGINE
YOU MANAGE
{
IAAS
‣ GOOGLE APPS

‣ SALESFORCE

‣ DROPBOX
{PROVIDER
PAAS FAAS SAAS
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
WHICH PROVIDER TO CHOOSE?
Serverless architecture: introduction & first steps
Serverless architecture: introduction & first steps
SERVERLESS NODE.JS
INTRODUCING LAMBDA
‣ VARIOUS RUNTIMES: GO, .NET, JAVA, RUBY, PYTHON, NODE.JS (V10, V12)

‣ PRICING

• 1M REQUESTS FREE

• $0.20 PER 1M REQUESTS THEREAFTER

• 400,000 GB-SECONDS FREE

• $0.00001667 GB-SECOND THEREAFTER
SERVERLESS NODE.JS
INTRODUCING LAMBDA
‣ LIMITS

• MEMORY RANGE - FROM 128MB TO 3008MB

• MAX EXECUTION DURATION - 15MIN

• CONCURRENT EXECUTIONS - 1000 (DEFAULT, CAN BE INCREASED)

• DEPLOYMENT PACKAGE SIZE - 50MB (ZIPPED) OR 250MB (UNZIPPED)
CHOOSING THE RIGHT FRAMEWORK
BUT WHY DO WE NEED
FRAMEWORK AT ALL?
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
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)
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)
HELLO WORLD EXAMPLE
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.
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
SERVERLESS NODE.JS
HELLO WORLD EXAMPLE
SERVERLESS NODE.JS
WHAT HAS JUST HAPPENED?
FUNCTIONFIRST INVOCATION RESULT
COLD START
CONTAINER
FUNCTIONSECOND INVOCATION RESULT
CONTAINER
EPHEMERAL CACHE
MIGRATING BABELSHEET TO
SERVERLESS
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
SERVERLESS NODE.JS
BABELSHEET BEFORE FAAS
SERVERLESS NODE.JS
BABELSHEET AFTER FAAS
WHAT ARE THE STEPS TO MIGRATE APP?
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
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
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"));
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)
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)
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);
SERVERLESS NODE.JS
PRODUCER MAIN LOGIC
async function main() {
const spreadsheetData = await container
.resolve<GoogleSheets>("googleSheets")
.fetchSpreadsheet();
const transformedData = await container
.resolve<ITransformer>("transformer")
.transform(spreadsheetData);
container
.resolve<TranslationsStorage>("translationsStorage")
.setTranslations(transformedData);
}
SERVERLESS NODE.JS
PRODUCER ENTRY POINT (BEFORE)
import * as scheduler from "node-schedule";
scheduler.scheduleJob("* * * * *", () => {
main();
});
SERVERLESS NODE.JS
PRODUCER FUNCTION HANDLER (AFTER)
export const handler = async (event, context) => {
try {
await main();
} catch (error) {
return {
body: error.message || "Internal server error",
statusCode: error.statusCode || 500
};
}
return {
body: JSON.stringify({ result: "ok" }),
statusCode: 200
};
};
SERVERLESS NODE.JS
PROVISIONING CONFIG (PROVIDER)
service: serverless-translations
plugins:
- serverless-plugin-typescript
provider:
name: aws
runtime: nodejs12.x
stage: dev
region: us-east-1
environment:
DYNAMODB_TABLE: ${self:service}-${opt:stage, self:provider.stage}
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource: "arn:aws:dynamodb:${opt:region,
self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"
SERVERLESS NODE.JS
PROVISIONING CONFIG (PROVIDER)
service: serverless-translations
plugins:
- serverless-plugin-typescript
provider:
name: aws
runtime: nodejs12.x
stage: dev
region: us-east-1
environment:
DYNAMODB_TABLE: ${self:service}-${opt:stage, self:provider.stage}
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource: "arn:aws:dynamodb:${opt:region,
self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"
SERVERLESS NODE.JS
PROVISIONING CONFIG (PROVIDER)
service: serverless-translations
plugins:
- serverless-plugin-typescript
provider:
name: aws
runtime: nodejs12.x
stage: dev
region: us-east-1
environment:
DYNAMODB_TABLE: ${self:service}-${opt:stage, self:provider.stage}
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource: "arn:aws:dynamodb:${opt:region,
self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"
SERVERLESS NODE.JS
PROVISIONING CONFIG (FUNCTIONS)
functions:
api:
handler: src/api/serverless.handler
events:
- http: ANY /
- http: "ANY {proxy+}"
producer:
handler: src/producer/serverless.handler
environment:
token: ${ssm:token~true}
CLIENT_ID: ${ssm:CLIENT_ID~true}
CLIENT_SECRET: ${ssm:CLIENT_SECRET~true}
events:
- schedule: rate(5 minutes)
SERVERLESS NODE.JS
PROVISIONING CONFIG (FUNCTIONS)
functions:
api:
handler: src/api/serverless.handler
events:
- http: ANY /
- http: "ANY {proxy+}"
producer:
handler: src/producer/serverless.handler
environment:
token: ${ssm:token~true}
CLIENT_ID: ${ssm:CLIENT_ID~true}
CLIENT_SECRET: ${ssm:CLIENT_SECRET~true}
events:
- schedule: rate(5 minutes)
SERVERLESS NODE.JS
PROVISIONING CONFIG (FUNCTIONS)
functions:
api:
handler: src/api/serverless.handler
events:
- http: ANY /
- http: "ANY {proxy+}"
producer:
handler: src/producer/serverless.handler
environment:
token: ${ssm:token~true}
CLIENT_ID: ${ssm:CLIENT_ID~true}
CLIENT_SECRET: ${ssm:CLIENT_SECRET~true}
events:
- schedule: rate(5 minutes)
SERVERLESS NODE.JS
PROVISIONING CONFIG (RESOURCES)
resources:
Resources:
TranslationsDynamoDbTable:
Type: "AWS::DynamoDB::Table"
DeletionPolicy: Delete
Properties:
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
TableName: ${self:provider.environment.DYNAMODB_TABLE}
SERVERLESS NODE.JS
AWS CONSOLE PREVIEW AFTER DEPLOY
SERVERLESS NODE.JS
INVOKING A FUNCTION
SERVERLESS NODE.JS
CHECKING APP METRICS
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
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
SERVERLESS NODE.JS
WORTH KNOWING
‣ AWS STEP FUNCTIONS

‣ LAMBDA LAYERS

‣ BLUE/GREEN
DEPLOYMENTS

‣ GRAPHQL ENDPOINTS

‣ GOOGLE CLOUD RUN
(KNATIVE)
THANK YOU!
ICONS MADE BY ICON POND FROM WWW.FLATICON.COM 
HTTP://TSH.IO/MICROSERVICES
NEWSLETTER FOR DEVS AND TECH LEADERS
HTTPS://TSH.IO/NEWSLETTER

More Related Content

PDF
Large Scale Kubernetes on AWS at Europe's Leading Online Fashion Platform - A...
PPT
Sebastien goasguen cloud stack and docker
PPTX
Building a Web Frontend with Microservices and NGINX Plus
PPTX
Building Micro-Services with Scala
PDF
Nginx conference 2015
PDF
4 JVM Web Frameworks
PDF
Kubernetes on AWS
PDF
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
Large Scale Kubernetes on AWS at Europe's Leading Online Fashion Platform - A...
Sebastien goasguen cloud stack and docker
Building a Web Frontend with Microservices and NGINX Plus
Building Micro-Services with Scala
Nginx conference 2015
4 JVM Web Frameworks
Kubernetes on AWS
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...

What's hot (20)

PDF
JavaDay Lviv: Serverless Archtiectures
PPTX
Continuous Delivery and Infrastructure as Code
PPTX
ASP.NET vNext
PDF
Riga Dev Day 2016 - Microservices with Apache Camel & fabric8 on Kubernetes
PPT
Sebastien goasguen cloud stack the next year
PPTX
Netflix0SS Services on Docker
PDF
[GID Live] Open-Source Cloud-Native Programming Language
PDF
Kubernetes for Serverless - Serverless Summit 2017 - Krishna Kumar
PPTX
NGINX Installation and Tuning
PPTX
Run your Dockerized ASP.NET application on Windows and Linux!
PDF
Docker in Production at the Aurora Team
PDF
Service Discovery 101
PPTX
Externalized Spring Boot App Configuration
PPTX
Microservices and Container Management with NGINX Plus and Mesosphere DC/OS
PDF
2017 Microservices Practitioner Virtual Summit: The Mechanics of Deploying En...
PPTX
What's New in NGINX Plus R10?
PPTX
Gatekeeper: API gateway
PDF
What is the State of my Kafka Streams Application? Unleashing Metrics. | Neil...
PPTX
Building occasionally connected applications using event sourcing
PDF
Andrea Di Persio
JavaDay Lviv: Serverless Archtiectures
Continuous Delivery and Infrastructure as Code
ASP.NET vNext
Riga Dev Day 2016 - Microservices with Apache Camel & fabric8 on Kubernetes
Sebastien goasguen cloud stack the next year
Netflix0SS Services on Docker
[GID Live] Open-Source Cloud-Native Programming Language
Kubernetes for Serverless - Serverless Summit 2017 - Krishna Kumar
NGINX Installation and Tuning
Run your Dockerized ASP.NET application on Windows and Linux!
Docker in Production at the Aurora Team
Service Discovery 101
Externalized Spring Boot App Configuration
Microservices and Container Management with NGINX Plus and Mesosphere DC/OS
2017 Microservices Practitioner Virtual Summit: The Mechanics of Deploying En...
What's New in NGINX Plus R10?
Gatekeeper: API gateway
What is the State of my Kafka Streams Application? Unleashing Metrics. | Neil...
Building occasionally connected applications using event sourcing
Andrea Di Persio
Ad

Similar to Serverless architecture: introduction & first steps (20)

PDF
BUILDING Serverless apps with MongoDB AtLAS, AWS Lambda and Step Functions
PDF
Going Serverless on AWS with Golang and SAM
PDF
Serverless Apps on Google Cloud: more dev, less ops
PDF
Serverless Apps on Google Cloud: more dev, less ops
PDF
Čtvrtkon #64 - AWS Serverless - Michal Haták
PDF
The Good Parts / The Hard Parts
PDF
Building a Serverless company with Node.js, React and the Serverless Framewor...
PPTX
A Node.js Developer's Guide to Bluemix
PDF
Serverless Framework Workshop - Tyler Hendrickson, Chicago/burbs
PDF
Aws Lambda in Swift - NSLondon - 3rd December 2020
PDF
More efficient, usable web
PDF
Client-Server-Kommunikation mit dem Command Pattern
PDF
Top conf serverlezz
PPTX
AWS Webinar 23 - Getting Started with AWS - Understanding total cost of owner...
PDF
Future of Serverless
PPTX
AWS Lambda, Step Functions & MongoDB Atlas Tutorial
PPTX
The Good, Bad and Ugly of Serverless
PDF
What’s new in serverless - re:Invent 2020
PDF
AWS Community Day 2022 Dhiraj Mahapatro_AWS Lambda under the hood _ Best Prac...
PDF
Serveless design patterns
BUILDING Serverless apps with MongoDB AtLAS, AWS Lambda and Step Functions
Going Serverless on AWS with Golang and SAM
Serverless Apps on Google Cloud: more dev, less ops
Serverless Apps on Google Cloud: more dev, less ops
Čtvrtkon #64 - AWS Serverless - Michal Haták
The Good Parts / The Hard Parts
Building a Serverless company with Node.js, React and the Serverless Framewor...
A Node.js Developer's Guide to Bluemix
Serverless Framework Workshop - Tyler Hendrickson, Chicago/burbs
Aws Lambda in Swift - NSLondon - 3rd December 2020
More efficient, usable web
Client-Server-Kommunikation mit dem Command Pattern
Top conf serverlezz
AWS Webinar 23 - Getting Started with AWS - Understanding total cost of owner...
Future of Serverless
AWS Lambda, Step Functions & MongoDB Atlas Tutorial
The Good, Bad and Ugly of Serverless
What’s new in serverless - re:Invent 2020
AWS Community Day 2022 Dhiraj Mahapatro_AWS Lambda under the hood _ Best Prac...
Serveless design patterns
Ad

More from The Software House (20)

PDF
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
PDF
Uszanowanko Podsumowanko
PDF
Jak efektywnie podejść do certyfikacji w AWS?
PDF
O co chodzi z tą dostępnością cyfrową?
PDF
Chat tekstowy z użyciem Amazon Chime
PDF
Migracje danych serverless
PDF
Jak nie zwariować z architekturą Serverless?
PDF
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
PDF
Feature flags na ratunek projektu w JavaScript
PDF
Typowanie nominalne w TypeScript
PDF
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
PDF
Serverless Compose vs hurtownia danych
PDF
Testy API: połączenie z bazą danych czy implementacja w pamięci
PDF
Jak skutecznie read model. Case study
PDF
Firestore czyli ognista baza od giganta z Doliny Krzemowej
PDF
Jak utrzymać stado Lambd w ryzach
PDF
Jak poskromić AWS?
PDF
O łączeniu Storyblok i Next.js
PDF
Amazon Step Functions. Sposób na implementację procesów w chmurze
PDF
Od Figmy do gotowej aplikacji bez linijki kodu
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Uszanowanko Podsumowanko
Jak efektywnie podejść do certyfikacji w AWS?
O co chodzi z tą dostępnością cyfrową?
Chat tekstowy z użyciem Amazon Chime
Migracje danych serverless
Jak nie zwariować z architekturą Serverless?
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Feature flags na ratunek projektu w JavaScript
Typowanie nominalne w TypeScript
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Serverless Compose vs hurtownia danych
Testy API: połączenie z bazą danych czy implementacja w pamięci
Jak skutecznie read model. Case study
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Jak utrzymać stado Lambd w ryzach
Jak poskromić AWS?
O łączeniu Storyblok i Next.js
Amazon Step Functions. Sposób na implementację procesów w chmurze
Od Figmy do gotowej aplikacji bez linijki kodu

Recently uploaded (20)

PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PPTX
Operating system designcfffgfgggggggvggggggggg
PPTX
ManageIQ - Sprint 268 Review - Slide Deck
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PDF
top salesforce developer skills in 2025.pdf
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PDF
Nekopoi APK 2025 free lastest update
PDF
Softaken Excel to vCard Converter Software.pdf
PDF
System and Network Administraation Chapter 3
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PPTX
CHAPTER 2 - PM Management and IT Context
PPT
Introduction Database Management System for Course Database
PPTX
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
PTS Company Brochure 2025 (1).pdf.......
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
Operating system designcfffgfgggggggvggggggggg
ManageIQ - Sprint 268 Review - Slide Deck
How to Migrate SBCGlobal Email to Yahoo Easily
top salesforce developer skills in 2025.pdf
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
Nekopoi APK 2025 free lastest update
Softaken Excel to vCard Converter Software.pdf
System and Network Administraation Chapter 3
How to Choose the Right IT Partner for Your Business in Malaysia
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
Upgrade and Innovation Strategies for SAP ERP Customers
Which alternative to Crystal Reports is best for small or large businesses.pdf
CHAPTER 2 - PM Management and IT Context
Introduction Database Management System for Course Database
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
VVF-Customer-Presentation2025-Ver1.9.pptx
PTS Company Brochure 2025 (1).pdf.......

Serverless architecture: introduction & first steps

  • 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
  • 4. ARE THERE SERVERS IN 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
  • 10. MOST COMMON CLOUD COMPUTING SERVICE MODELS
  • 11. SOURCE: HTTPS://MEDIUM.COM/@SDORZAK/WHY-SERVERLESS-IS-THE-NEW-BLACK-E4FF9E9947E0 ‣ AMAZON EC2 ‣ GOOGLE COMPUTE ENGINE ‣ AWS LAMBDA ‣ GOOGLE CLOUD FUNCTIONS ‣ AWS ELASTIC BEANSTALK ‣ HEROKU ‣ GOOGLE APP ENGINE YOU MANAGE { IAAS ‣ GOOGLE APPS ‣ SALESFORCE ‣ DROPBOX {PROVIDER PAAS FAAS SAAS
  • 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
  • 13. WHICH PROVIDER TO CHOOSE?
  • 16. SERVERLESS NODE.JS INTRODUCING LAMBDA ‣ VARIOUS RUNTIMES: GO, .NET, JAVA, RUBY, PYTHON, NODE.JS (V10, V12) ‣ PRICING • 1M REQUESTS FREE • $0.20 PER 1M REQUESTS THEREAFTER • 400,000 GB-SECONDS FREE • $0.00001667 GB-SECOND THEREAFTER
  • 17. SERVERLESS NODE.JS INTRODUCING LAMBDA ‣ LIMITS • MEMORY RANGE - FROM 128MB TO 3008MB • MAX EXECUTION DURATION - 15MIN • CONCURRENT EXECUTIONS - 1000 (DEFAULT, CAN BE INCREASED) • DEPLOYMENT PACKAGE SIZE - 50MB (ZIPPED) OR 250MB (UNZIPPED)
  • 18. CHOOSING THE RIGHT FRAMEWORK
  • 19. BUT WHY DO WE NEED FRAMEWORK AT ALL?
  • 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
  • 32. WHAT ARE THE STEPS TO MIGRATE APP?
  • 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);
  • 39. SERVERLESS NODE.JS PRODUCER MAIN LOGIC async function main() { const spreadsheetData = await container .resolve<GoogleSheets>("googleSheets") .fetchSpreadsheet(); const transformedData = await container .resolve<ITransformer>("transformer") .transform(spreadsheetData); container .resolve<TranslationsStorage>("translationsStorage") .setTranslations(transformedData); }
  • 40. SERVERLESS NODE.JS PRODUCER ENTRY POINT (BEFORE) import * as scheduler from "node-schedule"; scheduler.scheduleJob("* * * * *", () => { main(); });
  • 41. SERVERLESS NODE.JS PRODUCER FUNCTION HANDLER (AFTER) export const handler = async (event, context) => { try { await main(); } catch (error) { return { body: error.message || "Internal server error", statusCode: error.statusCode || 500 }; } return { body: JSON.stringify({ result: "ok" }), statusCode: 200 }; };
  • 42. SERVERLESS NODE.JS PROVISIONING CONFIG (PROVIDER) service: serverless-translations plugins: - serverless-plugin-typescript provider: name: aws runtime: nodejs12.x stage: dev region: us-east-1 environment: DYNAMODB_TABLE: ${self:service}-${opt:stage, self:provider.stage} iamRoleStatements: - Effect: Allow Action: - dynamodb:Query - dynamodb:Scan - dynamodb:GetItem - dynamodb:PutItem - dynamodb:UpdateItem - dynamodb:DeleteItem Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"
  • 43. SERVERLESS NODE.JS PROVISIONING CONFIG (PROVIDER) service: serverless-translations plugins: - serverless-plugin-typescript provider: name: aws runtime: nodejs12.x stage: dev region: us-east-1 environment: DYNAMODB_TABLE: ${self:service}-${opt:stage, self:provider.stage} iamRoleStatements: - Effect: Allow Action: - dynamodb:Query - dynamodb:Scan - dynamodb:GetItem - dynamodb:PutItem - dynamodb:UpdateItem - dynamodb:DeleteItem Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"
  • 44. SERVERLESS NODE.JS PROVISIONING CONFIG (PROVIDER) service: serverless-translations plugins: - serverless-plugin-typescript provider: name: aws runtime: nodejs12.x stage: dev region: us-east-1 environment: DYNAMODB_TABLE: ${self:service}-${opt:stage, self:provider.stage} iamRoleStatements: - Effect: Allow Action: - dynamodb:Query - dynamodb:Scan - dynamodb:GetItem - dynamodb:PutItem - dynamodb:UpdateItem - dynamodb:DeleteItem Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"
  • 45. SERVERLESS NODE.JS PROVISIONING CONFIG (FUNCTIONS) functions: api: handler: src/api/serverless.handler events: - http: ANY / - http: "ANY {proxy+}" producer: handler: src/producer/serverless.handler environment: token: ${ssm:token~true} CLIENT_ID: ${ssm:CLIENT_ID~true} CLIENT_SECRET: ${ssm:CLIENT_SECRET~true} events: - schedule: rate(5 minutes)
  • 46. SERVERLESS NODE.JS PROVISIONING CONFIG (FUNCTIONS) functions: api: handler: src/api/serverless.handler events: - http: ANY / - http: "ANY {proxy+}" producer: handler: src/producer/serverless.handler environment: token: ${ssm:token~true} CLIENT_ID: ${ssm:CLIENT_ID~true} CLIENT_SECRET: ${ssm:CLIENT_SECRET~true} events: - schedule: rate(5 minutes)
  • 47. SERVERLESS NODE.JS PROVISIONING CONFIG (FUNCTIONS) functions: api: handler: src/api/serverless.handler events: - http: ANY / - http: "ANY {proxy+}" producer: handler: src/producer/serverless.handler environment: token: ${ssm:token~true} CLIENT_ID: ${ssm:CLIENT_ID~true} CLIENT_SECRET: ${ssm:CLIENT_SECRET~true} events: - schedule: rate(5 minutes)
  • 48. SERVERLESS NODE.JS PROVISIONING CONFIG (RESOURCES) resources: Resources: TranslationsDynamoDbTable: Type: "AWS::DynamoDB::Table" DeletionPolicy: Delete Properties: AttributeDefinitions: - AttributeName: id AttributeType: S KeySchema: - AttributeName: id KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1 TableName: ${self:provider.environment.DYNAMODB_TABLE}
  • 49. SERVERLESS NODE.JS AWS CONSOLE PREVIEW AFTER DEPLOY
  • 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
  • 54. SERVERLESS NODE.JS WORTH KNOWING ‣ AWS STEP FUNCTIONS ‣ LAMBDA LAYERS ‣ BLUE/GREEN DEPLOYMENTS ‣ GRAPHQL ENDPOINTS ‣ GOOGLE CLOUD RUN (KNATIVE)
  • 55. THANK YOU! ICONS MADE BY ICON POND FROM WWW.FLATICON.COM 
  • 57. NEWSLETTER FOR DEVS AND TECH LEADERS HTTPS://TSH.IO/NEWSLETTER