Slide 1

Slide 1 text

Python Serverless Microservices Workshop Nilo Ney Coutinho Menezes ([email protected])

Slide 2

Slide 2 text

Plan • Short introduction to serverless • Examples: 1. Simple Example 2. Show IP and country 3. URL Shortener

Slide 3

Slide 3 text

Serverless Application Framework • Written in JavaScript, but works with multiple languages • Uses Node, Python and Chocolatey (alternative Windows Package Manager) • Deploys the serverless infrastructure in the cloud. Compatible with Amazon Web Services, Google Cloud, Microsoft Azure and others • Simplifies configuration and application updates • Configuration files written in YAML • https://www.serverless.com/

Slide 4

Slide 4 text

Server less? • We know the server still there • But we don’t have to keep it running • We don’t have to update it frequently • We can have more as we need them (autoscaling) • We only pay if we use them (per call, memory and run time) • So, it is an industry term to say somebody else is taking care of the server for you.

Slide 5

Slide 5 text

Microservices • Microservices are an architecture for development and deployment of new systems • It antagonizes the traditional monolithic architecture that deploys the full system in a single application • Microservices means we should split our systems into smaller ones • Smaller parts are easy to understand, can be deployed independently • Share no database with other parts • Share data and services via a well-defined API • Can be rewritten one by one (less coupling)

Slide 6

Slide 6 text

Lambdas • Lambdas are Functions as a Service (FaaS) provided by Amazon Web Services (AWS) • We will be using AWS as our example provider • You need to have an account to test the code shown in this presentation • You can create a free account on their web site: https://aws.amazon.com/ • If it is your first time on AWS, I strongly suggest you check their web site and documentation, as you will be paying for the resources used beyond the free tier. • To start using AWS with Python, install their command-line client: pip install awscli

Slide 7

Slide 7 text

Python Serverless Microservices • Because we use Python • Because we use AWS Lambdas, FaaS, serverless • And we would divide each API call in a different lambda, grouped in a domain, following the directives of Microservices and Domain-Driven Design (DDD). Check these books for more info:

Slide 8

Slide 8 text

1 – Simple example

Slide 9

Slide 9 text

Installing • Download and install node.js from https://nodejs.org/en/ • Install the Serverless Application Framework: npm install –g serverless • Let’s created the application stub type: serverless • Try to answer the questions as in the image below:

Slide 10

Slide 10 text

The stub application: handler.py • Please rename the file to hello.py

Slide 11

Slide 11 text

Serverless.yml • This is all the configuration we need for our simple function. • It says we are going to deploy a Python 3.8 Lambda Function • It defines the handler (the module and function name) • It also specifies the URL path to use and the http method

Slide 12

Slide 12 text

Deploying • Serverless will deploy all we need with a single command sls deploy • Your urls will be different.

Slide 13

Slide 13 text

Visiting our new page Go to: https://dg68p0g319.execute-api.eu-west-1.amazonaws.com/dev/pyconse2020/hello Or https://bit.ly/PyConSE-Hello

Slide 14

Slide 14 text

The super user-friendly page :-D

Slide 15

Slide 15 text

What is in this json? • In the input field, all parameters passed to your function • Copy and paste it to your preferred text editor that supports JSON. Reformat the code to make it easier to read. • You get user location with IP and country information • The URL and path used on this call • Any parameter used (query string and path) if any • You can access all these values as in simple Python dictionary

Slide 16

Slide 16 text

What do we have now

Slide 17

Slide 17 text

2 – Showing IP and Country

Slide 18

Slide 18 text

Showing our IP and country • Using just the headers available to our lambda, let’s display a simple page with the callers IP and country. • We need to return a html page now. • Better use templates to offload the work to Jinja2 pip install jinja2 • We also must tell serverless to deploy or modules with the lambda function sls plugin install -n serverless-python- requirements

Slide 19

Slide 19 text

Show me the code

Slide 20

Slide 20 text

Let’s test it

Slide 21

Slide 21 text

3 – URL Shortener

Slide 22

Slide 22 text

URL Shortener • I suppose you will get a short domain name :-D • Simple service  Get URL  Return link with short code  When the short code is accessed: - Count access (increment database field) - Redirect user to the URL - Codes will be deleted after 2 days

Slide 23

Slide 23 text

What we will do • We will reuse the same function to process GET and POST requests • GET will show a simple form with a field to enter the URL • POST will process the user input, create a record in the database and return a page with the links created. • Another function will get the code and redirect to the user url, incrementing the counter.

Slide 24

Slide 24 text

We need a table • Let’s ask serverless to create a table for us.

Slide 25

Slide 25 text

The Database • We are using DynamoDB • It is a key value database in AWS • It is also serverless and we pay for the storage and requests made • Super fast • Scalable • Does not support SQL • Really odd at the beginning

Slide 26

Slide 26 text

Our table • We designed a very simple table with a hash key (primary key) • All other fields are free, no schema • Using PynamoDB to interact with DynamoDB API

Slide 27

Slide 27 text

PynamoDB Operations Checking if a key already exists Creating a new record Querying data Updating the counter

Slide 28

Slide 28 text

What did we do?

Slide 29

Slide 29 text

In serverless • We create two functions • One for create that handles GETs and POST • Another one that handles GETs • Look how their urls are different. The function is chosen by pattern matching • In the useURL, the {short_key} is a parameter passed to the lambda in the event • We are using layers for dependencies • And a role to have access to the database

Slide 30

Slide 30 text

How does it look?

Slide 31

Slide 31 text

Wait, no huge framework? • Nope • You have a very simple function deployed to the cloud • You choose the batteries • You can combine multiple Python libraries depending on your needs • Leverage the cloud provider services like databases, api gateways, queues, etc

Slide 32

Slide 32 text

Advantages • Simple, you can read the function from top to bottom, no hidden magic code • Cheap, millions of invocations for less than 1 euro • Pays as you go (no upfront costs, if you don’t use, you won’t pay either) • Functions can be deployed independently • No downtime, old version keeps running until the new one is deployed

Slide 33

Slide 33 text

Disadvantages • As any new thing can be difficult at the beginning • You get dependent to a cloud provider • More tools to use • Lack of framework to start with

Slide 34

Slide 34 text

What’s next • Add more functions • Play with AWS Cognito to support authenticated users • Read about lambda layers • Other frameworks to help with Lambdas and Python:  AWS Chalice https://github.com/aws/chalice  AWS SAM https://aws.amazon.com/serverless/sam/

Slide 35

Slide 35 text

Thank you • All the code is hosted on GitHub https://github.com/lskbr/pyconse2020 • You may find this presentation on SpeakerDeck https://speakerdeck.com/lskbr • If you have any questions, do not hesitate to contact me: [email protected] @lskbr on Twitter and Telegram