APIs e Microsserviços

10 ago, 2016

Serveless APIs com Lambda e API Gateway

Publicidade

Começamos hoje uma série de artigos para explorar a criação de APIs usando dois serviços AWS: Lambda e API Gateway, a dupla dinâmica usada para criação do backend do nosso querido e amado CS Billing (nosso sistema para lançamento de horas em projetos) aqui na Concrete Solutions.

O grande barato dessa combinação é que não precisamos de servidores para rodar nossa aplicação. Todo o ambiente é provido, mantido e escalado pela AWS.

Em prol da didática, dividi esse tema em 3 partes:

  • Lambda
  • API Gateway
  • Melhores práticas e dicas

Os primeiros dois artigos foram feitos para quem nunca ouviu falar do Lambda ou API Gateway ou tiveram maus momentos tentando entender como eles funcionam. Caso você já saiba disso, recomendo esperar até o terceiro artigo, no qual vamos mostrar nossas experiências com a tecnologia.

Mas o que é o Lambda e o API Gateway?

Compilação de textos da AWS sobre o Lambda:

“O AWS Lambda é um serviço de computação sem servidor que executa seu código em resposta a eventos e gerencia automaticamente os recursos computacionais adjacentes para você. O código que você executa no AWS Lambda é chamado de “Função do Lambda”. Depois de criar sua função do Lambda, ela está sempre pronta para execução assim que acionada, semelhante a uma fórmula em uma planilha. As funções do Lambda são “sem estado”, sem nenhuma afinidade com a infraestrutura adjacente, para que o Lambda possa lançar rapidamente quantas cópias da função forem necessárias para oferecer escalabilidade à taxa dos eventos de entrada”.

O Lambda por si só não é capaz de atender pedidos feitos pela Internet, apenas eventos internos da AWS via console, algum SDK da AWS ou AWS-CLI. Por isso precisamos de um serviço que transforme pedidos web em eventos AWS que disparem as funções Lambdas, e esse serviço é o API Gateway.

Compilação de textos da AWS sobre o API Gateway:

“O Amazon API Gateway é um serviço totalmente gerenciado que permite que desenvolvedores criem, publiquem, mantenham, monitorem e protejam APIs em qualquer escala. Com apenas alguns cliques no Console de Gerenciamento da AWS, você pode criar uma API que atua como uma “porta de entrada” para que aplicativos acessem dados, lógica de negócios ou funcionalidades a partir de serviços de back-end, como cargas de trabalho executadas no Amazon Elastic Compute Cloud (Amazon EC2), código executado no AWS Lambda ou qualquer aplicação web”.

Em resumo, usaremos o Lambda para o processamento e o API Gateway como nossa porta de entrada para as funções Lambdas.

Por que usar?

Uma das grandes vantagens na utilização de funções Lambdas é que você paga apenas pela quantidade de memória e tempo de execução das suas funções, e o API Gateway apenas pela quantidade de pedidos feitos e dados transferidos. Portanto, você não precisa pagar nem um centavo além do necessário. Além disso, como citado, não é necessário configurar, manter e nem escalar seu ambiente no qual a aplicação é executada, pois a AWS é a responsável e faz isso automaticamente em tempo real.

Por que (talvez) não usar?

A maior desvantagem na combinação de Lambda + API Gateway é que ainda são conceitos novos e com poucas ferramentas e práticas disponíveis. São conceitos tão novos que quando iniciamos o projeto do CS Billing, nós tivemos que criar nossas próprias ferramentas para automatizar o empacotamento das funções Lambdas e a configuração das APIs do API Gateway.

Outras dificuldades provêm do fato de não termos um servidor propriamente dito e algumas atividades (algumas até simples) precisam do uso auxiliar de outros serviços da AWS para serem viáveis (como a subida de arquivos). Isso, em conjunto com o item anterior, faz com que essa combinação seja vista com maus olhos para um ambiente de produção.

Lambda: são funções e nada mais

Vamos lá! O que diabos são Lambdas na prática? Lambdas são funções que serão executadas pela AWS. Ponto. Só isso. Sério! Não tente complicar a parte simples desses artigos, pois virão coisas piores. Lambdas não se executam sozinhas, elas precisam ser disparadas por eventos. A ideia é que cada evento que dispare um Lambda passe para a função um objeto com as informações do evento. Com eles, podemos fazer o processamento necessário por meio da função em si. Teoria check, vamos à prática!

Nesses artigos utilizaremos NodeJS para criação das nossas funções por nenhum motivo em especial. Até a data de publicação desse artigo a AWS também suporta Python, Java e golang se você for doido (https://github.com/apex/apex, thanks Alexis).

No console da AWS, selecione o serviço Lambda. Depois, clique em Create a Lambda Function. Você será levado para o wizard de criação de uma função Lambda. A primeira parte é selecionar um template para usar de base para sua função lambda. No nosso caso, vamos criar uma do zero. Clique em Skip para passar o wizard.

image04 (2)

Antes de tudo precisamos configurar um nome, uma descrição e escolher a linguagem (NodeJS 4.3) que nossa função Lambda irá rodar.

image02

Logo abaixo desses itens podemos inserir nosso código diretamente no console ou subir um pacote zip com a função e suas dependências. Como nosso código é simples, podemos digitá-lo direto no console da AWS:

'use strict';
 
// Function Handler
exports.handler = (event, context, callback) => {
    switch (event.operation) {
    case 'fibonacci':
        callback(null, fibonacci(event.limit));
        break;
    case 'factorial':
        callback(null, rFact(event.limit));
        break;
    default:
        callback('ERROR: Something Went Wrong');
    // Poderia ser “callback(new Error ('Invalid operation $(event.operation)'))”
    }
}
 
// Calculates Fibonacci
function fibonacci(limit) {
    var fib = [];
    fib[0] = 0;
    fib[1] = 1;
    for(var i=2; i<=limit; i++)
        fib[i] = fib[i-2] + fib[i-1];
    return fib
}
 
// Calculates Factorial
function rFact(num)
{
    if (num === 0)
        return 1;
    return num * rFact(num-1);
}

Nossa função é bem simples: recebe três objetos contendo os dados do evento que disparou a função Lambda. Com eles, o código decide fazer um cálculo da série de Fibonacci ou da série fatorial. Cada um é responsável por uma parte do processo:

  • Events possui os dados do evento em si, como valores vindos de um pedido POST do API Gateway;
  • Context é um objeto com referências a meta dados sobre o disparo (quem o fez, quanto tempo restante para executar o lambda, etc);
  • Callback é a função chamada pelo lambda quando o processo termina. Esse callback respeita a norma NodeJS de receber um erro como primero parâmetro ou null e um objeto de retorno como parâmetros em caso de sucesso.

Agora precisamos configurar qual função será executada. O valor default é index.handler, ou seja, dentro do arquivo index.js (via console e criado pela AWS) o lambda procurará a função handler para executar.

Agora precisamos configurar a Role do Lambda com as permissões do serviço da AWS que iremos utilizar (como S3 e Dynamo), mas como não vamos usar nenhum serviço, basta escolher basic execution role e criar uma apenas para essa função.

image05 (1)

Por último, só precisamos configurar a quantidade de memória e o tempo máximo de execução dessa função lambda. Opcionalmente, podemos selecionar uma configuração de VPC por questões de segurança. Vamos deixar todas essas configurações nos valores padrões.

image03-1

Pronto! É só isso que você precisa fazer para criar uma função Lambda. Clique em next para revisar e concluir a criação da função.

Para realizar um teste, primeiro precisamos definir um objeto Events de teste que irá simular um disparo feito por algum serviço da AWS (como o API Gateway). Para isso, clique em Actions > Configure test event:

image00 (2)

Agora, defina dois valores no objeto JSON como abaixo e, em seguida, clique em Save and Test.

image06 (1)

Logo abaixo do código fonte da função lambda o resultado da função irá aparecer.

image01 (1)

Pronto! Temos nossa primeira função Lambda rodando. Porém, ainda precisamos publicar essa função na Internet por meio de uma URL à qual poderemos fazer pedidos para termos de fato uma API. Como já citado, precisamos do API Gateway para transformar esses pedidos HTTP em eventos inteligíveis para as funções Lambdas.

No próximo artigo, vamos ver o API Gateway e como integrá-lo com nossas funções Lambdas para criar nossa primeira API! Fique ligado.

Ficou alguma dúvida ou tem algo a acrescentar? Aproveite os campos abaixo. Até amanhã!