> Function as a service (FaaS) é uma categoria de serviços de computação na nuvem que disponibiliza uma plataforma que permite que os clientes desenvolvam, executem e gerenciem as funcionalidades das aplicações sem que tenham a complexidade de construir e manter a infraestrutura tipicamente associada a se desenvolver e lançar um app. Construir uma aplicação seguindo este modelo é uma das formas de se alcançar uma arquitetura "serverless" e é tipicamente utilizada quando se constroem aplicações baseadas em microsserviços. > >
> Wikipedia >
FaaS é uma abordagem extremamente popular para se executar cargas de trabalho na nuvem, permitindo que os desenvolvedores mantenham o foco na escrita de códigos. Este artigo irá mostrar-lhe como implantar métodos do InterSystems IRIS na forma FaaS. ## Instale o Kubernetes Primeiramente, instale o **Kubernetes 1.16**. Existem vários guias disponíveis então eu não os copiarei aqui. Para que vocês saibam, estou usando o [minicube](https://minikube.sigs.k8s.io/docs/handbook/config/). Com o minicube, para executar o kubernetes basta executar este comando: minikube start --kubernetes-versionv1.16.1 ## ## Instale o kubeless Em seguida vamos instalar o [kubeless](https://github.com/vmware-archive/kubeless). O kubeless é um framework serverless nativo do Kubernetes que permite que você implante pequenos trechos de código sem se preocupar com as questões relacionadas a infraestrutura. Ele aproveita os recursos do Kubernetes para fornecer dimensionamento automático, roteamento de API, monitoramento, solução de problemas e muito mais. 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 A saída deve ser algo assim: > NAME READY STATUS RESTARTS AGE > kubeless-controller-manager-666ffb749-26vhh 3/3 Running 0 83s Você também precisa instalar um cliente kubeless (na mesma instância onde estiver o kubectl). Você consegue ele [aqui](https://github.com/vmware-archive/kubeless/releases). A instalação no Linux é tão simples quanto: sudo install kubeless /usr/local/bin/kubeless ## Testar o kubeless Primeiramente vamos implantar uma função Python simples para verificar se o kubeless funciona. Crie o _test.py_: def hello(event, context): return event['data'] Para ler mais sobre funções no kubeless, verifique [este documento](https://github.com/vmware-archive/kubeless/blob/master/docs/kubeless-functions.md), geralmente as funções aceitam dois argumentos - evento e contexto com estes dados: <span class="pl-ent">event</span>: <span class="pl-ent">data</span>: <span class="pl-c"><span class="pl-c">#</span> Dados do evento</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> Os dados são analisados como JSON quando solicitados</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> ID do evento</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> Tipo de conteúdo do evento</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 da origem do evento</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> Emissor do evento</span> <span class="pl-ent">extensions</span>: <span class="pl-c"><span class="pl-c">#</span> Parâmetros opcionais</span> <span class="pl-ent">request</span>: <span class="pl-s">... </span><span class="pl-c"><span class="pl-c">#</span> Referência à requisição recebida </span> <span class="pl-ent">response</span>: <span class="pl-s">... </span><span class="pl-c"><span class="pl-c">#</span> Referência à resposta que deverá ser enviada</span> <span class="pl-c"><span class="pl-c">#</span> (propriedades específicas dependerão da linguagem da função)</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> Agora podemos implantar nossa função "hello" especificando nosso arquivo com a função e um ambiente de tempo de execução: kubeless function deploy hello --runtime python3.7 --from-file test.py --handler test.hello kubeless function ls hello E vamos testá-lo: kubeless function call hello --data 'Hello world!' Você deverá receber _Hello World!_ como resposta. ## Adicione a configuração IRIS A seguir precisamos adicionar um manipulador de funções InterSystems IRIS, para fazê-lo, abra a configuração do kubeless para editá-la: kubeless get-server-config kubectl get -n kubeless configmaps -o yaml > configmaps.yaml kubectl edit -n kubeless configmaps Adicione esta entrada no array de imagens de runtime e grave: {"ID": "iris","depName": "","fileNameSuffix": ".cls","versions": [{"images": [{"image": "eduard93/kubeless-iris-runtime:latest","phase": "runtime"}],"name": "iris2022.1","version": "2022.1"}]} Reinicie o controller do kubeless para que as alterações passem a funcionar. kubectl delete pod -n kubeless -l kubeless=controller ## Construa a função CRD IRIS e a publique Agora vamos escrever nossa primeira função no 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 } } Depois precisamos criar uma função CRD: Aqui está nosso modelo: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 } }