Cloud & Infraestrutura Nathan Geeksman

Deploy de APIs com Serverless Functions

Deploy de APIs com Serverless Functions

Deploy de APIs com Serverless Functions

Introdução

O desenvolvimento de software está cada vez mais orientado para a entrega contínua e escalabilidade. Nesse contexto, as APIs tornaram-se fundamentais como ponto de interligação entre sistemas e serviços. Por outro lado, o modelo tradicional de hospedagem em servidores virtuais não atende mais às necessidades dos desenvolvedores, pois exige planejamento, provisionamento e manutenção constante.

A arquitetura Serverless Functions busca resolver esses problemas oferecendo uma abordagem mais escalável e flexível para o deploy de APIs. Neste artigo, vamos explorar os conceitos básicos da implementação de APIs com base em funções serverless, suas vantagens, desafios e práticas recomendadas para uma implantação bem-sucedida.

Ao final deste conteúdo, você estará capacitado a compreender o modelo Serverless Functions, planejar sua adoção em projetos de desenvolvimento de software e identificar oportunidades para otimizar seu fluxo de trabalho.

O que é e por que importa

A arquitetura Serverless Functions é uma abordagem de hospedagem em nuvem que permite executar código sem a necessidade de gerenciamento de infraestrutura subjacente. Nesse modelo, o provedor da nuvem fornece recursos como memória, processamento e armazenamento, os quais são automaticamente escalados em resposta às necessidades do aplicativo.

Funcionalidades chave da arquitetura Serverless Functions incluem:

  • Execução de código em resposta a eventos ou solicitações;
  • Escalabilidade automática para atender ao tráfego de entrada;
  • Pagamento apenas pelo uso dos recursos;
  • Redução do tempo de desenvolvimento e entrega do aplicativo.

Essa abordagem resolve problemas associados à arquitetura tradicional, como:

  • Complexidade e esforço necessários para gerenciar a infraestrutura;
  • Despesas relacionadas ao uso de recursos computacionais ociosos;
  • Tempo necessário para planejar e executar o desempenho escalável.

Ao utilizar Serverless Functions, as organizações podem otimizar seu fluxo de trabalho, reduzir os custos operacionais e melhorar a entrega de soluções inovadoras.

Como funciona na prática

A arquitetura Serverless Functions opera por meio de uma cadeia de eventos e processos que permitem a execução escalável e eficiente das funções sem a necessidade de gerenciamento direto da infraestrutura subjacente.

  • 1. Tratamento de Eventos: O sistema recebe solicitações ou eventos, como requisições HTTP, disparos de fila de mensagens, alterações em dados armazenados, etc.
  • 2. Invocação das Funções: Cada evento é associado a uma função serverless específica que será executada para responder ao evento recebido. As funções são responsáveis por realizar a lógica necessária em resposta ao evento e podem se comunicar com outros serviços, como bases de dados ou APIs externas.
  • 3. Execução das Funções: O provedor da nuvem automaticamente escalona as funções para que estejam disponíveis quando necessário, garantindo desempenho adequado sem sobrecarga desnecessária.
  • 4. Armazenamento e Recuperação de Dados: Os dados gerados ou manipulados pelas funções podem ser armazenados em serviços cloud como bancos de dados gerenciados (como DynamoDB, Cosmos DB) ou sistemas de arquivo escaláveis.
  • 5. Observação e Controle: O sistema oferece recursos para monitorar o desempenho das funções, incluindo métricas de utilização, tempos de resposta e erro. Isso permite uma gestão proativa dos custos e do desempenho.
  • 6. Pagamento por Uso: A arquitetura serverless se destaca por cobrar apenas pelo uso efetivo das funções e recursos, eliminando os custos associados à manutenção de infraestrutura idle.

Esta estrutura flexível permite a alocação otimizada de recursos computacionais para cada evento ou solicitação, permitindo que as organizações maximizem seu investimento em tecnologia sem comprometer desempenho.

Exemplo real

Vamos considerar um exemplo de deploy de uma API de gerenciamento de estoque, utilizando AWS Lambda e Amazon API Gateway. Uma empresa chamada "Loja Online" deseja criar uma plataforma para gestão de produtos em seu site.

import boto3

apigateway = boto3.client('apigateway')

def atualizar_estoque(event):
    # Recuperar o ID do produto e quantidade atualizados
    produto_id = event['pathParameters']['produtoId']
    nova_quantidade = int(event['queryStringParameters']['quantidade'])

    # Atualizando a quantidade de estoque em banco de dados (neste exemplo, usamos DynamoDB)
    dynamodb = boto3.resource('dynamodb')
    tabela_estoque = dynamodb.Table('Estoque')
    tabela_estoque.update_item(
        Key={'produtoId': produto_id},
        UpdateExpression='set quantidade = :quantidade',
        ExpressionAttributeValues={':quantidade': nova_quantidade}
    )

apigateway.create_integration(
    restApiId='api-id',
    resourceId='resource-id',
    HttpMethod='PATCH',
    IntegrationHttpMethod='POST',
    Type='AWS',
    Uri=f'arn:aws:apigateway:{region}:lambda:path/2015-03-31/functions/{funcao_lambda_ARN}/invocations',
    Options={'allowTestCaseReuse': True}
)

Nesse exemplo, a API de gerenciamento de estoque é implementada utilizando AWS Lambda e Amazon API Gateway. A função serverless atualizar_estoque é invocada quando ocorre uma alteração no estoque, e ela atualiza a quantidade do produto em banco de dados DynamoDB. A API Gateway está configurada para invocar essa função serverless quando ocorrer uma alteração no estoque.

Boas práticas

Utilize a cache layer para melhorar desempenho e reduzir custos

Evite invocações desnecessárias à função Lambda, armazenando os resultados recentes em uma cache layer como Amazon Elastic Cache ou Amazon DynamoDB.

Use variáveis de ambiente para evitar hardcoded valores

Ao invés de hardcode arns ou IDs em seu código, utilize variáveis de ambiente para manter a consistência e facilitar o deploys.

Defina limites de tempo de execução para funções Lambda

Evite que funções demorem demais a executarem, configurando um tempo limite para garantir que elas concluam as tarefas em questão.

Armadilhas comuns

Aumento de custos por causa do uso excessivo de memória

O excessivo uso da memória pode resultar em uma cobrança mais alta pela função Lambda, especialmente se a aplicação não for cuidadosamente projetada para lidar com tal consumo.

Problemas de escalabilidade causados pelo acesso a banco de dados

Se sua função serverless for acessar o banco de dados frequentemente, isso pode gerar problemas de escalabilidade em seus sistemas. Utilizar cache e otimizar consultas pode ajudar a minimizar esse problema.

Conclusão

Em resumo, a implementação de APIs utilizando Serverless Functions pode ser uma abordagem eficiente e escalável, desde que adotadas boas práticas e evitados armadilhas comuns.

  • Utilizar cache para evitar invocações desnecessárias à função Lambda.
  • Manter os códigos limpos, utilizando variáveis de ambiente para evitar hardcoded valores.
  • Definir limites de tempo de execução para funções Lambda.

É recomendável profundizar na área de gerenciamento de estoque e cache layer para maximizar o desempenho da API. Além disso, é importante monitorar constantemente as métricas de custo e desempenho para ajustar a implementação conforme necessário. A próxima etapa pode incluir a integração com outras funcionalidades, como autenticação e autorização, ou o uso de tecnologias mais avançadas, como GraphQL.

Referências

  • Hashizume, Y. Serverless Architectures on AWS Lambda. Disponível em: https://docs.aws.amazon.com/pt_br/lambda/latest/dg/serverless-app.html. Acesso: 2024.
  • FOWLER, Martin. Microservices. Disponível em: http://martinfowler.com/articles/microservices.html. Acesso: 2024.
  • ThoughtWorks. What We Believe in Continuous Delivery. Disponível em: https://www.thoughtworks.com/continuous-delivery. Acesso: 2024.
  • OWSAP. Cheat Sheet: Security of Serverless Computing Environments. Disponível em: https://cheatsheetseries.owasp.org/cheatsheets/Serverless_Computing_Security_Cheat_Sheet.html. Acesso: 2024.