Slide 1

Slide 1 text

© 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

Slide 2

Slide 2 text

Agenda How it all started A journey through patterns Takeaways

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

The “monolith” at the start of this journey Corporate data center Server contents Server contents Tax Products CRM Fulfillment Rewards Server contents

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Consolation in chaos …

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

September 2018 – First production Lambda function

Slide 12

Slide 12 text

And the serverless journey begins!

Slide 13

Slide 13 text

Black Friday 2018

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

Use case – Add item to shopping basket Customer Product Validation Basket

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

A journey through patterns Use case Pattern ✓ Add item to shopping basket Atomic request-response API

Slide 21

Slide 21 text

Use case – Status polling for long-running processes “What’s the status of my order?”

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Use case – Voucher codes generation and notification Admin Voucher codes Voucher store Admin File download Email

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Use case – User identity lookup in different systems Customer Customer identity Authenticate Authorize Rewards

Slide 28

Slide 28 text

What happens if identities don’t match? Customer Profile API Request handler LEGO identity Client app Rewards platform Commerce platform LEGO ID Rewards ID

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

Use case – On-demand customer data migration Customer New site New platform Notify Process New commerce platform Fetch Update

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

Use case – Product catalog import and update Commerce platform Feeds transform Products feeds

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved. “Code is a liability. Write less functions.” On Twitter Lots of People

Slide 39

Slide 39 text

Use case – API-driven data ingestion Processing Data store Data ingestion pipeline Event producer Ingest API

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

https://bit.ly/2qhsBYH

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

Use case – Unique order ID generation Checkout flow Loyalty customers Order number Customer ID

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

DynamoDB Atomic Counter { "TableName": ”sequences", "Key": { "id": { ”S": ”order" } }, "ExpressionAttributeValues": { ":one": { "N": 1 } }, "UpdateExpression": "SET num = num + :one", "ReturnValues": "UPDATED_NEW" } Atomic update

Slide 47

Slide 47 text

https://bit.ly/33z1G8W

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

August 15, 2019 – Unified LEGO.com

Slide 50

Slide 50 text

Use case – Website migration with URL changes Old site URL New site Identify destination Content provider

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

Use case – Keeping website sitemaps updated Timer Process Store sitemaps Publish Search engines

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

Pattern – Scheduled workflow /work /release CDN

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

Use case – Checkout event processing Login Checkout Payment Order Data sync Shipping

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

July 11, 2019 The day after, Amazon EventBridge was launched

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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”

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

Thank you! © 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved. Sheen Brisals @sheenbrisals Danilo Poccia @danilop