hello

Leo
 

Dev at TURBINE XBERG

wh0t is lambda

  • compute service
  • executed on amazon infrastructure
  • don't need to manage server
  • pay per per run time
  • zero configuration auto scaling
  • each piece of your code is called lambda function
  • java, python, nodejs, go
  • every function is stateless

stateless

  • zero config
  • run independant from env
  • not connected to underlaying infrastructure
  • scale easily
  • easy to test

function holds all information that it needs to execute

states -> db

run lambda, run!

  • event based
  • events from other AWS services (S3, dynamoDb etc.)
  • HTTP calls
  • other lambda functions
  • serverless execution

serverless

  • there are servers
  • but you don't care about servers
  • function as a service

let's go shopping

Serverless Framework FTW!!!1

you need

  • nodejs v6.5.0+
  • Serverless CLI v1.9.0+
    $ npm install -g serverless
  • FaaS provider account
  • set up provider credentials

serverless framework

  • FaaS provider abstraction layer
  • configure your app in a .yml file:
    permissions, resources, functions, routes, events
  • CLI tool
  • deploy your app to any FaaS provider
  • invoke functions
  • ...

key concepts

  • functions
  • events
  • resources
  • plugins

serverless.yml

service: my-app

provider:
  name: aws
  runtime: nodejs6.10
  stage: dev
  region: eu-central-1

functions:
  homePage:
    handler: src/homePage.handler
    events:
      - http: 'GET /'

src/homePage.js

'use strict';

module.exports.handler = (event, context, callback) => {
  
  const response = {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Welcome to my website',
      input: event,
    }),
  };

  callback(null, response);
};

add dynamoDb permissions

serverless.yml

service: my-app

provider:

  ...

  environment:
    DYNAMODB_LOG_TABLE: ${self:service}-request-log-${self:provider.stage}
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:PutItem
      Resource: "arn:aws:dynamodb:${self:provider.region}:*:table/${self:provider.environment.DYNAMODB_LOG_TABLE}"

...

define table

serverless.yml

 
resources:
  Resources:
    RequestLogDynamoDbTable:
      Type: 'AWS::DynamoDB::Table'
      Properties:
        AttributeDefinitions:
          -
            AttributeName: id
            AttributeType: S
        KeySchema:
          -
            AttributeName: id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        TableName: ${self:provider.environment.DYNAMODB_LOG_TABLE}        

src/homePage.js

const uuid = require('uuid');
const aws = require('aws-sdk');
const dynamoDb = new aws.DynamoDB.DocumentClient();

module.exports.handler = (event, context, callback) => {

  ...

  const params = {
    TableName: process.env.DYNAMODB_LOG_TABLE,
    Item: {
      id: uuid.v1(),
      function: 'homePage.handler',
      requestTime: new Date().getTime()
    },
  };

  dynamoDb.put(params, (error) => {
    if(error) {
      // we should do some error handling ...
      console.log(error);
    }
    callback(null, response);
  }
};

local development

# install plugins

$ npm install serverless-offline --save-dev
$ npm install serverless-dynamodb-local --save-dev

# add plugins to serverless.yml

# start offline server

$ sls dynamodb install 
$ sls dynamodb start --migrate 
$ sls offline start
$ sls invoke local -f homePage

kickstart

create app
$ sls create --template aws-nodejs --path my-app

deploy app   
$ sls deploy

deploy single function
$ sls deploy -f my-function

run function
$ sls invoke -f my-function

see live logs like tail -f
$ sls logs -f my-function -t

remove everything
$ sls remove

thanks for listening

serverless examples:

https://github.com/serverless/examples

 

serverless official:

https://serverless.com