Usando o driver Node.js MongoDB com AWS Lambda
Avalie esse Tutorial
O JavaScript percorreu um longo caminho desde sua discreta introdução nos 1990s. É a linguagem mais popular, de acordo com a Pesquisa sobre desenvolvedores do Stack Overflow, há 10 anos consecutivos. Portanto, não é surpreendente que ela tenha emergido como a linguagem mais popular para escrever funções sem servidor.
Escrever uma função sem servidor usando JavaScript é simples e semelhante a escrever um manipulador de rotas no Express.js. A principal diferença é como o servidor lidará com o código. Como desenvolvedor, você só precisa se concentrar no próprio manipulador, e o provedor de nuvem manterá toda a infraestrutura necessária para executar essa função. É por isso que o serverless está ganhando cada vez mais força. Quase não há sobrecarga que vem com o gerenciamento do servidor; Basta escrever seu código e implantá-lo no provedor de nuvem de sua escolha.
Este artigo mostrará como escrever uma função sem servidor do AWS Lambda que se conecta ao MongoDB Atlas para consultar alguns dados e como evitar armadilhas comuns que causariam um desempenho ruim.
Para este artigo, você precisará de conhecimento básico de JavaScript. Você também precisará de:
- Um banco dedados MongoDB Atlas carregado com dados de amostra (uma camada grátis é boa). Já tem uma conta AWS? O Atlas oferece suporte ao pagamento por uso por meio do AWS Marketplace (AWS MP) sem qualquer compromisso inicial - simplesmente Inscreva-se no MongoDB Atlas por meio do AWS Marketplace.
Para começar, vamos criar uma função lambda básica. Esta função será usada mais tarde para se conectar à nossa instância MongoDB.
Na Amazon Web Services, Go o serviço Lambda. A partir daí, você pode clicar no botão "Criar função". Preencha o formulário com um nome para sua função e abra as configurações avançadas.
Como você deseja acessar essa função a partir de um navegador, será necessário alterar essas configurações:
- Marque a opção "Ativar URL de função".
- Em "Tipo de autenticação", escolha "NONE".
- Marque a caixa "Configure cross-origin resource sharing (CORS)".
Agora clique em "Criar função" e você está pronto para Go. Em seguida, você será presenteado com uma tela semelhante à seguinte.
Você pode ver uma janela com algum código. Essa função retornará um código de status 200 (OK) e o corpo da solicitação será "Olá do Lambda!".
Você pode testar essa função acessando "Configuração" acima do editor de código. Em seguida, escolha "URL da função" no menu de navegação esquerdo. Em seguida, você verá um link chamado "Function URL." Ao clicar nesse link, uma nova guia será aberta com a mensagem esperada.
Se você alterar o código para retornar um corpo diferente, clique em "Implantar" na parte superior e atualize a segunda guia, você verá sua nova mensagem.
Você acabou de criar seu primeiro endpoint HTTPS que atenderá à resposta gerada pela sua função.
Embora possa ser trivial escrever funções simples, há algumas considerações que você deve ter em mente ao lidar com AWS Lambda e MongoDB.
Você pode escrever suas funções diretamente no editor de código fornecido pelo AWS Lambda, mas é provável que você queira armazenar seu código em um repositório para compartilhar com sua equipe. Ao enviar seu código, tome cuidado para não fazer upload de algumas de suas chaves secretas. Com seu banco de dados, por exemplo, você não gostaria de enviar sua cadeia de conexão acidentalmente. Você pode usar uma variável de ambiente para isso.
Na tela AWS Lambda, vá para a guia "Configuration" na parte superior e escolha "Variáveis de ambiente" na barra de navegação à esquerda. Clique em "Editar" e você terá a opção de adicionar uma nova variável de ambiente. Preencha o formulário com os seguintes valores:
- Chave: MONGODB_CONNECTION_STRING
- Valor: Esta é uma string de conexão
Agora Go ao editor de código e use o
process.env
para retornar a variável de ambiente recém-criada como o corpo da sua solicitação.1 export const handler = async(event) => { 2 const response = { 3 statusCode: 200, 4 body: process.env.MONGODB_CONNECTION_STRING, 5 }; 6 return response; 7 };
Se você atualizar a guia que abriu anteriormente, verá o valor dessa variável de ambiente. No exemplo abaixo, você alterará o valor dessa variável de ambiente para se conectar ao seu banco de dados MongoDB Atlas.
Quando você inicializa um
MongoClient
com o driver Node.js, ele cria um pool de conexões que podem ser usadas pelo seu aplicativo. O MongoClient garante que essas conexões sejam fechadas após algum tempo para que você não atinja o limite.Um erro comum ao usar o MongoDB Atlas com o AWS Lambda é criar um novo pool de conexões toda vez que sua função recebe uma solicitação. Uma função mal escrita pode levar à criação de novas conexões a cada vez, como exibido no diagrama a seguir da tela de monitoramento do Atlas.
Esse pico repentino de conexões é resultado do acionamento de uma função Lambda a cada segundo por aproximadamente dois minutos.
O segredo para corrigir isso é mover a criação do cliente MongoDB para fora do manipulador. Isso será mostrado no exemplo abaixo. Depois que o código for corrigido, você poderá ver uma melhoria significativa no número de conexões simultâneas.
Agora que você conhece as armadilhas a serem evitadas, é hora de criar uma função que se conecte ao MongoDB Atlas.
Para este exemplo, você pode usar a mesma função criada anteriormente. Go para as configurações "Variáveis de ambiente" e coloque a cadeia de conexão do seu MongoDB database como o valor para a variável de ambiente "MONGODB_CONNECTION_STRING". Você pode encontrar sua connection string na Atlas.
Como você precisará de pacotes adicionais para executar essa função, não poderá mais usar o editor de código.
Crie uma nova pasta em seu computador, inicialize um novo projeto Node.js usando
npm
e instale o pacotemongodb
.1 npm init -y 2 npm install mongodb
Crie um novo arquivo
index.mjs
nesse diretório e cole o código a seguir.1 import { MongoClient } from "mongodb"; 2 const client = new MongoClient(process.env.MONGODB_CONNECTION_STRING); 3 export const handler = async(event) => { 4 const db = await client.db("sample_mflix"); 5 const collection = await db.collection("movies"); 6 const body = await collection.find().limit(10).toArray(); 7 const response = { 8 statusCode: 200, 9 body 10 }; 11 return response; 12 };
Esse código começará com a criação de um novo MongoClient. Observe como o cliente é declarado fora da função do manipulador. É assim que você evitará problemas com seu pool de conexões. Além disso, observe como ele usa a string de conexão fornecida na configuração do Lambda em vez de um valor codificado.
Dentro do manipulador, o código se conecta ao banco de dados
sample_mflix
e à coleçãomovies
. Em seguida, ele encontra os primeiros resultados 10 e os converte em uma array.Os resultados 10 são então retornados como o corpo da função Lambda.
Sua função agora está pronta para ser implantada. Desta vez, você precisará compactar o conteúdo dessa pasta. Para fazer isso, você pode usar sua GUI favorita ou o seguinte comando se tiver o utilitário
zip
instalado.1 zip -r output.zip .
Go ao editor de código do Lambda e procure o botão "Upload from" no canto superior direito do editor. Escolha o arquivo
output.zip
recém-criado e clique em "Save."Agora Go para a guia com o resultado da função e clique em atualizar. Você deve ver os primeiros 10 documentos da collection
movies
.Usar o AWS Lambda é uma ótima maneira de escrever pequenas funções que podem ser executadas com eficiência sem se preocupar com a configuração de servidores. É também uma maneira muito econômicas de hospedar seu aplicativo, pois você paga apenas por uso. Você pode encontrar mais detalhes sobre como criar funções do Lambda para se conectar ao MongoDB database na documentação.
Se você quiser uma solução totalmente sem servidor, também pode executar o MongoDB como um serviçosem servidor. Como as funções do Lambda, você pagará apenas por uma instância do banco de dados sem servidor com base no uso.