Serverless for Developers: Tips for Your Next App

Serverless for Developers: Tips for Your Next App

ServerlessConf, London, October 28th, 2016

Serverless architectures simplify operations and maintenance of production applications, abstracting from the underlining infrastructure and OS. But what about development? We are now two years in with tools such as AWS Lambda and what are the best practices to share from a development perspective? In this session you will see some of the key points that can empower a serverless developer: from event-driven design, to simplification (less is more, especially for a small team), extending the functionalities of the platform (per prefix stats for S3 buckets, geohash for DynamoDB tables, API authentication, and so on), integrating new products.

7c9b8b368924556d8642bdaed3ded1f5?s=128

Danilo Poccia

October 28, 2016
Tweet

Transcript

  1. 1.
  2. 2.
  3. 8.

    Name Email Create New User Submit Check the “Name” syntax

    is right (only letters and spaces) Check the “Email” syntax is right (something@some.domain) Create the new user using provided Name and Email User Interface Actions
  4. 9.

    Name Email Create New User Submit Check the “Name” syntax

    is right (only letters and spaces) Check the “Email” syntax is right (something@some.domain) Create the new user using provided Name and Email User Interface Actions Observers Target Action
  5. 10.

    Generate thumbnails Keep another database in sync Process streaming data

    Services Functions Platform Target Action Kinesis Stream DynamoDB Table S3 Bucket
  6. 13.

    area = length x width Procedural Programming “This is a

    function!” Reactive Programming “This is data binding!”
  7. 15.

    A B C D New Services C and D are

    triggered caused by B
  8. 16.

    A B C D E F ? ? What is

    causing E and F?
  9. 17.

    A B C D E F New Services (E, F)

    are triggered by C
  10. 18.

    A B C D E F It can be cyclic

    Think of acknowledgements
  11. 20.

    A B C D E F What I need to

    know (input events) 1
  12. 21.

    A B C D E F What I need to

    do (internal logic) 2
  13. 22.

    A B C D E F Who I need to

    notify (output events) 3
  14. 23.

    A B C D E F Who I need to

    notify (output events) What I need to know (input events) What I need to do (internal logic) 1 2 3
  15. 27.

    Monolith Service Service μ μ μ space (distribution, mobility) time

    (concurrency, latency) μ μ μ μ “Distributed in Time and Space” [Jonas Bonér]
  16. 30.

    A C I D tomic onsistent isolated urable A C

    I D ssociative ommutative dempotent istributed ACID 2.0
  17. 31.

    A B C D E F Event-Driven Interactions replacing Distributed

    Transactions using Eventual Consistency
  18. 32.

    A B C D E F Event-Driven Interactions replacing Distributed

    Transactions using Eventual Consistency Differentiate reads (queries) from writes (commands), as in the Command Query Responsibility Segregation (CQRS) pattern command query
  19. 36.

    The Reactive Manifesto Asynchronous communication is not enforced by serverless

    architectures Responsive Resilient Elastic Message Driven
  20. 38.

    AWS Lambda User Client Application Back End for a Web

    or Mobile App Calling the Lambda API directly Web or Mobile Back End DynamoDB Table S3 Bucket Amazon Cognito AWS API
  21. 39.

    AWS Lambda Amazon Cognito User Client Application OAuth JWT Amazon

    API Gateway Back End for a Web or Mobile App Using an API Gateway for authentication and decoupling Web or Mobile Back End Via API Gateway DynamoDB Table S3 Bucket HTTPS
  22. 40.

    Using WebSockets instead of Web API to talk to the

    Back End WebSockets Back End AWS Lambda User Client Application AWS IoT DynamoDB Table S3 Bucket Amazon Cognito MQTT or Device Shadow MQTT over
 WebSockets
  23. 41.

    Server ! Client { "id": "...", "html": "..." } {

    "js": "..." } Client ! Server { "cmd": "...", "data": "..." } MQTT Topics myapp/client/in/{ID} myapp/client/out/{ID} Cognito Identity ID ! {ID} 1 2 3 4 AWS Lambda User Client Application AWS IoT DynamoDB Table S3 Bucket Amazon Cognito MQTT or Device Shadow MQTT over
 WebSockets
  24. 42.

    Possible optimisations depending on your data flow and your acceptable

    latency Data Source Kinesis Stream Kinesis Firehose Kinesis Analytics (augment & aggregate) AWS Lambda (batch) S3 Bucket AWS Lambda (file) Data Streams Processing Reference Data
  25. 43.

    AWS Lambda (batch) Amazon Cognito User Client Application Buffering Requests

    to the Back End to reduce Lambda invocations Kinesis Stream Buffered Back End For Mobile Amazon SNS DynamoDB Table S3 Bucket
  26. 44.

    AWS Lambda (batch) Amazon Cognito User Client Application Buffering Requests

    to the Back End to reduce Lambda invocations Kinesis Stream Buffered & Aggregated
 Back End For Mobile Amazon SNS DynamoDB Table S3 Bucket Kinesis Analytics (aggregate) Kinesis Stream
  27. 45.

    AWS Lambda (batch) User Client Application Using WebSockets instead of

    Web API to talk to the Back End Buffering Requests to reduce Lambda invocations AWS IoT Kinesis Stream Buffered Back End For Everything MQTT or Device Shadow Amazon Cognito DynamoDB Table S3 Bucket
  28. 46.

    User Client Application Using WebSockets instead of Web API to

    talk to the Back End Buffering Requests to reduce Lambda invocations Storing all customer interactions for further analysis AWS IoT Kinesis Firehose Buffered Back End Saving Interactions MQTT or Device Shadow Amazon Cognito AWS Lambda (file) S3 Bucket DynamoDB Table
  29. 47.

    AWS Lambda DynamoDB Table User Client Application Amazon API Gateway

    (HTTPS) S3 Bucket (Website Hosting Routing Rules) For example, to generate image thumbnails on the first request, S3 LifeCycle Rules can delete content after N days Dynamic Cache Amazon Cognito HTTP Redirect Dynamically Build Content
  30. 48.

    To receive events from everywhere on the Internet Webhooks are

    callbacks for the Web AWS Lambda Amazon API Gateway Internet Service HTTP(S) GET or POST to https://domain/SOURCE/RANDOM-HOOK Webhook Other AWS Services Other public APIs AWS KMS Secrets & Credentials
  31. 49.

    To generate events for repositories that don’t support AWS Lambda

    natively Log Monitor AWS Lambda AWS Lambda AWS Lambda Amazon SNS Kinesis Stream Log Files External Application Log Monitor CloudWatch Logs or Metrics AWS Lambda
  32. 50.

    S3 object auto compress S3 bucket per prefix statistics DynamoDB

    provisioned throughput dynamic scaling DynamoDB item support for geohash Relational / NoSQL data synchronisation Service discovery . . . Extending Services with Your Own Functionalities
  33. 53.

    Client Application Get Content Index Get Content and Thumbnails Upload

    Content with Metadata Update Content Metadata Get Content Metadata Files (Multimedia) Database Build Thumbnails Update Content Index Extract and Update Metadata Functions User Resources Basic features M edia Sharing App
  34. 54.

    Client Application Get Content Index Get Content and Thumbnails Upload

    Content with Metadata Update Content Metadata Get Content Metadata Files (Multimedia) Database Build Thumbnails Update Content Index Extract and Update Metadata Event: new or updated file Event: new or updated content metadata Functions User Resources Event-driven design M edia Sharing App
  35. 55.

    Client Application Get Content Index Get Content and Thumbnails Upload

    Content with Metadata Update Content Metadata Get Content Metadata Files (Multimedia) Database Build Thumbnails Update Content Index Extract and Update Metadata Event: new or updated file Event: new or updated content metadata Functions User Resources Understanding the overall flow M edia Sharing App
  36. 56.

    Client Application Get Content Index (S3 API) Get Content and

    Thumbnails (S3 API) Upload Content
 with Metadata (S3 API) Update Content Metadata (DynamoDB API) Get Content Metadata (DynamoDB API) S3 Bucket DynamoDB Table Build Thumbnails (Lambda function) Update Content Index (Lambda function) Extract and Update Metadata (Lambda function) Event: new or updated file Event: new or updated content metadata User Choosing the technology M edia Sharing App
  37. 57.

    Client Application Get Content Index (S3 API) Get Content and

    Thumbnails (S3 API) Upload Content
 with Metadata (S3 API) Update Content Metadata (DynamoDB API) Get Content Metadata
 (DynamoDB API) S3 Bucket DynamoDB Table Build Thumbnails (Lambda function) Update Content Index (Lambda function) Extract and Update Metadata (Lambda function) Event: new or updated file Event: new or updated content metadata User Amazon Cognito Defining the security model M edia Sharing App
  38. 58.

    Client Application Get Content Index (S3 API) Get Content and

    Thumbnails (S3 API) Upload Content
 with Metadata (S3 API) Update Content Metadata (DynamoDB API) Get Content Metadata
 (DynamoDB API) S3 Bucket DynamoDB Table Build Thumbnails (Lambda function) Update Content Index (Lambda function) Extract and Update Metadata (Lambda function) Event: new or updated file Event: new or updated content metadata User Amazon Cognito From the features viewpoint… M edia Sharing App
  39. 59.

    Client Application GET Object S3 API PUT Object S3 API

    UpdateItem DynamoDB API GetItem
 DynamoDB API S3 Bucket DynamoDB Table buildThumbnails (Lambda function) updateContentIndex (Lambda function) extractAndUpdateMetadata (Lambda function) Event: new or updated file Event: new or updated content metadata User Amazon Cognito Amazon S3 Amazon DynamoDB AWS Lambda …To the technology viewpoint M edia Sharing App
  40. 60.

    Client Application GET Object S3 API PUT Object S3 API

    UpdateItem DynamoDB API GetItem
 DynamoDB API S3 Bucket DynamoDB Table buildThumbnails (Lambda function) updateContentIndex (Lambda function) extractAndUpdateMetadata (Lambda function) Event: new or updated file Event: new or updated content metadata User Amazon Cognito Amazon S3 Amazon DynamoDB AWS Lambda Some events are correlated M edia Sharing App
  41. 61.

    Client Application GET Object S3 API PUT Object S3 API

    UpdateItem DynamoDB API GetItem
 DynamoDB API S3 Bucket DynamoDB Table contentUpdated (Lambda function) buildThumbnails extractAndUpdateMetadata updateContentIndex (Lambda function) Event: new or updated file User Amazon Cognito Amazon S3 AWS Lambda Amazon DynamoDB Event: new or updated content metadata Some functions can be tied together M edia Sharing App
  42. 62.

    Client Application GET Object S3 API PUT Object S3 API

    UpdateItem DynamoDB API GetItem
 DynamoDB API S3 Bucket DynamoDB Table contentUpdated (Lambda function) buildThumbnails extractAndUpdateMetadata updateContentIndex (Lambda function) Event: new or updated file User Amazon Cognito Amazon S3 AWS Lambda Amazon DynamoDB Event: new or updated content metadata What if I want to delete content? M edia Sharing App
  43. 63.

    Client Application GET Object S3 API PUT Object S3 API

    UpdateItem DynamoDB API GetItem
 DynamoDB API S3 Bucket DynamoDB Table contentUpdated (Lambda function) buildThumbnails extractAndUpdateMetadata deleteMetadata updateContentIndex (Lambda function) Event: new, updated, or deleted file User Amazon Cognito Amazon S3 AWS Lambda Amazon DynamoDB DELETE Object S3 API Event: new or updated content metadata REST to the rescue, the events flow is almost unchanged M edia Sharing App
  44. 64.

    Client Application GET Object S3 API PUT Object S3 API

    UpdateItem DynamoDB API GetItem
 DynamoDB API S3 Bucket DynamoDB Table contentUpdated (Lambda function) buildThumbnails extractAndUpdateMetadata deleteMetadata updateContentIndex (Lambda function) Event: new, updated, or deleted file User Amazon Cognito Amazon S3 AWS Lambda Amazon DynamoDB DELETE Object S3 API Event: new or updated content metadata From 8 functions to 2, using 5 native API calls M edia Sharing App
  45. 66.

    Developers can benefit from: event-driven design architectural patterns integrating new

    products architecture simplification customization of the platform Serverless Architectures are not just simplifying Operations