> Function as a service (FaaS) is a category of cloud computing services that provides a platform allowing customers to develop, run, and manage application functionalities without the complexity of building and maintaining the infrastructure typically associated with developing and launching an app. Building an application following this model is one way of achieving a "serverless" architecture, and is typically used when building microservices applications. > >
> Wikipedia >
FaaS is an extremely popular approach to running workloads in the cloud, allowing developers to focus on writing code. This article will show you how to deploy InterSystems IRIS methods in a FaaS way. ## Install Kubernetes First of all, install **Kubernetes 1.16**. There are a lot of guides available so that I won't be copying them here, but I'm using [minicube](https://minikube.sigs.k8s.io/docs/handbook/config/). With minicube to run kubernetes, it's enough to execute this command: minikube start --kubernetes-version=v1.16.1 ## ## Install kubeless Next, we will install [kubeless](https://github.com/vmware-archive/kubeless). kubeless is a Kubernetes-native serverless framework that lets you deploy small bits of code without worrying about the underlying infrastructure plumbing. It leverages Kubernetes resources to provide auto-scaling, API routing, monitoring, troubleshooting, and more. kubectl create ns kubeless kubectl create -f https://github.com/kubeless/kubeless/releases/download/v1.0.8/kubeless-v1.0.8.yaml kubectl get pods -n kubeless Output should be something like this: > NAME READY STATUS RESTARTS AGE > kubeless-controller-manager-666ffb749-26vhh 3/3 Running 0 83s You also need to install a kubeless client (on the same instance you have kubectl). You can get it [here](https://github.com/vmware-archive/kubeless/releases). Installation on Linux is as simple as: sudo install kubeless /usr/local/bin/kubeless ## Test kubeless First, let's deploy a simple Python function to check that kubeless works. Create _test.py_: def hello(event, context): return event['data'] To read more about function environment check [this doc](https://github.com/vmware-archive/kubeless/blob/master/docs/kubeless-functions.md), generally function accepts two arguments - event and context with this data: <span class="pl-ent">event</span>: <span class="pl-ent">data</span>: <span class="pl-c"><span class="pl-c">#</span> Event data</span> <span class="pl-ent">foo</span>: <span class="pl-s"><span class="pl-pds">"</span>bar<span class="pl-pds">"</span></span> <span class="pl-c"><span class="pl-c">#</span> The data is parsed as JSON when required</span> <span class="pl-ent">event-id</span>: <span class="pl-s"><span class="pl-pds">"</span>2ebb072eb24264f55b3fff<span class="pl-pds">"</span></span> <span class="pl-c"><span class="pl-c">#</span> Event ID</span> <span class="pl-ent">event-type</span>: <span class="pl-s"><span class="pl-pds">"</span>application/json<span class="pl-pds">"</span></span> <span class="pl-c"><span class="pl-c">#</span> Event content type</span> <span class="pl-ent">event-time</span>: <span class="pl-s"><span class="pl-pds">"</span>2009-11-10 23:00:00 +0000 UTC<span class="pl-pds">"</span></span> <span class="pl-c"><span class="pl-c">#</span> Timestamp of the event source</span> <span class="pl-ent">event-namespace</span>: <span class="pl-s"><span class="pl-pds">"</span>kafkatriggers.kubeless.io<span class="pl-pds">"</span></span> <span class="pl-c"><span class="pl-c">#</span> Event emitter</span> <span class="pl-ent">extensions</span>: <span class="pl-c"><span class="pl-c">#</span> Optional parameters</span> <span class="pl-ent">request</span>: <span class="pl-s">... </span><span class="pl-c"><span class="pl-c">#</span> Reference to the request received </span> <span class="pl-ent">response</span>: <span class="pl-s">... </span><span class="pl-c"><span class="pl-c">#</span> Reference to the response to send </span> <span class="pl-c"><span class="pl-c">#</span> (specific properties will depend on the function language)</span> <span class="pl-ent">context</span>: <span class="pl-ent">function-name</span>: <span class="pl-s"><span class="pl-pds">"</span>pubsub-nodejs<span class="pl-pds">"</span></span> <span class="pl-ent">timeout</span>: <span class="pl-s"><span class="pl-pds">"</span>180<span class="pl-pds">"</span></span> <span class="pl-ent">runtime</span>: <span class="pl-s"><span class="pl-pds">"</span>nodejs6<span class="pl-pds">"</span></span> <span class="pl-ent">memory-limit</span>: <span class="pl-s"><span class="pl-pds">"</span>128M<span class="pl-pds">"</span></span> Now we can deploy our hello function by specifying our file with a function and a runtime: kubeless function deploy hello --runtime python3.7 --from-file test.py --handler test.hello kubeless function ls hello And let's test it: kubeless function call hello --data 'Hello world!' You should receive _Hello World!_ as an answer. ## Add IRIS config Next we need to add an InterSystems IRIS function handler, to do that open kubeless config for edit: kubeless get-server-config kubectl get -n kubeless configmaps -o yaml > configmaps.yaml kubectl edit -n kubeless configmaps Add this entry to runtime-images array and save: {"ID": "iris","depName": "","fileNameSuffix": ".cls","versions": [{"images": [{"image": "eduard93/kubeless-iris-runtime:latest","phase": "runtime"}],"name": "iris2022.1","version": "2022.1"}]} Restart kubeless controller for the changes to take effect. kubectl delete pod -n kubeless -l kubeless=controller ## Build IRIS function CRD and publish it Now let's write our first function in InterSystems IRIS: Class User.Test { ClassMethod hi(event, context) As %Status { if $isObject(event) { write event.Text + event.Text } else { write "HELLO FROM IRIS" } quit $$$OK } } Next, we need to build a function CRD: Here's our template:apiVersion: kubeless.io/v1beta1 kind: Function metadata: name: !name! namespace: default spec: runtime: iris2022.1 timeout: "180" handler: !handler! deps: "" function-content-type: text deployment: spec: template: spec: securityContext: runAsUser: 51773 runAsGroup: 51773 function: |
apiVersion: kubeless.io/v1beta1 kind: Function metadata: name: iris-demo namespace: default spec: runtime: iris2022.1 timeout: "180" handler: User_Test.hi deps: "" function-content-type: text deployment: spec: template: spec: securityContext: runAsUser: 51773 runAsGroup: 51773 function: | Class User.Test { ClassMethod hi(event, context) As %Status { if $isObject(event) { write event.Text + event.Text } else { write "HELLO FROM IRIS" } quit $$$OK } }