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


  1. Fun With Serverless JS Lorna Mitchell, IBM

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

  3. What is Serverless? Backend functions, deployed to the cloud, scaling

    on demand. Pay as you go. @lornajane
  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
  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
  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
  7. Getting Started @lornajane

  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
  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
  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
  11. Hello World Lambda exports.handler = function(event, context) { context.succeed("Hello, World!");

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

    }; @lornajane
  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
  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
  15. Serverless + HTTP FaaS + HTTP = Microservices! @lornajane

  16. The Fun Part @lornajane

  17. Alexa: Amazon Echo You speak, the device sends the sound

    to the cloud and speaks back the response @lornajane
  18. Invoking Alexa @lornajane

  19. Invoking Alexa @lornajane

  20. Invoking Alexa @lornajane

  21. Invoking Alexa @lornajane

  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
  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
  24. Project Codename: Run wsk action invoke --blocking alexa/project-codename ... random

    2-word responses appear. @lornajane
  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
  26. A Fun Conversation @lornajane

  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
  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
  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
  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
  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
  32. Quiz: Step by Step Alexa Well done! Eight is correct.

    { "outputSpeech":{ "type":"PlainText", "text":"Well done! 8 is correct" }, "shouldEndSession":"true" } @lornajane
  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
  34. The Serverless Revolution @lornajane

  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