Slide 1

Slide 1 text

Proprietary + Confidential Pic-a-Daily Serverless Workshop g.co/codelabs/serverless-workshop #gcpserverlessworkshop Guillaume Laforge — @glaforge Mete Atamel — @meteatamel

Slide 2

Slide 2 text

01 The Pic-a-Daily Serverless Workshop: What you’re going to build!

Slide 3

Slide 3 text

Proprietary + Confidential A photo-sharing application

Slide 4

Slide 4 text

A photo-sharing application

Slide 5

Slide 5 text

Final architecture diagram

Slide 6

Slide 6 text

Codelabs g.co/codelabs/serverless-workshop

Slide 7

Slide 7 text

02 The Serverless spectrum on Google Cloud Platform

Slide 8

Slide 8 text

Proprietary + Confidential Operational Model Programming Model No Infra Management Managed Security Pay only for usage Service-based Event-driven Stateless Serverless

Slide 9

Slide 9 text

Proprietary + Confidential Virtual Machine OS Application Runtime Application Virtual Hardware Dedicated Server OS Application Runtime Application Virtual Hardware Containers OS Application Runtime Application Virtual Hardware Functions Functions Functions Application Platform OS Application Runtime Application Virtual Hardware Functions Serverless OS Application Runtime Application Virtual Hardware Functions Infrastructure Container Platform Function Compute Engine Kubernetes Engine App Engine Cloud Functions On-Premises Serverless Zone Physical Hardware Cloud Run

Slide 10

Slide 10 text

Proprietary + Confidential Serverless functions Serverless web applications Serverless HTTP workloads Source code-based event driven functions Source code-based web apps and API backends HTTP containers fully managed HTTP containers on GKE cluster Cloud Functions App Engine Cloud Run Serverless compute options

Slide 11

Slide 11 text

03 Cloud Functions

Slide 12

Slide 12 text

Back end code functions that automatically run in response to a trigger event Microservices Cloud "glue" Node.js, Python, Go, Java Cloud Functions

Slide 13

Slide 13 text

Cloud Functions as cloud glue Access 20+ Google services from GCF Cloud Storage Cloud Pub/Sub HTTPS Firebase Cloud Scheduler Cloud Tasks

Slide 14

Slide 14 text

Good fit “Serverless” Using Pub/Sub and/or Cloud Storage Don't want to think about runtime env Data transformations (ETL) Cloud-based HTTP glue and webhooks Constraints Runtimes: Node.js, Python, Go, Java Function level granularity Must interact via events No custom domain name Concurrency level of 1 (more cold starts) Good fit? Constraints?

Slide 15

Slide 15 text

Codelabs Lab 1 — Store and analyse pictures Storing pictures in Cloud Storage, trigger a Cloud Functions instance Calling the Cloud Vision API for analysis Storing metadata in Cloud Firestore Lab 3 — Create a collage of pictures At a regular interval, with Cloud Scheduler Invoking a Cloud Run instance, to create a collage of recent pictures found in Cloud Firestore Storing collage in Cloud Storage Lab 2 — Create thumbnails Cloud Storage notifications sent to Pub/Sub Triggering a Cloud Run instance via Pub/Sub Creating a thumbnail with ImageMagick, and storing back into Cloud Storage Lab 4 — Create a web frontend Creating a web application with App Engine Listing pictures from Cloud Firestore Displaying pictures & collage from Cloud Storage g.co/codelabs/serverless-workshop

Slide 16

Slide 16 text

04 Cloud Run

Slide 17

Slide 17 text

Containers Any language Any library Any binary Ecosystem of base images .js .rb .go .py .sh … 0 1 0 1 0 0 1 1 1

Slide 18

Slide 18 text

Containers Flexibility Serverless Velocity

Slide 19

Slide 19 text

Cloud Run Fully managed, deploy your workloads and don’t see the cluster. Cloud Run on Anthos Deploy into Anthos, run serverless side-by-side with your existing workloads. Knative Everywhere Use the same APIs and tooling anywhere you run Kubernetes with Knative. Serverless containers with Knative & Cloud Run

Slide 20

Slide 20 text

Container to production in seconds Natively Serverless One experience, where you want it Cloud Run Bringing serverless to containers

Slide 21

Slide 21 text

HTTPS Endpoint Public • Website • API endpoint Private • Internal services • Async tasks • Mobile backend • Webhook

Slide 22

Slide 22 text

Container contract Listen on 0.0.0.0 on port $PORT (default 8080) HTTP server must start < 4 min (timeout → 504) Request time < 15 min (default → 5 min) Stateless (in-memory file system, doesn’t persist) Computation only within request (No background activity)

Slide 23

Slide 23 text

Container resources 1 vCPU per container instance (configurable to 2vCPU) 256 MiB of memory up to a max of 4 GiB (configurable) 80 concurrent requests per container (configurable 1-80) 1000 max containers by default (configurable 1-1000) Access to a Metadata Server Sandboxed by gVisor

Slide 24

Slide 24 text

Pay per use CPU / Memory / Requests 100ms

Slide 25

Slide 25 text

Billable time Instance Billable Time Request 1 Start Request 1 End Request 2 Start Request 2 End Instance Time Billable Non-billable

Slide 26

Slide 26 text

Concurrency: up to 80 concurrent requests concurrency = 1 concurrency = 80

Slide 27

Slide 27 text

Pub/Sub triggered internal services Cloud Run Cloud Pub/Sub Queue Queue Queue

Slide 28

Slide 28 text

Storage triggered internal services Cloud Run Cloud Pub/Sub Queue Queue Queue Cloud Storage

Slide 29

Slide 29 text

Scheduled services Command Line Interface (CLI) User Interface (UI) Scheduler API Cloud Run Cloud Scheduler

Slide 30

Slide 30 text

Services part of async tasks Cloud Tasks user_registration user_levelcompleted user_inapppurchase user_statechange Daily activity metrics service User profile service Payment processing service Game state service

Slide 31

Slide 31 text

Proprietary + Confidential Good fit? Constraints? Good fit Stateless HTTP request-response workloads Scale: way up, down to zero, bursty Specific runtime requirements: language, dependencies, etc Constraints Must use containers Decide on build process (Cloud Build, etc)

Slide 32

Slide 32 text

Codelabs Lab 1 — Store and analyse pictures Storing pictures in Cloud Storage, trigger a Cloud Functions instance Calling the Cloud Vision API for analysis Storing metadata in Cloud Firestore Lab 3 — Create a collage of pictures At a regular interval, with Cloud Scheduler Invoking a Cloud Run instance, to create a collage of recent pictures found in Cloud Firestore Storing collage in Cloud Storage Lab 2 — Create thumbnails Cloud Storage notifications sent to Pub/Sub Triggering a Cloud Run instance via Pub/Sub Creating a thumbnail with ImageMagick, and storing back into Cloud Storage Lab 4 — Create a web frontend Creating a web application with App Engine Listing pictures from Cloud Firestore Displaying pictures & collage from Cloud Storage g.co/codelabs/serverless-workshop

Slide 33

Slide 33 text

Codelabs Lab 1 — Store and analyse pictures Storing pictures in Cloud Storage, trigger a Cloud Functions instance Calling the Cloud Vision API for analysis Storing metadata in Cloud Firestore Lab 3 — Create a collage of pictures At a regular interval, with Cloud Scheduler Invoking a Cloud Run instance, to create a collage of recent pictures found in Cloud Firestore Storing collage in Cloud Storage Lab 2 — Create thumbnails Cloud Storage notifications sent to Pub/Sub Triggering a Cloud Run instance via Pub/Sub Creating a thumbnail with ImageMagick, and storing back into Cloud Storage Lab 4 — Create a web frontend Creating a web application with App Engine Listing pictures from Cloud Firestore Displaying pictures & collage from Cloud Storage g.co/codelabs/serverless-workshop

Slide 34

Slide 34 text

05 App Engine

Slide 35

Slide 35 text

Dedicated Server Dedicated Server OS Application Runtime Application Virtual Hardware Functions Physical Hardware OS Application Runtime Application Hardware Functions Dedicated Server OS Application Runtime Application Hardware Functions Serverless OS Application Runtime Application Hardware Functions Function Cloud Functions On-Premises Virtual Machine OS Application Runtime Application Hardware Functions Infrastructure Compute Engine Containers OS Application Runtime Application Hardware Functions Container Kubernetes Engine Application Platform OS Application Runtime Application Hardware Functions Platform App Engine Highly customizable Highly managed

Slide 36

Slide 36 text

What is App Engine? Serverless, but for your whole web app and not just single functions. App Engine goal: let developers focus on code, GCP handle the rest Can scale very quickly Open-source, idiomatic experience Use any library, extension, binary, or framework Python, Java, Node.js, PHP, Ruby, Go

Slide 37

Slide 37 text

App Engine Standard (2nd gen) ● Open-source, idiomatic experience ● Use any extension, binary, or framework ● Supported Runtimes ○ Python 3.7 (3.8 in beta) ○ Java 11 ○ Node.js 10 (12 in beta) ○ PHP 7.3 ○ Go 1.12 App Engine Flexible ● Runs Docker containers ● Open source runtimes for Node.js, Ruby, Java, Python, Go, PHP, .NET ● Also, if it runs in a Docker container, you can run it ← nearly everything ⚠Not serverless!

Slide 38

Slide 38 text

App Engine runtimes Standard 1st generation Standard 2nd generation Flexible Python 2.X, Java, PHP, Go Node.js 10, Python 3.7, Go 1.12, PHP 7.3, Java 11 Node.js, Ruby, Java, Python, Go, PHP, .NET & custom container images Sandboxed processes Runs on managed VMs GAE specific APIs + GCP APIs Use GCP APIs directly No binary modules / libraries any extension, binary, or framework open-source, idiomatic experience

Slide 39

Slide 39 text

Concurrency & scaling Traffic Traffic •Scale up/down •Scale-up may lead to "cold starts" •One vs. multiple concurrent requests •Traffic splitting across versions •CDN static asset serving

Slide 40

Slide 40 text

Why choose... App Engine The right abstraction: use a web framework that supports routes and HTTP methods Web traffic requires minimal latency Custom domains Java, Python, Node.js, Go, PHP, Ruby

Slide 41

Slide 41 text

Good fit HTTP/S request-response Stateless serving applications Scaling to high traffic CDN static asset serving Constraints Standard (1st gen) ● Runtimes for Python, Java, PHP, Go, Node.js Standard (2nd gen) ● Can use use binary extensions ● Python, Node.js, Java, Go, Ruby, PHP Flexible runtimes ● Inherit Docker constraints ● Not best for very low traffic sites (no scale to 0) ● Slow deploy times Good fit? Constraints?

Slide 42

Slide 42 text

Codelabs Lab 1 — Store and analyse pictures Storing pictures in Cloud Storage, trigger a Cloud Functions instance Calling the Cloud Vision API for analysis Storing metadata in Cloud Firestore Lab 3 — Run containers on schedule At a regular interval, with Cloud Scheduler Invoking a Cloud Run instance, to create a collage of recent pictures found in Cloud Firestore Storing collage in Cloud Storage Lab 2 — Create thumbnails Cloud Storage notifications sent to Pub/Sub Triggering a Cloud Run instance via Pub/Sub Creating a thumbnail with ImageMagick, and storing back into Cloud Storage Lab 4 — Create a web frontend Creating a web application with App Engine Listing pictures from Cloud Firestore Displaying pictures & collage from Cloud Storage g.co/codelabs/serverless-workshop

Slide 43

Slide 43 text

06 Eventarc Trigger Cloud Run services with events from Google Cloud

Slide 44

Slide 44 text

Proprietary + Confidential A new way of getting events to managed Cloud Run services Private alpha since early 2020 as Events for Cloud Run Public GA as Eventarc in Jan 2021 Eventarc

Slide 45

Slide 45 text

Eventarc - Vision

Slide 46

Slide 46 text

Eventarc - Current State

Slide 47

Slide 47 text

Proprietary + Confidential Create a trigger for new object creation in Cloud Storage → Cloud Run gcloud eventarc triggers create trigger-auditlog \ --destination-run-service=${SERVICE_NAME} \ --destination-run-region=${REGION} --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --event-filters=${PROJECT_NO}[email protected] gcloud - AuditLog

Slide 48

Slide 48 text

Proprietary + Confidential Create a trigger for Pub/Sub messages → Cloud Run gcloud eventarc triggers create trigger-pubsub \ --destination-run-service=${SERVICE_NAME} \ --destination-run-region=${REGION} --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" --transport-topic=projects/${PROJECT_ID}/topics/${TOPIC_ID} gcloud - Pub/Sub

Slide 49

Slide 49 text

Proprietary + Confidential Cloud Console - Trigger section of Cloud Run

Slide 50

Slide 50 text

POST / HTTP/1.1 Content-Type: application/json; charset=utf-8 Content-Length: 33 ce-specversion: 1.0 ce-type: google.cloud.pubsub.topic.publish ce-time: 2020-09-05T03:56:24Z ce-id: 1234-1234-1234 ce-source: mycontext/subcontext custom-attr: 42 { "message": "Hello Cloud Next!" } CloudEvents cloudevents.io "Data" "Context"

Slide 51

Slide 51 text

Cloud Run Service CloudEvent SDK HTTP request → CloudEvent in your language cloudevents.io Google Events Library Type library for CloudEvent#data Event parsing libraries HTTP POST to Cloud Run URL HTTP body is a CloudEvent with event data ("binary" CloudEvent V1) (optional) (optional) github.com/googleapis/google-cloudevents

Slide 52

Slide 52 text

Proprietary + Confidential const { HTTP } = require("cloudevents"); const {toLogEntryData} = require('@google/events/cloud/audit/v1/LogEntryData') app.post('/', async (req, res) => { // Read CloudEvent using CloudEvents SDK const cloudEvent = HTTP.toEvent({ headers: req.headers, body: req.body }); // Read AuditLog using Google.Events library for Node.js const logEntryData = toLogEntryData(cloudEvent.data); // Extract bucket and objectName const tokens = logEntryData.protoPayload.resourceName.split('/'); const bucket = tokens[3]; const objectName = tokens[5];

Slide 53

Slide 53 text

Proprietary + Confidential using CloudNative.CloudEvents; using Google.Events; using Google.Events.Protobuf.Cloud.PubSub.V1; public async Task Read(HttpContext context) { // Read CloudEvent using CloudEvents SDK var cloudEvent = await context.Request.ReadCloudEventAsync(); // Read Pub/Sub message using Google.Events library for .NET var messagePublishedData = CloudEventConverters.ConvertCloudEventData(cloudEvent); // Extract the Pub/Sub message var pubSubMessage = messagePublishedData.Message;

Slide 54

Slide 54 text

Codelabs Lab 5 — Cleanup after image deletion Cloud Storage delete notifications sent to Eventarc via Audit Logs Triggering a Cloud Run instance via Eventarc Cloud Run service deletes image thumbnails and metadata Lab 6 — Orchestration with Workflows Creating a workflow of our “business process” Reworking the services for an orchestrated architecture Triggering a Workflows from a Cloud Function g.co/codelabs/serverless-workshop

Slide 55

Slide 55 text

07 Workflows From a loosely-coupled event-driven choreography, towards an orchestrated architecture

Slide 56

Slide 56 text

Choreography: Pros and Cons Pros ➕ Services are loosely coupled, ➕ Services can be changed independently ➕ Services can be scaled independently ➕ No single point of failure ➕ Events are useful to extend the system beyond the current domain Cons ➖ Difficult to monitor the whole system ➖ Errors / retries / timeouts are problematic ➖ The business flow is not captured explicitly ➖ Who ensures the whole transaction is successful?

Slide 57

Slide 57 text

Orchestration: Pros and Cons Pros ➕ Business flow captured centrally and source controlled ➕ Each step can be monitored ➕ Errors / retries / timeouts are centralized ➕ Use simple REST, no need for events ➕ Services are still independent Cons ➖ A new orchestrator service to worry about ➖ Orchestrator could be a single point of failure ➖ Reliance on REST means more tight-coupling

Slide 58

Slide 58 text

Serverless Compute External API’s Google API’s etc... Workflows - orchestrate & integrate SaaS API’s Private API’s Other Clouds

Slide 59

Slide 59 text

- processPayment: params: [paymentDetails] call: http.post args: url: https://payment-processor.run.app/... body: input: ${paymentDetails} result: processResult - shipItems: call: http.post args: url: https://.../cloudfunctions.net/ship body: input: ${processResult.body} result: shipResult - notifyUser: call: http.post ... Payment Processor Cloud Run Authorize & charge CC Notifier Cloud Run Notify user Shipper Cloud Functions Prepare & ship items YAML or JSON syntax

Slide 60

Slide 60 text

Payment Processor Cloud Run Authorize & charge CC Notifier Cloud Run Notify user Shipper Cloud Functions Prepare & ship items Payment Processor Cloud Run Authorize & charge CC Notifier Cloud Run Notify user Shipper Cloud Functions Prepare & ship items WAIT Payment Processor Cloud Run Authorize & charge CC Notifier Cloud Run Notify user Shipper Cloud Functions Prepare & ship items shipmentDetails userDetails Step Sequencing Serverless Pause Variable passing JSON Parsing Steps

Slide 61

Slide 61 text

Payment Processor Cloud Run Authorize & charge CC Notifier Cloud Run Notify user Shipper Cloud Functions Prepare & ship items MAX: 5 times BACKOFF Payment Processor Cloud Run Authorize & charge CC Notifier Cloud Run Notify user Shipper Cloud Functions Prepare & ship items Pager Cloud Run Escalate to support SUCCESS ERROR Configurable retries Configurable exception handling Errors and retries

Slide 62

Slide 62 text

Notifier Cloud Run Notify user Shipper Cloud Functions Prepare & ship items Pager Cloud Run Escalate to support SUCCESS ERROR Out of Stock? No Request from the supplier Yes Read inventory Inventory DB Update inventory Inventory DB Supplier API Conditionals and 3rd party calls

Slide 63

Slide 63 text

Subworkflows to encapsulate common reusable flows Connectors ßeta to connect to other Google Cloud services & APIs Other useful features

Slide 64

Slide 64 text

# Deploy a workflow gcloud workflows deploy my-workflow --source=workflow.yaml # Execute a workflow gcloud workflows execute my-workflow # See the result gcloud workflows executions describe --workflow my-workflow Deploy, execute, manage workflows

Slide 65

Slide 65 text

No content

Slide 66

Slide 66 text

An orchestration of microservices

Slide 67

Slide 67 text

Codelabs Lab 5 — Cleanup after image deletion Cloud Storage delete notifications sent to Eventarc via Audit Logs Triggering a Cloud Run instance via Eventarc Cloud Run service deletes image thumbnails and metadata Lab 6 — Orchestration with Workflows Creating a workflow of our “business process” Reworking the services for an orchestrated architecture Triggering a Workflows from a Cloud Function g.co/codelabs/serverless-workshop

Slide 68

Slide 68 text

Proprietary + Confidential Guillaume Laforge — @glaforge Mete Atamel — @meteatamel