Slide 1

Slide 1 text

Portable Serverless Apps Danilo Poccia Evangelist, Serverless Amazon Web Services @danilop danilop [email protected]

Slide 2

Slide 2 text

Serverless is for Builders

Slide 3

Slide 3 text

How to Build a Serverless “Hello World” ?

Slide 4

Slide 4 text

"use strict"; console.log('Loading function'); exports.handler = async (event, context) => { console.log('request: ' + JSON.stringify(event)); let name; // default value is undefined if (event.queryStringParameters != null) { name = event.queryStringParameters.name; } console.log('name: ', name); if ((name == undefined) || (name == '')) { name = 'World'; } const greetings = 'Hello ' + name + '!'; console.log('greetings: ', greetings); const responseCode = 200; const responseBody = { message: greetings; }; const response = { statusCode: responseCode, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(responseBody) }; console.log('response: ' + JSON.stringify(response)); return buildResponse(); }; { “message": "Hello Danilo!” } { “message": "Hello World!” }

Slide 5

Slide 5 text

Event Function Your Business Logic Share Result

Slide 6

Slide 6 text

“use strict"; console.log('Loading function'); // Your business logic function greetingsFor(name) { console.log('name: ', name); if ((name == undefined) || (name == '')) { name = 'World'; } const greetings = 'Hello ' + name + '!'; console.log('greetings: ', greetings); return greetings; } // Event wrapper for Amazon API Gateway exports.handler = async (event, context) => { let buildResponse = (message) => { const responseCode = 200; const responseBody = { message: message }; const response = { statusCode: responseCode, headers: { 'Content-Type' : 'application/json' }, body: JSON.stringify(responseBody) }; console.log('response: ' + JSON.stringify(response)); return response; }; console.log('request: ' + JSON.stringify(event)); let name; // default value is undefined if (event.queryStringParameters != null) { name = event.queryStringParameters.name; } return buildResponse(greetingsFor(name)); }; // If not running on AWS Lambda, use Express if (!(process.env.LAMBDA_TASK_ROOT && process.env.AWS_EXECUTION_ENV)) { const express = require('express'); const app = express(); let buildResponse = (message) => { const responseBody = { message: message }; const response = JSON.stringify(responseBody); console.log('response: ' + response); return response; }; app.get('/', function (req, res) { res.send( buildResponse(greetingsFor(req.query.name)) ); }); console.log("Listening..."); app.listen(process.env.PORT || 3000); } Business Logic Event Wrapper Web Interface

Slide 7

Slide 7 text

Business Logic Docker Container AWS Lambda

Slide 8

Slide 8 text

"use strict"; console.log('Loading function'); // Your business logic function greetingsFor(name) { console.log('name: ', name); if ((name == undefined) || (name == '')) { name = 'World'; } const greetings = 'Hello ' + name + '!'; console.log('greetings: ', greetings); return greetings; } "use strict"; const app = require('../../app.js'); const chai = require('chai'); const expect = chai.expect; var event, context; describe('Tests index', function () { it('verifies successful response', async () => { const result = await app.lambda_handler(event, context, (err, result) => { expect(result).to.be.an('object'); expect(result.statusCode).to.equal(200); expect(result.body).to.be.an('string'); let response = JSON.parse(result.body); expect(response).to.be.an('object'); expect(response.message).to.be.equal("Hello World!”); expect(response.location).to.be.an("string"); }); }); }); Business Logic Unit Tests

Slide 9

Slide 9 text

Event Context Function Your Business Logic Share Result Unit Test

Slide 10

Slide 10 text

greetingsFor.js event_APIGateway.js event_Kinesis.js app.js Platform Business Logic Adapter Amazon
 API Gateway Kinesis Data Stream Users Docker Container

Slide 11

Slide 11 text

Portable App Clean Code Segregation of Concerns Adapter Pattern

Slide 12

Slide 12 text

Portable Serverless Apps Danilo Poccia Evangelist, Serverless Amazon Web Services @danilop danilop [email protected]