Exemplo de AWS API Gateway com Lambda pelo Terraform

Estou estudando sobre a AWS e algumas ferramentas. Para praticar o aprendido resolvi montar de exemplo uma API Rest utilizando o API Gateway rodando o código em lambdas, e para criar o ambiente optei pelo Terraform conectando no LocalStack (já que esse pode rodar localmente e não exige uma conta na AWS). Nesse texto descreverei o processo e quais tecnologias utilizei.

Primeiramente, para organizar o que precisaria implementar na API Rest utilizei o OpenAPI, que já serve de documentação da API também. O resultado foi um YAML que pode ser visualizado em algum editor que segue o padrão do OpenAPI, como o Swagger Editor (que atualmente apresenta alguns erros por não implementar ainda a versão utilizada da especificação).

Com a documentação da API pronta, o próximo passo foi subir o ambiente de nuvem, que optei pelo LocalStack que eu poderia rodar no meu próprio computador. Porém a versão gratuita do LocalStack não oferece suporte ao RDS para criar o banco de dados, então resolvi rodar o PostgreSQL por fora do ambiente de nuvem simulado pelo LocalStack. Para rodar tanto o PostgreSQL quanto o LocalStack optei por executá-los através de contêineres gerenciados pelo Docker Compose, que também é feito através de um YAML.

Com o LocalStack rodando é necessário uma forma de interagir com ele, uma delas é através do AWS CLI, porém optei pelo LocalStack AWS CLI que já configura os parâmetros necessários para se conectar no LocalStack em vez da AWS. Sua instalação pode ser feita através do pip com o pacote awscli-local.

Para processar as requisições optei por utilizar lambdas, que nada mais são do que um serviço da AWS que permite a execução de funções sem precisar se preocupar com o servidor (máquina virtual) onde rodarão. Visando ter um código o mais simples possível, utilizei diretamente o driver do PostgreSQL para Python (psycopg2), onde cada endereço da API seria respondido pela execução de uma função distinta (O readme do projeto detalha mais sobre os comandos para interagir com os lambdas).

Com os lambdas prontos, é necessário disponibilizar sua execução através de endereços HTTP, que é justamente o que o API Gateway faz. Nesse caso é necessário criar uma API, os caminhos dessa API e dizer quais métodos estão disponíveis, associando-os aos lambdas.

Porém eu gostaria de utilizar também o Terraform para criar esses recursos no LocalStack, então optei por recomeçar a configuração do zero. Para configurar o ambiente pelo Terraform basta criar um arquivo que descreva os recursos desejados, porém por questão de organização optei por dividir em módulos e com o arquivo de estado do Terraform em um bucket S3 simulando um ambiente que permite sua execução em computadores distintos.

Finalmente ao executar o Terraform obtive uma URL como http://localhost:4566/restapis/mea14qi3dw/main/_user_request_ onde pude acessar a API a partir dela, o qual realizei testes usando o HTTPie devido a sua facilidade de uso, ou através da interface disponibilizada pelo Swagger Editor que já é integrado na documentação.

Caso deseje visualizar o processo de deploy com Terraform, segue um vídeo do procedimento sendo executado:

O repositório com o código utilizado está no meu GitHub.