Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Fun with Serverless JavaScript

Fun with Serverless JavaScript

Introducing serverless at IJS in Munich, co-presenting with Alexa

Lorna Mitchell

October 25, 2017
Tweet

More Decks by Lorna Mitchell

Other Decks in Technology

Transcript

  1. Fun With
    Serverless JS
    Lorna Mitchell, IBM

    View Slide

  2. The Serverless Revolution
    The big secret is: there ARE servers!
    @lornajane

    View Slide

  3. What is Serverless?
    Backend functions, deployed to the cloud,
    scaling on demand. Pay as you go.
    @lornajane

    View Slide

  4. The Serverless Revolution
    FaaS: Functions as a Service
    Developer focus:
    • the outputs
    • the inputs
    • the logic in between
    Charges are usually per GBsec
    @lornajane

    View Slide

  5. When To Go Serverless
    • For occasional server needs (contact form on static site)
    • For very variable traffic levels (millions of browsers
    requesting update)
    • To provide extra compute resource without extending
    existing platform (classic example: PDF generation)
    @lornajane

    View Slide

  6. Serverless Platforms
    • Amazon Lambda
    • IBM Cloud Functions (aka OpenWhisk)
    • Twilio Functions
    • Azure Functions
    • Google Cloud Functions
    • Iron Functions
    • .... and more. Every day there are more.
    @lornajane

    View Slide

  7. Getting Started
    @lornajane

    View Slide

  8. Amazon Lambda
    • Install awscli command line tool (there is also a web
    interface)
    • Set up permissions via IAM and then use aws configure to
    get that set up
    • Write some code, then zip it (e.g. index.js -> hello.zip)
    @lornajane

    View Slide

  9. Amazon Lambda
    Create your lambda function by supplying the zip file and some
    options:
    aws lambda create-function \
    --function-name hello1 \
    --runtime nodejs6.10 \
    --role "arn:aws:iam::283476131276:role/service-role/Alexa"
    --description "A demo first Lambda function" \
    --handler index.handler \
    --zip-file fileb://hello.zip
    @lornajane

    View Slide

  10. Amazon Lambda
    (if you want to edit your code and redeploy it)
    aws lambda update-function-code \
    --function-name hello1 \
    --zip-file fileb://hello.zip
    Run your lambda function:
    aws lambda invoke --function-name hello1 output.txt
    @lornajane

    View Slide

  11. Hello World Lambda
    exports.handler = function(event, context) {
    context.succeed("Hello, World!");
    };
    @lornajane

    View Slide

  12. Hello World OpenWhisk
    exports.main = function(args) {
    return({"message": "Hello, World!"});
    };
    @lornajane

    View Slide

  13. IBM Cloud Functions
    Get the wsk CLI tool or the bx tool with wsk plugin, then log in
    Zip and deploy/update your code like this:
    zip hello.zip index.js
    wsk action update --kind nodejs:6 demo/hello1 hello.zip
    demo is the package name
    @lornajane

    View Slide

  14. Bluemix OpenWhisk
    Run your action from the CLI:
    wsk action invoke --blocking demo/hello1
    Enable web access and web request your action:
    wsk action update demo/hello1 --web true
    curl https://openwhisk.ng.bluemix.net/api/v1/web/ \
    Lorna.Mitchell_Working/demo/hello1.json
    @lornajane

    View Slide

  15. Serverless + HTTP
    FaaS + HTTP = Microservices!
    @lornajane

    View Slide

  16. The Fun Part
    @lornajane

    View Slide

  17. Alexa: Amazon Echo
    You speak, the device sends the sound to
    the cloud and speaks back the response
    @lornajane

    View Slide

  18. Invoking Alexa
    @lornajane

    View Slide

  19. Invoking Alexa
    @lornajane

    View Slide

  20. Invoking Alexa
    @lornajane

    View Slide

  21. Invoking Alexa
    @lornajane

    View Slide

  22. Example: Project Codename
    Existing npm library:
    https://www.npmjs.com/package/project-name-generator
    Skill code on GitHub:
    https://github.com/lornajane/alexa-project-codename
    "Alexa, ask Project Codename for a new project name"
    @lornajane

    View Slide

  23. Project Codename: Code
    function main(args) {
    var generate = require('project-name-generator');
    var random = generate().spaced;
    var response = {
    "version": "1.0",
    "response" :{ "shouldEndSession": true,
    "outputSpeech": {
    "type": "PlainText",
    "text": "project codename. " + random } }
    }
    return(response);
    }
    exports.main = main;
    @lornajane

    View Slide

  24. Project Codename: Run
    wsk action invoke --blocking alexa/project-codename
    ... random 2-word responses appear.
    @lornajane

    View Slide

  25. Redis Integration
    As an example, storing the new project codename in Redis:
    if(args.redisURL) {
    bluebird.promisifyAll(redis.RedisClient.prototype);
    var client = redis.createClient(args.redisURL);
    return client.setAsync(["codenames", random])
    .then(function (result) {
    return response;
    });
    } else {
    return response;
    }
    @lornajane

    View Slide

  26. A Fun Conversation
    @lornajane

    View Slide

  27. Quiz: the Setup
    This skill asks the user a simple maths question
    • Intent: Quiz
    • Slots: Number (there are predefined data types)
    The "dialog" feature helps to prompt the user for input
    There is a "session" to store data between requests
    @lornajane

    View Slide

  28. Quiz: the Conversation
    Human Alexa, ask Lorna for a quiz
    Alexa Ready? What is three plus five?
    Human Eight!
    Alexa Well done! Eight is correct.
    OR
    Human Fourty-two!
    Alexa You said fourty-two, but the correct answer is eight.
    @lornajane

    View Slide

  29. Quiz: Step by Step
    Human Alexa, ask Lorna for a quiz
    { "version":"1.0",
    "session":{ "new":true },
    "request":{
    "type":"IntentRequest",
    "intent":{"name":"Quiz",
    "confirmationStatus":"NONE",
    "slots":{
    "Number":{ "name":"Number", "confirmationStatus":"NONE" }
    } },
    "dialogState":"STARTED"
    } }
    @lornajane

    View Slide

  30. Quiz: Step by Step
    Alexa Ready? What is three plus five?
    {
    "outputSpeech":{ "type":"PlainText",
    "text":"Ready? What is 3 plus 5?" },
    "directives":[
    { "type":"Dialog.ElicitSlot",
    "slotToElicit":"Number" }
    ],
    "shouldEndSession":"false"
    }
    Store "What is three plus five?" and "8" in the session
    @lornajane

    View Slide

  31. Quiz: Step by Step
    Human Eight!
    { "version": "1.0",
    "session": { "new": false },
    "request": {
    "type": "IntentRequest",
    "intent": { "name": "Quiz",
    "confirmationStatus": "NONE",
    "slots": {
    "Number": { "name": "Number", "value": "8", "confirmationStatu
    } },
    "dialogState": "IN_PROGRESS"
    } }
    @lornajane

    View Slide

  32. Quiz: Step by Step
    Alexa Well done! Eight is correct.
    {
    "outputSpeech":{
    "type":"PlainText",
    "text":"Well done! 8 is correct"
    },
    "shouldEndSession":"true"
    }
    @lornajane

    View Slide

  33. Serverless In The Real World
    Beyond the trivial example, many things are possible:
    • connect to a datastore
    • make an API call
    • trigger other actions
    • ... your imagination is the limit
    @lornajane

    View Slide

  34. The Serverless Revolution
    @lornajane

    View Slide

  35. Resources
    • Project codename skill:
    https://github.com/lornajane/alexa-project-codename
    • Serverless framework:
    https://github.com/serverless/serverless
    • IBM Cloud Functions:
    https://www.ibm.com/cloud-computing/bluemix/openwhisk
    • My blog: https://lornajane.net
    @lornajane

    View Slide