serverless apis in swift - akrabat.com · serverless apis in swift rob allen, nineteen feet ......

49
Serverless APIs in Swift Rob Allen, Nineteen Feet November 2017 ~ @akrabat

Upload: others

Post on 24-May-2020

37 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Serverless APIs in SwiftRob Allen, Nineteen Feet

   

November 2017 ~ @akrabat

Page 2: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

I write APIs

Rob Allen ~ @akrabat

Page 3: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Deployment options1. Physical servers2. Virtual machines3. Containers

Rob Allen ~ @akrabat

Page 4: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Container deployments1. Platform (e.g. Kubernetes)2. Application (e.g. Cloud Foundry)3. Serverless (e.g. OpenWhisk)

Rob Allen ~ @akrabat

Page 5: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Serverless?  

"The first thing to know about serverless computing is that"serverless" is a pretty bad name to call it.""

Brandon Butler, Network World

Rob Allen ~ @akrabat

Page 6: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

AKA: Functions as a ServiceA runtime to execute your functionsNo capacity planning or load balancingPay for execution, not when idle

Rob Allen ~ @akrabat

Page 7: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

ThoughtWorks: Technology Radar

"Our teams like theserverless approach;it's working well for usand we consider it avalid architecturalchoice."

2017 Technology Radar

Rob Allen ~ @akrabat

Page 8: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

ThoughtWorks Technology Radar

Our teams like theserverless approach;it's working well for usand we consider it avalid architecturalchoice.

2017 Technology Radar

Rob Allen ~ @akrabat

Page 9: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Use-casesSynchronous

Service is invoked and provides immediate response(HTTP requests: APIs, chat bots)

Asynchronous

Push a message which drives an action later(web hooks, timed events, database changes)

Rob Allen ~ @akrabat

Page 10: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Benefits• No need to think about servers• Concentrate on application code• Pay only for what you use, when you use it• Language agnostic: NodeJS, Swift, Python, PHP Java, C#, etc

Rob Allen ~ @akrabat

Page 11: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Challenges• Start up latency• Time limit• State is external• DevOps is still a thing

Rob Allen ~ @akrabat

Page 12: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

It's about value

Rob Allen ~ @akrabat

Page 13: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

You are charged by duration of execution &memory used

Rob Allen ~ @akrabat

Page 14: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Serverless providers

Rob Allen ~ @akrabat

Page 15: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

OpenWhisk

Rob Allen ~ @akrabat

Page 16: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Open sourceMultiple providers:

IBMAdobeRedHat

Rob Allen ~ @akrabat

Page 17: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Many runtimes:

SwiftNodeJSPHPJavaPythonDocker

Rob Allen ~ @akrabat

Page 18: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Swift

Rob Allen ~ @akrabat

Page 19: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Swift is a general-purpose programminglanguage built using a modern approachto safety, performance, and softwaredesign patterns.

-- swift.org

Rob Allen ~ @akrabat

Page 20: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

ModernSafeFast

Rob Allen ~ @akrabat

Page 21: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Major featuresStrong typing Custom operatorsType inference TuplesOptionals GenericsClosures SerialisationARC Interoperable with C

Rob Allen ~ @akrabat

Page 22: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Rock-Paper-Scissors 1 import Foundation

2

3 let shapes = ["rock", "paper", "scissors"]

4

5 for count in 1...3 {

6 print(count)

7 sleep(1)

8 }

9

10 srandom(UInt32(Date().timeIntervalSince1970))

11 let chosenShape = random() % shapes.count

12 print(shapes[chosenShape]);

Rob Allen ~ @akrabat

Page 23: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Result$ swift rock-paper-scissors.swift

1

2

3

scissors

Rob Allen ~ @akrabat

Page 24: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Learn the language

Rob Allen ~ @akrabat

Page 25: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Remember this? 

You are charged by duration of execution &memory used

Rob Allen ~ @akrabat

Page 26: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Performance

Rob Allen ~ @akrabat

Page 27: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Memory

Rob Allen ~ @akrabat

Page 28: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Hello world in OpenWhisk

Rob Allen ~ @akrabat

Page 29: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Hello world in OpenWhisk

Rob Allen ~ @akrabat

Page 30: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Running your action$ wsk action update ping ping.swift

ok: updated action ping

$ wsk action invoke ping --result

{

"ack": "2017-11-06 10:15:00"

}

Rob Allen ~ @akrabat

Page 31: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Public HTTP access

Rob Allen ~ @akrabat

Page 32: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Web actions

 

$ wsk action update ping ping.swift --web true

$ curl https://openwhisk.eu-gb.bluemix.net/api/v1/ \

web/19FT_demo/default/ping.json

{

"ack": "2017-11-06 10:15:00"

}

Rob Allen ~ @akrabat

Page 33: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

What about…API routing?Rate limiting?Authentication?Custom domains?

Rob Allen ~ @akrabat

Page 34: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

API Gateway

Rob Allen ~ @akrabat

Page 35: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

API Gateway

 

$ wsk api create /myapp /ping GET ping

$ curl https://service.eu.apiconnect.ibmcloud.com/gws/apigateway/api/ \

d12f3ba5e86077e6f0c8...830db1e5a05c88edfb12/ping

{

"ack": "2017-11-06 10:15:00"

}

Rob Allen ~ @akrabat

Page 36: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Let's talk about HTTP APIs

Rob Allen ~ @akrabat

Page 37: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

HTTP APIsJust because it's serverless doesn't mean we can ignore the basics!

• Status codes• HTTP method negotiation• Content-type handling• Error handling• Media type format

Rob Allen ~ @akrabat

Page 38: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Status codesSend the right one for the right situation!

1xx Informational2xx Success3xx Redirection4xx Client error5xx Server error

Rob Allen ~ @akrabat

Page 39: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Full control over responseReturn a dictionary with the keys: statusCode, headers, body

Do not use an extension on web actions:curl https://openwhisk.eu-gb.bluemix.net/api/v1/ \

web/19FT_demo/default/ping

Enable the http response on API Gateway:wsk api create /myapp /ping GET hello --response-type http

Rob Allen ~ @akrabat

Page 40: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Full control over response 1 func main(args: [String:Any]) -> [String:Any]

2 {

3 // our code here does something

4

5 return [

6 "statusCode" : 201,

7 "headers": [

8 "Content-Type": "application/json",

9 ],

10 "body" : ["result": "Item created"],

11 ]

12 }

Rob Allen ~ @akrabat

Page 41: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

HTTP verbsMethod Used for Idempotent?GET Retrieve data YesPUT Change data YesDELETE Delete data YesPOST Change data NoPATCH Update data No

 

In Serverless, prefer Idempotent

Rob Allen ~ @akrabat

Page 42: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Handling incoming dataParameters arrive in args 1 func main(args: [String:Any]) -> [String:Any] {

2 let formatter = DateFormatter()

3 formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

4 let now = formatter.string(from: Date())

5

6 var data = ["ack": now]

7 if let state = args["state"] as? String {

8 data["state"] = state

9 }

10

11 return ["body": data]

12 }

Rob Allen ~ @akrabat

Page 43: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Handling incoming dataGET:

$ curl https://openwhisk.eu-gb.bluemix.net/api/.../ping?state=ABC

{ "ack": "2017-11-06 10:15:00", "state": "ABC" }

POST:

$ curl -X POST -d '{"state": "123"}' \

https://openwhisk.eu-gb.bluemix.net/api/.../ping

{ "ack": "2017-11-06 10:15:00", "state": "123" }

Rob Allen ~ @akrabat

Page 44: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

HTTP request information 1 func main(args: [String:Any]) -> [String:Any]

2 {

3 guard

4 let method = args["__ow_method"] as? String,

5 let path = args["__ow_path"] as? String,

6 let headers = args["__ow_headers"] as? [String:Any]

7 else {

8 print("Error. Unable to unwrap HTTP request info.")

9 return ["statusCode": 500, "error": "Internal Server Error"]

10 }

11

12 // `method`, `path` and `headers` are valid

Rob Allen ~ @akrabat

Page 45: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Content negotiationCorrectly parse the request

• Read the Content-Type header• Raise "415 Unsupported media type" status if unsupported

Create the correct response

• Read the Accept header• Set the Content-Type header

Rob Allen ~ @akrabat

Page 46: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Reading the HTTP bodyJSON is parsed automatically, for everything else read __ow_body 1 import AEXML;

2

3 func main(args: [String:Any]) -> [String:Any]

4 {

5 let headers = args["__ow_headers"] as? [String:Any]

6 let body = args["__ow_body"] ?? ""

7 let xmlDoc = try AEXMLDocument(xml: body)

8

9 // work with `xmlDoc`

10 }

Rob Allen ~ @akrabat

Page 47: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Summary

Rob Allen ~ @akrabat

Page 48: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Resources• https://github.com/SwiftOnTheServer/flashcards• https://akrabat.com/talks/serverless-apis-in-swift-mucon/• https://swift.org• http://openwhisk.incubator.apache.org• https://medium.com/openwhisk

Rob Allen ~ @akrabat

Page 49: Serverless APIs in Swift - akrabat.com · Serverless APIs in Swift Rob Allen, Nineteen Feet ... Swift NodeJS PHP Java Python Docker Rob Allen ~ @akrabat. Swift Rob Allen ~ @akrabat

Thank you!     

Rob Allen ~ @akrabat