Serverless com IBM Cloud Functions: como funciona esse tal “Serverless”?

Introdução ao Serverless, ou Serverless 101

Victor Shinya
7 min readOct 1, 2019

Se você é um desenvolvedor, provavelmente você já ouviu falar do termo "Serverless", em algum momento nos últimos anos. Se você é um arquiteto, é bem provável que você tenha dado uma olhada nessa nova arquitetura.

HOJE é o dia em que você irá entender alguns conceitos sobre essa nova tecnologia e alguns pontos importante na hora de escolher esta arquitetura para o seu projeto. E, no final, aprender a fazer o seu primeiro Serverless usando um serviço chamado IBM Cloud Functions, ou apenas Functions.

Afinal, o que é Serverless?

De acordo com o site serverless.com, Serverless é sobre focar seus esforços no que traz valor para os seus usuários. Ou seja, como um desenvolvedor, você não precisa pensar em servidores, apenas no desenvolvimento do código.

Em outras palavras, a ideia é abstrair as partes mais simples do desenvolvimento de uma aplicação, permitindo que você, desenvolvedor, se dedique no código. Você não precisa provisionar servidores (Virtual Servers, ou VMs) ou pagar por recursos que você geralmente não usa.

Assim como a internet sem fio tem fios em algum lugar, a arquitetura serverless ainda tem servidores em algum lugar

Para usar um servidor, você precisa abrir o terminal de comando e escrever o que ele deve fazer. Quando pensamos em larga escala, vemos a dificuldade de gerenciar múltiplos servidores. E quando precisamos que escale, acaba não sendo uma tarefa simples e fluida.

Com o Serverless, isso se torna uma tarefa simples. Você não precisa configurar máquinas. Simplesmente você desenvolve uma função (menor objeto de uma aplicação) e sobe na plataforma Serverless.

Vantagens

  • Trabalhar com múltiplas linguagens, agregando o melhor de cada uma em uma só solução (bem parecido com uma solução que usa Docker/Kubernetes).
  • Não há necessidade de gerenciar servidores.
  • A cobrança será feita pelo número de chamadas do Serverless (caso opte em usar uma plataforma Serverless de um fornecedor de nuvem).
  • É facilmente escalável.
  • Deploy e atualização são rápidas de fazer.

Desvantagens

  • Testes e debugging são mais difíceis de serem realizados.
  • A arquitetura Serverless não é feita para executar processos longos (o tempo é contabilizado em algumas plataformas e cobrado junto com memória e número de execuções).
  • A performance é afetada por conta do tempo de execução de todo o processo do Serverless (como o tempo para iniciar o backend da plataforma Function-as-a-Service).
  • Risco de enfrentar Lock-in, por conta do uso do serviço fechado do fornecedor (Vendor).

Function-as-a-Service (FaaS) ou Serverless?

O Function-as-a-Service (ou simplesmente FaaS) é o serviço baseado na computação Serverless. Aqui você começa a ser cobrado por um conjunto de chamadas das funções, criando um modelo de cobrança diferente do que já tínhamos visto antes, como o Infrastructure-as-a-Service (IaaS) ou o Platform-as-a-Service (PaaS), onde somos cobrados pelo tempo de execução. Em um FaaS, você consegue subir uma função ou utilizar o editor online do serviço (no caso do IBM Cloud Functions), para desenvolver e disponibilizar direto na plataforma na nuvem.

Exemplo de custo usando o IBM Cloud Functions (Functions-as-a-Service da IBM Cloud) — Veja mais aqui

Com o código no serviço, você o executa e ele retorna um valor. Após esta execução, o processo é dado como encerrado. Bem simples, não? Um ponto importante é a possibilidade de você separar todos os serviços e endpoints de uma solução em pequenos blocos de código, para formar diversos microserviços.

No próximo post, vou abordar como expor a sua função usando API Connect, um serviço de gerenciamento de APIs.

IBM Cloud Functions

IBM Cloud Functions é a plataforma orientada a eventos, ou melhor, é o serviço de Function-as-a-Service (FaaS) da IBM Cloud. Foi desenvolvida a partir da plataforma open source Apache OpenWhisk.

Você não precisa provisionar servidores explicitamente. Eu, como desenvolvedor, devo apenas me preocupar em criar as Actions (funções dentro do IBM Cloud Functions) e focar em criar os códigos e as lógicas que serão executadas, sejam através de Web Actions ou Triggers. Dentro do Functions, você consegue criar uma Action, uma Sequence ou Trigger.

  • Uma Action é um pequeno pedaço de código que pode ser executada ou configurada para executar em resposta a um evento. A Action é igual a uma função (mencionada acima). Ou seja, você desenvolve um bloco de código que será executado a partir de um evento, como uma chamada de API por exemplo.
  • A Sequence é um conjunto de funções, sendo uma executada atrás da outra. Os dados de saída de uma Action são os parâmetros de entrada da próxima.
  • O Trigger espera um evento externo do IBM Cloud Functions para executar uma função. Este evento pode vir de um Cloud Object Storage, Cloudant, Event Streams, Github, Mobile Push, evento periódico ou customizado. Neste último você consegue configurar, através do código, qualquer outro serviço externo.
Tipos de Trigger dentro do IBM Cloud Functions

Dentro da plataforma, eu posso configurar de duas maneiras:

  • Através da interface gráfica, dentro do serviço (GUI).
  • Deploy do meu código local para o Functions (IBM Cloud CLI).
Hello World feito no IBM Cloud Functions pela GUI

No serviço, você tem um set de linguagens, suportadas pela plataforma, para desenvolver sua solução. A grande vantagem aqui é a flexibilidade de criar uma aplicação com várias linguagens, aproveitando o melhor de cada uma.

Linguagens suportadas pelo IBM Cloud Functions

Mesmo que você utilize alguma linguagem que não esteja na imagem acima (como por exemplo, Rust ou Julia), você pode optar pelo desenvolvimento da sua Action com o uso do Docker. Basta você usar o dockerskeleton, uma imagem de Docker que utiliza um proxy em Flask (framework web do Python) para implementar as rotas (necessárias) /init e /run para interagir com o OpenWhisk.

Por fim, para as linguagens suportadas pelo IBM Cloud Functions, existe uma lista de bibliotecas já disponíveis na plataforma para cada linguagem. Ou seja, não há a necessidade de importar pelo gerenciador de dependências (como o NPM do Node.js). Basta importar no código direto. Acesse a lista completa aqui.

Caso você não encontre a biblioteca na lista, você terá que zipar a função com a biblioteca, e subir o arquivo .zip na plataforma, pelo comando de linha (IBM Cloud CLI). Vou abordar esse assunto em um outro post.

Desenvolvimento do meu primeiro Serverless

Depois de conhecer essa nova tecnologia, vamos criar a primeira Action dentro da plataforma. Para isso, você precisa ter uma conta na IBM Cloud pois iremos usar a interface gráfica para programar o primeiro bloco de código.

Acesse a sua conta na IBM Cloud e entre na aba de Functions (clique no menu hambúrguer, no canto superior esquerdo e clique no item Functions). Na página de início do IBM Cloud Functions, clique no item Actions.

Agora clique em Create e depois nomeie com “my-first-action” e deixe selecionado o Node.js 10. Se quiser, crie um novo pacote. No exemplo abaixo, iremos usar o pacote padrão, ou “(Default Package)”.

Crie a sua Action — Nomeie, guarde em um pacote (por padrão o “(Default Package)” e selecione a linguagem do Runtime

No editor, digite o código abaixo. Você vai criar o famoso Hello World. Se a função receber um nome, ele vai printar a mensagem “Hello <nome-da-pessoa>” senão, ela irá printar a mensagem “Hello World”.

function main(params) {
if (params.name) {
return { message: `Hello ${params.name}` };
}
return { message: 'Hello World' };
}

Agora clique no botão Change Input para inserir o JSON de entrada. Ele será usado para inserir dados para testar a funcionalidade da função.

{
"name": "Victor"
}
Inserir JSON com os parâmetros de entrada para testar a função na interface

Agora falta clicar no botão Invoke para executar o bloco de código com o JSON. Vejam que o resultado é “Hello Victor”. Ele utiliza o dado do parâmetro Name para printar a mensagem com o nome.

Botão para executar a função e o resultado da chamada da Action

Pronto! Agora você tem uma Action. Tranquilo, né?

Ao executar o código, ele passa pelo processo do OpenWhisk (veja mais detalhes) e, assim que finalizar, ele retorna o resultado da chamada da Action para o usuário. É possível integrar diversos serviços, como o caso do Serverless Chatbot (veja abaixo).

Próximos passos

No próximo post, você irá aprender a expor essa função em uma API. Assim você conseguirá integrar em qualquer sistema, seja Web ou Mobile.

--

--

Victor Shinya

ISV Solutions Architect @AWS | Previously @IBMCloud @IBMDeveloper 🇧🇷