The serverless journey of shop.LEGO.com

7c9b8b368924556d8642bdaed3ded1f5?s=47 Danilo Poccia
December 02, 2019

The serverless journey of shop.LEGO.com

re:Invent, Las Vegas, December 2nd, 2019

Connecting the LEGO play experience with millions of people requires an innovative platform. This has fueled the cloud migration of the legacy e-commerce application. In this session, we walk you through the principles, the approach, the learnings, and of course the serverless technologies that made the vision a reality. We cover multiple real-world use cases such as the integration of the e-commerce platform with the tax system, and the implementation of an event-streaming platform.

7c9b8b368924556d8642bdaed3ded1f5?s=128

Danilo Poccia

December 02, 2019
Tweet

Transcript

  1. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. The serverless journey of shop.LEGO.com S V S 3 2 0 Sheen Brisals Senior Application Engineer The LEGO Group Danilo Poccia Principal Evangelist Amazon Web Services
  2. Agenda How it all started A journey through patterns Takeaways

  3. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved.
  4. None
  5. The “monolith” at the start of this journey Corporate data

    center Server contents Server contents Tax Products CRM Fulfillment Rewards Server contents
  6. The “monolith” at the start of this journey VPC Node.js

    + React Elastic Beanstalk container Corporate data center Server contents Server contents Tax Products CRM Fulfillment Rewards Server contents
  7. The “monolith” at the start of this journey VPC Node.js

    + React Elastic Beanstalk container Server contents Server contents Tax Products CRM Fulfillment Rewards VPC Gateway Corporate data center Server contents
  8. Then, during Black Friday 2017 … VPC Node.js + React

    Elastic Beanstalk container Server contents Server contents Tax Products CRM Fulfillment Rewards VPC Gateway 503 Service Unavailable Corporate data center Server contents
  9. Consolation in chaos …

  10. September 2018 – Decoupling the backend VPC Node.js + React

    Elastic Beanstalk container Server contents Server contents Tax Products CRM Fulfillment Rewards AWS Cloud SaaS VPC Gateway Server contents Corporate data center Amazon API Gateway AWS Lambda function
  11. September 2018 – First production Lambda function

  12. And the serverless journey begins!

  13. Black Friday 2018

  14. July 10, 2019 shop.LEGO.com was switched to serverless on AWS

  15. AWS services in use Amazon S3 Amazon SNS AWS Fargate

    AWS Lambda Amazon Kinesis Data Firehose Amazon DynamoDB Amazon API Gateway AWS Step Functions Amazon SQS Amazon EC2 Amazon ECS Amazon ECR Amazon VPC AWS WAF AWS KMS AWS Identity and Access Management (IAM) AWS X-Ray Amazon Route 53 AWS CloudTrail Amazon ElastiCache Amazon CloudWatch Amazon EventBridge AWS CloudFormation Parameter Store
  16. Growing usage stats from production 165+ Lambda functions 35+ microservices

    30+ API Gateway endpoints 10+ DynamoDB tables 5+ S3 buckets 20+ SNS topics 60+ SQS queues + DLQs 70+ Systems Manager params
  17. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved.
  18. Use case – Add item to shopping basket Customer Product

    Validation Basket
  19. Pattern – Atomic request-response API Shopping app Add item API

    Business logic Basket data store Commerce platform Request Response Invoke Check/add • Performance is priority • Logic evaluation • No partial failure • Success or error response • Validation steps • Limit data relay
  20. A journey through patterns Use case Pattern ✓ Add item

    to shopping basket Atomic request-response API
  21. Use case – Status polling for long-running processes “What’s the

    status of my order?”
  22. Pattern – CQRS* with status cache Shop POST GET Submit

    order API Submit order function Submit order queue Process order function Update status Order status API Status provider function Order cache (TTL) Order number Query status Payment providers New commerce platform Frontend visibility Processing Failed Complete Backend visibility Validating Validation failed Payment authorized Payment processing Card declined Sent to fulfillment * Command Query Responsibility Segregation
  23. A journey through patterns Use case Pattern ✓ Add item

    to shopping basket Atomic request-response API ✓ Status polling for long-running processes CQRS with status cache
  24. Use case – Voucher codes generation and notification Admin Voucher

    codes Voucher store Admin File download Email
  25. Pattern – Email notification with signed URL Admin user Vouchers

    API Request handler Generate vouchers Voucher backup Voucher table Voucher topic Email notification Email with Amazon S3 signed URL Acknowledge POST 1. Create vouchers 2. Update voucher table 3. Store batch on Amazon S3 4. Generate Amazon S3 signed URL 5. Send out notification • Vouchers from 1 to 1M • Unique voucher codes • Secure download option • User notification GET Async Sync
  26. A journey through patterns Use case Pattern ✓ Add item

    to shopping basket Atomic request-response API ✓ Status polling for long-running processes CQRS with status cache ✓ Voucher codes generation and notification Email notification with signed URL
  27. Use case – User identity lookup in different systems Customer

    Customer identity Authenticate Authorize Rewards
  28. What happens if identities don’t match? Customer Profile API Request

    handler LEGO identity Client app Rewards platform Commerce platform LEGO ID Rewards ID
  29. Pattern – API authorizer with identity lookup Customer Profile API

    Request handler • Session must be valid • Session must belong to the user • Profile must exist • Profile ID must match LEGO identity Authorizer Commerce platform Rewards platform LEGO ID Rewards ID Client app
  30. A journey through patterns Use case Pattern ✓ Add item

    to shopping basket Atomic request-response API ✓ Status polling for long-running processes CQRS with status cache ✓ Voucher codes generation and notification Email notification with signed URL ✓ User identity lookup in different systems API authorizer with identity lookup
  31. Use case – On-demand customer data migration Customer New site

    New platform Notify Process New commerce platform Fetch Update
  32. Pattern – Publish-subscribe sync • On-demand data sync • Real-time

    migration • Data in JSON format • No impact to user experience Customer topic New commerce platform New customer handler Customer created Fetch data Update data
  33. A journey through patterns Use case Pattern ✓ Add item

    to shopping basket Atomic request-response API ✓ Status polling for long-running processes CQRS with status cache ✓ Voucher codes generation and notification Email notification with signed URL ✓ User identity lookup in different systems API authorizer with identity lookup ✓ On-demand customer data migration Publish-subscribe sync
  34. Use case – Product catalog import and update Commerce platform

    Feeds transform Products feeds
  35. Pattern – Event-driven data pipeline with buffering Transform feed Transformed

    feeds queue Feeds store Commerce platform API Update data Data feeds Trigger Push Trigger Update • Feeds in JSON format • Independent feed flow • Immediate handling of feeds • Decoupled processing • Failure retry process • Failure notification DLQ Thousands per day processed as soon as possible Fine-grained control on throughput and errors Observability
  36. Same pattern works for multiple object types Commerce platform API

    Data feeds Trigger Push Trigger Update Push Trigger Push Trigger Product Pricing SKU Observability DLQs
  37. A journey through patterns Use case Pattern ✓ Add item

    to shopping basket Atomic request-response API ✓ Status polling for long-running processes CQRS with status cache ✓ Voucher codes generation and notification Email notification with signed URL ✓ User identity lookup in different systems API authorizer with identity lookup ✓ On-demand customer data migration Publish-subscribe sync ✓ Product catalog import and update Event-driven data pipeline with buffering
  38. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. “Code is a liability. Write less functions.” On Twitter Lots of People
  39. Use case – API-driven data ingestion Processing Data store Data

    ingestion pipeline Event producer Ingest API
  40. A first solution… Can we do better? Lambda function receive

    event & send to Kinesis Kinesis Data Firehose buffering API Gateway receive events Processing application S3 bucket store events Event producer
  41. Pattern – Codeless data ingestion Kinesis Data Firehose API Gateway

    S3 bucket Event producer • API to stream directly • Less point of failures • Native integration • Less compute costs • Less code to maintain • Fully managed and scalable Transformation and validation Backup Fan-out function Processing functions Trigger Async Errors
  42. https://bit.ly/2qhsBYH

  43. A journey through patterns Use case Pattern ✓ Add item

    to shopping basket Atomic request-response API ✓ Status polling for long-running processes CQRS with status cache ✓ Voucher codes generation and notification Email notification with signed URL ✓ User identity lookup in different systems API authorizer with identity lookup ✓ On-demand customer data migration Publish-subscribe sync ✓ Product catalog import and update Event-driven data pipeline with buffering ✓ API-driven data ingestion Codeless data ingestion
  44. Use case – Unique order ID generation Checkout flow Loyalty

    customers Order number Customer ID
  45. Pattern – Codeless sequence generator Sequences table Sequence number API

    Sequence item • No Lambda function • Repeatable pattern • Fully managed • Stateful resource • Atomic counter • Single table partition Counter attribute Any microservice
  46. DynamoDB Atomic Counter { "TableName": ”sequences", "Key": { "id": {

    ”S": ”order" } }, "ExpressionAttributeValues": { ":one": { "N": 1 } }, "UpdateExpression": "SET num = num + :one", "ReturnValues": "UPDATED_NEW" } Atomic update
  47. https://bit.ly/33z1G8W

  48. A journey through patterns Use case Pattern ✓ Add item

    to shopping basket Atomic request-response API ✓ Status polling for long-running processes CQRS with status cache ✓ Voucher codes generation and notification Email notification with signed URL ✓ User identity lookup in different systems API authorizer with identity lookup ✓ On-demand customer data migration Publish-subscribe sync ✓ Product catalog import and update Event-driven data pipeline with buffering ✓ API-driven data ingestion Codeless data ingestion ✓ Unique order number generation Codeless sequence generator
  49. August 15, 2019 – Unified LEGO.com

  50. Use case – Website migration with URL changes Old site

    URL New site Identify destination Content provider
  51. Pattern – URL redirects cached by CDN URL redirect function

    Content store URL rules Cache on /tmp Application Load Balancer CDN • 512 MB /tmp storage • 128MB – 3GB memory
  52. A journey through patterns Use case Pattern ✓ Add item

    to shopping basket Atomic request-response API ✓ Status polling for long-running processes CQRS with status cache ✓ Voucher codes generation and notification Email notification with signed URL ✓ User identity lookup in different systems API authorizer with identity lookup ✓ On-demand customer data migration Publish-subscribe sync ✓ Product catalog import and update Event-driven data pipeline with buffering ✓ API-driven data ingestion Codeless data ingestion ✓ Unique order number generation Codeless sequence generator ✓ Website migration with URL changes URL redirects cached by CDN
  53. Use case – Keeping website sitemaps updated Timer Process Store

    sitemaps Publish Search engines
  54. Pattern – Scheduled workflow Step Functions Trigger rule • Amazon

    S3 for storage • Amazon S3 as origin server • Runs daily – off peak • Sitemaps in XML Amazon CloudWatch Events
  55. Pattern – Scheduled workflow /work /release CDN

  56. A journey through patterns Use case Pattern ✓ Add item

    to shopping basket Atomic request-response API ✓ Status polling for long-running processes CQRS with status cache ✓ Voucher codes generation and notification Email notification with signed URL ✓ User identity lookup in different systems API authorizer with identity lookup ✓ On-demand customer data migration Publish-subscribe sync ✓ Product catalog import and update Event-driven data pipeline with buffering ✓ API-driven data ingestion Codeless data ingestion ✓ Unique order number generation Codeless sequence generator ✓ Website migration with URL changes URL redirects cached by CDN ✓ Keeping website sitemaps updated Scheduled workflow
  57. Use case – Checkout event processing Login Checkout Payment Order

    Data sync Shipping
  58. Use case – Hub-and-spoke event bus Login Checkout Payment Order

    Data sync Shipping
  59. July 10, 2019 shop.LEGO.com was switched to serverless on AWS

    Flashback!
  60. July 11, 2019 The day after, Amazon EventBridge was launched

  61. Pattern Customer login Login Shipping Send order to SAP Data

    sync Customer, VIP, wishlist sync Checkout Submit order Payment Authorize payment Commerce platform Order Process order Order and customer updates Event relay Customer login Invoke every minute Events Order complete Customer login Payment authorized Order submit Order complete EventBridge FIFO queue
  62. Pattern – Hub-and-spoke event bus { "version": "0", "id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718",

    "detail-type": "State change Notification", "source": "service-order-submit-dev", "account": "111122223333", "time": "2019-08-29T12:10:21Z", "region": "eu-central-1", "resources": [ "arn:aws:events:event-bus/checkout-bus" ], "detail": { } } Customer-specific data goes in the “detail”
  63. Pattern – Hub-and-spoke event bus { "version": "0", "id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718",

    "detail-type": "State change Notification", "source": "service-order-submit-dev", "account": "123456789012", "time": "2019-08-29T12:10:21Z", "region": "eu-central-1", "resources": ["arn:aws:events:event-bus/checkout-bus"], "detail": { "event": { "meta_data": { "site_id": "LEGO Shop", "type": "CHECKOUT", "subtype": "ORDER", "status": "COMPLETE" }, "data": { "order_number": "T123456789", "customer_id": "bf3703467718-29T12-6a7e8feb" } } } } Standard syntax across multiple services Custom for each service
  64. A journey through patterns Use case Pattern ✓ Add item

    to shopping basket Atomic request-response API ✓ Status polling for long-running processes CQRS with status cache ✓ Voucher codes generation and notification Email notification with signed URL ✓ User identity lookup in different systems API authorizer with identity lookup ✓ On-demand customer data migration Publish-subscribe sync ✓ Product catalog import and update Event-driven data pipeline with buffering ✓ API-driven data ingestion Codeless data ingestion ✓ Unique order number generation Codeless sequence generator ✓ Website migration with URL changes URL redirects cached by CDN ✓ Keeping website sitemaps updated Scheduled workflow ✓ Checkout event processing Hub-and-spoke event bus
  65. A journey through patterns Use case Pattern ✓ Add item

    to shopping basket Atomic request-response API ✓ Status polling for long-running processes CQRS with status cache ✓ Voucher codes generation and notification Email notification with signed URL ✓ User identity lookup in different systems API authorizer with identity lookup ✓ On-demand customer data migration Publish-subscribe sync ✓ Product catalog import and update Event-driven data pipeline with buffering ✓ API-driven data ingestion Codeless data ingestion ✓ Unique order number generation Codeless sequence generator ✓ Website migration with URL changes URL redirects cached by CDN ✓ Keeping website sitemaps updated Scheduled workflow ✓ Checkout event processing Hub-and-spoke event bus
  66. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved.
  67. Takeaways Look for something simple to begin with Implement automated

    integration tests Separate dev, test, prod accounts Architect in “set pieces” No throwaway PoCs Leverage patterns
  68. Thank you! © 2019, Amazon Web Services, Inc. or its

    affiliates. All rights reserved. Sheen Brisals @sheenbrisals Danilo Poccia @danilop