Cloud Parallelism
with Serverless

bene@theodo.co.uk
Ben Ellerby

@EllerbyBen

Ben Ellerby

@EllerbyBen

serverless-transformation

@EllerbyBen

Serverless

What is this Serverless thing?

  • Architectural movement
    • “allows you to build and run applications and services without thinking about servers” — AWS
    • Developers send application code which is run by the cloud provider in isolated containers abstracted from the developer.
    • Use 3rd party services used to manage backend logic and state (e.g. Firebase, Cognito)
  • A framework with the same name

 

@EllerbyBen

Why Serverless?

💰 Cost reduction

👷‍♂️ #NoOps... well LessOps

💻 Developers focus on delivering                   business value

📈 More scalable

🌳 Greener

@EllerbyBen

@EllerbyBen

Lambda

Runtimes

@EllerbyBen

Runtimes

@EllerbyBen

@EllerbyBen

3.8 3.7, 3.6, 2.7

A Simple Function

@EllerbyBen

def handler_name(event, context): 
    ...
    return some_value

Event:  The event body

dict, list, str, int, float, or NoneType

 

Context:  Meta Data

dict

 

 

A Simple Function

@EllerbyBen

def my_handler(event, context):
    message = 'Hello {} {}!'.format(event['first_name'], 
                                    event['last_name'])  
    return { 
        'message' : message
    }  

Handler Function

@EllerbyBen

A handler function is a function of your code triggered by AWS when your lambda is invoked
 

Serverless... Framework

@EllerbyBen

Serverless... Framework

@EllerbyBen

npm install -g serverless  

serverless create 
    --template aws-python3
    --path myService

@EllerbyBen

serverless.yml

handler.py

Handler

@EllerbyBen

import json


def hello(event, context):
    body = {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "input": event
    }

    response = {
        "statusCode": 200,
        "body": json.dumps(body)
    }

    return response

serverless.yml

@EllerbyBen


service: myService

provider:
  name: aws
  runtime: python3.7

functions:
  hello:
    handler: handler.hello

local

@EllerbyBen

➜  sls invoke local -f hello

{
    "statusCode": 200,
    "body": "{\"message\": \"Go Serverless v1.0! Your function executed successfully!\", \"input\": {}}"
}



deploy

@EllerbyBen

➜  sls deploy

➜  sls invoke -f hello

{
    "statusCode": 200,
    "body": "{\"message\": \"Go Serverless v1.0! Your function executed successfully!\", \"input\": {}}"
}

Lambda Triggers

@EllerbyBen

Not just Lambda (FaaS)

Lambda

S3

Dynamo

API Gateway

Compute

Storage

Data

API Proxy

Cognito

Auth

SQS

Queue

Step Functions

Workflows

EventBridge

Bus

Microservices

@EllerbyBen

@EllerbyBen

@EllerbyBen

@EllerbyBen

Lambda Characteristics 

Memory 128MB - 10,240 MB
Timeout 900 seconds
Burst Concurrency 500-3000
/tmp dir storage 512 MB
Concurrent Executions 1,000 ⏫

@EllerbyBen

What if my task takes longer than 900 seconds?

@EllerbyBen

Example: PDF Generation

  • Reports written as web application using React and JS Graphing library.
  • Users have ability to export as PDF for compliance reasons.
  • Reports can be extremely long 

@EllerbyBen

Basic Architecture

@EllerbyBen

Side Note: Lambda Scaling

  • When a function is invoked AWS Lambda creates an instance of the function, runs the handler and returns the response.
  • The function remains active, waiting to process more events.
  • If invoked again during the processing of another request Lambda initialises another instance and process the two events concurrently

@EllerbyBen

Side Note: Lambda Scaling

  • Concurrency: "Number of instances that serve requests at a given time"
  • When a traffic burst occurs, cumulative concurrency is limited by a "Burst concurrency quota"
  • After that the concurrency continues to increase at a rate of 500 / min
  • There is also an overall Concurrency limit
  • See Provisioned and Reserved Concurrency

@EllerbyBen

Timing Breakdown 

We can use parallel Lambda invocations to break down the large PDF into smaller tasks

@EllerbyBen

Example: PDF Generation

@EllerbyBen

Step Functions

@EllerbyBen

Step Functions

 AWS Step Functions is a serverless function orchestrator that makes it easy to sequence AWS Lambda functions and multiple AWS services into business-critical applications.
 
 

@EllerbyBen

Step Functions

@EllerbyBen

CloudFormation

AWSTemplateFormatVersion: '2010-09-09'
Description: An example template for a Step Functions state machine.
Resources:
  MyStateMachine:
    Type: AWS::StepFunctions::StateMachine
    Properties:
      StateMachineName: HelloWorld-StateMachine
      DefinitionString: |-
        {
          "StartAt": "HelloWorld",
          "States": {
            "HelloWorld": {
              "Type": "Task",
              "Resource": "ARN of Function.....",
              "End": true
            }
          }
        }
      RoleArn: arn-of-role
      Tags:
        -
          Key: "keyname1"
          Value: "value1"
        -
          Key: "keyname2"
          Value: "value2"

@EllerbyBen

serverless-step-functions

@EllerbyBen

serverless-step-functions

stepFunctions:
  stateMachines:
    MyStateMachine:
      name: MyMachine
      definition:
        Comment: "Does something cool"
        States:
          HelloWorld:
            Type: Task
            Resource: "HelloLambdaARN"
            End: true

@EllerbyBen

Use Cases

Function Orchestration

Branching

Error Handling

Human Approval

Parallel Processing

Dynamic Parallelism

@EllerbyBen

Map State

  • Runs a set of steps for each element of an input array.
  • Iterator: Object defining a state machine that will process each element of the array.
  • Item Path: Location of the array in the input
  • Max Concurrency: Upper bound on how many invocations of the iterator can run in parallel.

@EllerbyBen

@EllerbyBen

Another Example: Load Testing

Example Application: Gamercraft

@EllerbyBen

Gamercraft

@EllerbyBen

Gamercraft

@EllerbyBen

Artillery

@EllerbyBen

Artillery is a load testing and smoke testing solution for SREs, developers and QA engineers

Artillery - Test Definition

@EllerbyBen

config:
  target: "https://shopping.service.staging"
  phases:
    - duration: 60
      arrivalRate: 5
      name: Warm up
    - duration: 120
      arrivalRate: 5
      rampTo: 50
      name: Ramp up load
    - duration: 600
      arrivalRate: 50
      name: Sustained load
  payload:
    # Load search keywords from an external CSV file and make them available
    # to virtual user scenarios as variable "keywords":
    path: "keywords.csv"
    fields:
      - "keywords"
scenarios:
  # We define one scenario:
  - name: "Search and buy"
    flow:
      - post:
          url: "/search"
          body: "kw={{ keywords }}"
          # The endpoint responds with JSON, which we parse and extract a field from
          # to use in the next request:
          capture:
            json: "$.results[0].id"
            as: "id"
      # Get the details of the product:
      - get:
          url: "/product/{{ id }}/details"
      # Pause for 3 seconds:
      - think: 3
      # Add product to cart:
      - post:
          url: "/cart"
          json:
            productId: "{{ id }}"
artillery run search-and-add-to-cart.yml

But where would we run this from?

A server... 🤮

@EllerbyBen

What if there was another way?
 

A service that can run code (without us having to manage servers) with support for massive parallel scale?

@EllerbyBen

Serverless-Artillery (slsart)

@EllerbyBen

Combine serverless with artillery and you get serverless-artillery for instant, cheap, and easy performance testing at scale.

 

Serverless-Artillery (slsart)

@EllerbyBen

Further Real World Examples

@EllerbyBen

UAE Mars Mission

@EllerbyBen

"The mission Science Data Center will use AWS Step Function to orchestrate various AWS Lambda functions to check, index, and move files into a master database, and Amazon Simple Storage Service (Amazon S3) for shared storage."

https://aws.amazon.com/blogs/publicsector/uae-mars-mission-uses-aws-advance-scientific-discoveries/

NeuronBridge

@EllerbyBen

  • EM-LM Image search
  • Step Function checks DynamoDB once per second.
  • When ready triggers combination and sort.
  • Scaled to 3,000 concurrent Lambdas
https://aws.amazon.com/blogs/architecture/scaling-neuroscience-research-on-aws/

Conclusion

@EllerbyBen

  • Serverless is an architectural movement allowing us to abstract complexities in building and running applications.
  • Serverless in not just Lambda
  • Serverless services like AWS Lambda have very elastic scaling - with the ability to have high concurrency
  • Large problems can be broken down into chunks orchestrated by services like AWS Step Functions

@EllerbyBen

serverless-transformation

DRAFT WIP - Cloud Parallelism With Serverless On AWS - PythonWebConf

By Ben Ellerby

DRAFT WIP - Cloud Parallelism With Serverless On AWS - PythonWebConf

Serverless offers scalability and speed with a nice abstraction layer to many web and mobile applications, as well as massive concurrency which can be run large workloads in parallel. This talk will discuss what is possible with Serverless for parallel algorithms and services to use. We will cover: - What Serverless is (AWS Lambda and beyond) - The Serverless Services on AWS and other cloud providers - How to write code for Serverless - How parallelism works on Serverless - How to orchestrate parallel workloads with Serverless. Services like AWS Step Functions

  • 754