Serverless APIs

Streaming Data with AWS Kinesis and Lambda

Maksim Pecherskiy

Data Engineer

Last lesson

RGv3B.png

Streaming Data with AWS Kinesis and Lambda

Giving access to data

htdz9.png

Streaming Data with AWS Kinesis and Lambda

Simple API

XTKzt.png

Streaming Data with AWS Kinesis and Lambda

Simple API

RFhY5.png

Streaming Data with AWS Kinesis and Lambda

Simple API

SuISK.png

Streaming Data with AWS Kinesis and Lambda

Add a trigger

jSRoQ.png

Streaming Data with AWS Kinesis and Lambda

Test your new API

JtGop.png

Streaming Data with AWS Kinesis and Lambda

Our first API

r2u54G.png

Streaming Data with AWS Kinesis and Lambda

API parameters

Sample request
https://.../speederReporterApi?date=20200620
Sample event
{
  "queryStringParameters": {
    "date": "20200620"
  },
  "isBase64Encoded": false
}
Streaming Data with AWS Kinesis and Lambda

Lambda handler

import json, boto3
import awswrangler as wr
import pandas as pd

session = boto3.Session(aws_access_key_id = AWS_KEY, aws_secret_access_key = AWS_SECRET, region_name="us-east-1")
Streaming Data with AWS Kinesis and Lambda

Lambda handler

def lambda_handler(event, context):
    filter_date = event['queryStringParameters']['date']

df = wr.s3.read_csv( f"s3://sd-vehicle-data/speeders_daily/{filter_date}.csv", boto3_session=session, delimiter=" ")
Streaming Data with AWS Kinesis and Lambda

Respond with data

def lambda_handler(event, context):
    ...
    return {
        'statusCode': 200,
        'headers': {
            "content-type" : "application/json"
        },
        'body': df.to_json()
    }
Streaming Data with AWS Kinesis and Lambda

Live response

https://.../default/speederReporterApi?date=20200621
[
  {
      "record_id":"939ed1d1-1740-420c-8906-445278573c7f",
      "timestamp":"4:25:06.000",
      "vin":"4FTEX4944AK844294",
      "lon":106.9447146,
      "lat":-6.3385652,
      "speed":25
  },
  {
      "record_id":"f29a5b3d-d0fa-43c0-9e1a-e2a5cdb8be7a",
      ...
  },

  ...
]
Streaming Data with AWS Kinesis and Lambda

Trigger another Lambda

oJAqB.png

Streaming Data with AWS Kinesis and Lambda

Trigger another Lambda

def trigger_recalc():
  lambda_client = boto3.client("s3", 
                            aws_access_key_id = AWS_KEY, 
                            aws_secret_access_key = AWS_SECRET, 
                            region_name = 'us-east-1')

def lambda_handler(event, context):
  ...

Streaming Data with AWS Kinesis and Lambda

speederAggregator ARN

oB7uh.png

Streaming Data with AWS Kinesis and Lambda

Invoke

def trigger_recalc():
  ...
  lambda_client.invoke(
    FunctionName='arn:aws:lambda:us-east-1:458913182630:function:speederAggregator',
    InvocationType='Event', # (or RequestResponse)
  )
Streaming Data with AWS Kinesis and Lambda

Review

f44P0.png

Streaming Data with AWS Kinesis and Lambda

Review

Oi7du.png

Streaming Data with AWS Kinesis and Lambda

Review

8yfg4.png

Streaming Data with AWS Kinesis and Lambda

Review

BTM2Q.png

Streaming Data with AWS Kinesis and Lambda

Let's practice!

Streaming Data with AWS Kinesis and Lambda

Preparing Video For Download...