$30 off During Our Annual Pro Sale. View details »

Fun with Serverless JavaScript

Fun with Serverless JavaScript

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

Lorna Mitchell

October 25, 2017

More Decks by Lorna Mitchell

Other Decks in Technology


  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