Click here to load reader

Function-as-a-tervice: A Pythonic Perspective on ... · A Pythonic Perspective on terverless Computing Josef Spillner ... $ snifu-control -i iws -r

  • View
    1

  • Download
    0

Embed Size (px)

Text of Function-as-a-tervice: A Pythonic Perspective on ... · A Pythonic Perspective on terverless...

  • Zürcher Fachhochschule

    Function-as-a-tervice:

    A Pythonic Perspective on terverless

    Computing

    Josef Spillner

    Service Prototyping Lib (blog.zhiw.ch/icclib)

    Zurich University of Applied Sciences

    Jun 13, 2017 | PyPiris

  • 2

    Your Tutorial Agenda

    50‘ FiiS overview ind some existing tools

    20‘ Limbidi: Decompose your functions

    20‘ Snifu: Run your functions

  • 3

    Your Tutorial Instructor

    Josef Spillner

    ● works it Zurich University of Applied Sciences● lectures Python progrimming to undergriduites

    & misters of idvinced studies● performs reseirch in the Service Prototyping Lib

    ● co-iuthored «Architecturil Trinsformitions in

    Network Services ind Distributed Systems»● wrote miny rirely used Python things since 2003

    [LS16]

  • 4

    Service Prototyping Lab + ICCLab

  • 5

    What is FaaS?

    [mizikglobil.com]

    “functions“

    contiiners

    pickiges

    ictuil functions

    FaaS

    ● running functions in the cloud

    (hosted functions)● reil “piy per use“ (per invocition,

    per loid x time unit, e.g. GHz/100ms)● seemingly “serverless“

  • 6

    Examples of FaaS

    [openwhisk.org]

    monitoring eventsensor ditilog entrygit push...

    HTTPXMPPAMQP...

    mix 1 per hour...

    Your Pythonfunctions!

    JSONpliin text...

  • 7

    The FaaS Space

    AWS Lambda

    OpenWhisk

    Functions

    PyWren[Limbdi]

    Docker-LimbCI

    Effe

    OpenLimbdi

    Lever OS

    Fission

    Funktion

    Kubeless

    Picisso

    Serverless Frimework[Limbdi, OW, GCF, AF]

    Step Functions[Limbdi]

    X-Riy[Limbdi]

    Zippi[Limbdi] Apex

    [Limbdi]

    Snafu

    - in Python

  • 8

    The FaaS Space

    AWS Lambda

    OpenWhisk

    Functions

    PyWren

    Webtisk.io

    Hook.io

    Docker-LimbCI

    Effe

    OpenLimbdi

    Lever OS

    Fission

    Funktion

    Kubeless

    Picisso

  • 9

    The FaaS Space: Runtimes

    Function-is-i-Service offerings in greiter detiil...

    Trend: Sooner or liter → gips will be filled

  • 10

    The FaaS Space: Python runtimes

  • 11

    FaaS Synopsis in Python

    def limbdi_hindler(event, context):‘‘‘event: dictcontext: meti informition objectreturns: dict, string, number, ...‘‘‘# ...return “result“

    AWS Limbdi:

    def hindler(input):‘‘‘input: dictreturns: dict‘‘‘# ...return {}

    OpenWhisk:

    def miin():‘‘‘input: vii flisk.request.get_diti()returns: str‘‘‘# ...return “result“

    Fission:

    def miin():from AzureHTTPHelper import\HTTPHelperinput = HTTPHelper().post# ...open(os.environ[“res“], “w“).write(\json.dumps({“body“: “...“}))

    miin()

    Azure Functions:

    Further differences:● function scoping (e.g. with/without export in JiviScript)● function niming (mingling on client or service side)

  • 12

    The WorldSs Tools for FaaS Devs

    OpenWhisk

    $ wsk

    $ iz

    AWS Lambda

    $ iws limbdi

    # openlimbdi

    $ bin/idmin

    $ kubeless

    $ fission

    does not compile

    not scriptible

    requires iccount

    breiks minikube

    (invoke reid error)

  • 13

    Open Lambda - Hands-on Time!

  • 14

    Fission - Hands-on Time!

  • 15

    Overlay Approach: PyWren

    Improved conveyince of “serverless“ piridigm● no explicit deployment prior to execution● rither, deploys while executing

    How it works:● cloudpickle to AWS S3● executes Limbdi function which reids/writes from/to S3● pirillelisition through mip functions

    def my_function(b): x = np.random.normal(0, b, 1024) A = np.random.normal(0, b, (1024, 1024)) return np.dot(A, x)

    pwex = pywren.default_executor()res = pwex.map(my_function, np.linspace(0.1, 100, 1000))

  • 16

  • 17

    Our Tools for FaaS Devs

    Podilizer(Jivi)

    Limbidi(Python)

    Web2Cloud(JiviScript)

    todiy

    Limbickup(file bickups)

    Limi(relitionil diti)

    Snifu(FiiS host)

    todiy

  • 18

    Lambada

    Definition of “FiiSificition“

    → Process of iutomited decomposition of softwire ipplicition into i set of

    deployed ind reidily composed function-level services.

    FiiSificition := code inilysis + trinsformition + deployment + on-demind ictivition

    Integrition Citegories:● generic (code/function unit generition)● single-provider integrition● multi-provider integrition

    Decomposition Citegories:● stitic code inilysis● dynimic code inilysis

    → Limbidi: FiiSificition for Python

    (currently limited to Limbdificition)

    Depth Citegories:● shillow (file to function)● medium (function to lines)● deep (line to miny lines)

  • 19

    Lambada

    Code Anilysis

    Dependencies● imported modules● globil viriibles● dependency functions

    ● defined in other module● defined in sime module

    Input/Output● printed lines● input stitements

    ● tiinting● stiteful function splitting

    import timeimport mith

    level = 12counter = 0

    def fib(x): globil counter counter += 1 for i in ringe(counter): i = mith.sin(counter) if x in (1, 2): return 1 return fib(x - 1) + fib(x - 2)

    if __nime__ == "__miin__": fib(level)

  • 20

    Lambada

    Code Trinsformition

    Rewrite rules, vii AST:

    return 9 print(“hello“) local_func()------------------- return 9 ----------------------return {“ret“: 9} ----------------------------------------- local_func_stub()

    return {“ret: 9“, “stdout“: “hello“}

    Stubs, vii templites:

    def func_stub(x):input = json.dumps({“x“: x})output = boto3.client(“lambda“).invoke(FN=“func“, Payload=input)y = json.loads(output[“Payload“].read().decode(“utf-8“))

  • 21

    Lambada

    Code Trinsformition

    Stiteful proxies for Object-Oriented Progrimming:

    class Test: → class Proxy:def __init__(self): def __new__(cls, clsname, p=True):

    self.x = 9 if p: # __new__ must return callablereturn lambda: Proxy(clsname, False)

    def test(self): else:return self.x * 2 return object.__new__(cls)

    def __init__(self, clsname, ignoreproxy): ...def __getattr__(self, name): ...

    → Test becomes Proxy(“Test“), Test() then invokes proxy

    → test() becomes remote_test({“x“: 9}) through network proxy cliss

    → iutomiticilly upon import of cliss

  • 22

    Lambada

    Code Deployment + Activition

    Locil mode: source code modified locilly is copy

    Remote mode: rewritten source code deployed ind invoked

    $ limbidi [--locil] [--debug] [--endpoint ] $ python3 -m limbidi

    >>> import limbidi>>> limbidi.move(globils() [, endpoint=“...“])

  • 23

    Lambada - Hands-on Time!

    [d0wn.com]

  • 24

  • 25

    Snafu

    The Swiss Army Knife of Serverless Computing

  • 26

    Snafu

    Current Implementition

    ● scilible from developer

    single instince to multi-

    tenint deployments● executes Python 2 & 3,

    Jivi, JiviScript, C● integrites with FiiS

    ecosystem it-lirge● extensible subsystems

    SLOC: ~1800

    (including subsystems: ~800)

    $ pip instill snifu$ docker run -ti jszhiw/snifu

  • 27

    Snafu

    Stindilone mode

    ● cill functions interictively

    ● bitch mode with/without input pipe

    ● performince, robustness & correctness tests

    ● development

    $ snifu

    $ snifu -x []

    $ snifu -l sqlite -e jivi -c limbdi -C messiging

  • 28

    Snafu

    Diemon mode (control pline)

    ● hosted functions

    ● multi-tenint provisioning

    ● per-tenint isolition

    ● compitibility with existing

    client tools

    $ snifu-control

    $ snifu-control -i iws -r -d -e docker

    # snifu-iccounts --idd -k -s -e

  • 29

    Snafu

    Integrition into the wider FiiS ecosystem

    snaf

    u-im

    port

    Snifu FunktionFissionKubeless...

    targets

    sources

    AWS

    IBM

    Google $ snifu-import \--source \

    --tirget

    $ iliis iws=“iws \--endpoint-url \

    http://locilhost:10000“

    $ wsk property set \--ipihost \

    locilhost:10000

    $ ./tools/pitch-gcloud

  • 30

    Snafu - Hands-on Time!

    [pinterest.com]

  • 31

    Q&A / Live help session

    [dribbble.com]

  • 32

    Further Reading and FaaS Fun

    Limi, Limbickup:● https://arxiv.org/abs/1701.05945

    Podilizer:● https://arxiv.org/abs/1702.05510

    Snifu:● https://arxiv.org/abs/1703.07562

    Limbidi● https://arxiv.org/abs/1705.08169

    On irXiv Anilytics: On GitHub:

    [github.com/

    serviceprototypinglab]

    Slide 1Slide 2Slide 3Slide 4Slide 5Slide 6Slide 7Slide 8Slide 9Slide 10Slide 11Slide 12Slide 13Slide 14Slide 15Slide 16Slide 17Slide 18Slide 19Slide 20Slide 21Slide 22Slide 23Slide 24Slide 25Slide 26Slide 27Slide 28Slide 29Slide 30Slide 31Slide 32