Introdução ao MongoDB Atlas e ao Azure Functions usando Node.js
Avalie esse Tutorial
Este artigo foi originalmente publicado na Community da Microsoft.
Então, você está criando aplicativos sem servidor com o Microsoft Azure Functions, mas precisa persistir os dados em um banco de dados. O que você faz para controlar o número de conexões simultâneas com o banco de dados a partir da função? O que acontecerá se a função atualmente conectada ao seu banco de dados for encerrada ou se uma nova instância ficar on-line para atender à demanda?
O conceito de serverless em geral, seja por meio de uma função ou banco de dados, é ótimo porque foi projetado para o aplicativo moderno. Os aplicativos que escalam sob demanda reduzem a sobrecarga de manutenção e os aplicativos que são pagos conforme o uso reduzem custos desnecessários.
Neste tutorial, vamos ver como é fácil interagir com MongoDB Atlas usando funções do Azure. Se você não estiver familiarizado com o MongoDB, ele oferece um document model flexível que pode ser usado para modelar seus dados para uma variedade de casos de uso e é facilmente integrado à maioria das pilhas de desenvolvimento de aplicativos. Além do document model, o MongoDB Atlas facilita o dimensionamento do seu banco de dados para atender à demanda tanto quanto faz com o Azure Function.
O foco da linguagem deste tutorial será Node.js e, como resultado, usaremos o driver MongoDB Node.js, mas os mesmos conceitos podem ser carregados entre os tempos de execução das funções do Azure.
Você precisará ter alguns dos pré-requisitos atendidos antes de iniciar o tutorial:
- Um banco de dadosMongoDB Atlas distribuído e configurado com regras de rede e regras de usuário apropriadas.
- Node.js 14+ instalado e configurado para atender aos requisitos do Azure Function.
Para este tutorial específico, usaremos uma instância sem servidor do MongoDB Atlas , pois nossas interações com o banco de dados serão bastante leves e queremos manter a flexibilidade de dimensionamento na camada de banco de dados de nosso aplicativo, mas qualquer tipo de implantação do Atlas, incluindo a camada gratuita, funcionará bem, portanto, recomendamos que você avalie e escolha a opção melhor para suas necessidades. Vale a pena observar que você também pode configurar a flexibilidade de escalabilidade para nossos clusters dedicados com escalonamento automático, que permite selecionar limites mínimos e máximos de escalabilidade para seu banco de dados.
Também vamos fazer referência aos conjuntos de dados de amostra que o MongoDB oferece, então, se você quiser acompanhar, certifique-se de instalá-los a partir do painel do MongoDB Atlas.
Ao definir suas regras de rede para seu banco de dados MongoDB Atlas, use os endereços IP de saída para os centros de dados do Azure, conforme definido na documentação do Microsoft Azure.
Embora estejamos usando a linha de comando, a maior parte do que vemos aqui também pode ser feita no portal da Web.
Supondo que você tenha a CLI do Azure instalada e ela esteja configurada para usar sua conta do Azure, execute o seguinte:
1 az group create --name <GROUP_NAME> --location <AZURE_REGION>
Você precisará escolher um nome para seu grupo, bem como uma região Azure compatível. Sua escolha não afetará o resto do tutorial desde que você seja consistente o tempo todo. É uma boa ideia escolher uma região mais próxima de você ou de seus usuários para obter a melhor latência possível para seu aplicativo.
Com o grupo criado, execute o seguinte para criar uma conta de armazenamento:
1 az storage account create --name <STORAGE_NAME> --location <AZURE_REGION> --resource-group <GROUP_NAME> --sku Standard_LRS
O comando acima deve usar a mesma região e grupo que você definiu na etapa anterior. Esse comando cria uma conta de armazenamento nova e exclusiva para ser usada com sua função. A conta de armazenamento não será usada localmente, mas será usada quando implantarmos nossa função na cloud.
Com a conta de armazenamento criada, precisamos criar um novo aplicativo Function. Execute o seguinte da CLI:
1 az functionapp create --resource-group <GROUP_NAME> --consumption-plan-location <AZURE_REGION> --runtime node --functions-version 4 --name <APP_NAME> --storage-account <STORAGE_NAME>
Supondo que você tenha sido consistente e tenha trocado os itens do espaço reservado quando necessário, você deve ter um projeto do Azure Function pronto para Go na nuvem.
Os comandos usados até agora podem ser encontrados na documentação da Microsoft. Acabamos de mudar qualquer coisa .NET relacionada ao Node.js, mas, como mencionado anteriormente, o MongoDB Atlas é compatível com uma variedade de tempos de execução, incluindo .NET, e este tutorial pode ser referenciado para outras linguagens.
Com a maior parte da configuração da cloud fora do caminho, podemos focar no projeto local onde escreveremos todo o nosso código. Isso será feito com o aplicativoAzure Functions Core Tools.
Execute o seguinte comando na CLI para criar um novo projeto:
1 func init MongoExample
Quando solicitado, escolha Node.js e JavaScript, pois é o que usaremos para este exemplo.
Navegue até o projeto e crie sua primeira função do Azure com o seguinte comando:
1 func new --name GetMovies --template "HTTP trigger"
O comando acima criará uma função intitulada "GetMovies" com base no modelo "HTTP trigger". O objetivo dessa função será recuperar vários filmes do nosso banco de dados. Quando chegar a hora, adicionaremos a maior parte do nosso código ao arquivoGetMovies/index.js no projeto.
Há mais algumas coisas que devem ser feitas antes de começarmos a escrever código.
Nosso projeto local e conta de nuvem estão configurados, mas ainda não os vinculamos. Precisamos vinculá-los, para que nossa função seja implantada no local correto.
No projeto, execute o seguinte da CLI:
1 func azure functionapp fetch-app-settings <FUNCTION_APP_NAME>
Não se lembre de substituir o valor do espaço reservado no comando acima pelo seu nome real do Azure Function. O comando acima baixará os detalhes de configuração do Azure e os colocará em seu projeto local, especialmente no arquivolocal.settings.json do projeto.
Em seguida, execute o seguinte comando na CLI:
1 func azure functionapp fetch-app-settings <STORAGE_NAME>
O comando acima adicionará os detalhes de armazenamento ao arquivo local.settings.json do projeto.
Como planejamos usar o driver MongoDB Node.js, precisaremos adicionar o driver ao nosso projeto e configurá-lo. Nenhuma dessas coisas será complicada ou demorada de fazer.
Na raiz de seu projeto local, execute o seguinte na linha de comando:
1 npm install mongodb
O comando acima adicionará o MongoDB ao nosso projeto e o adicionará ao arquivopackage.jsondo nosso projeto para que ele possa ser adicionado automaticamente quando implantarmos nosso projeto na nuvem.
Agora você deve ter uma função "GetMovies" se estiver acompanhando este tutorial.Abra o arquivoGetMovies/index.jdo projetopara que possamos configurá-lo para MongoDB:
1 const { MongoClient } = require("mongodb"); 2 const mongoClient = new MongoClient(process.env.MONGODB_ATLAS_URI); 3 module.exports = async function (context, req) { 4 5 // Function logic here ... 6 7 }
No trecho acima, estamos importando MongoDB e estamos criando um novo cliente para se comunicar com nosso cluster. Estamos usando uma variável de ambiente para armazenar nossas informações de conexão.
Para encontrar seu URI, acesse o painel do MongoDB Atlas e clique em "Conectar" para seu cluster.
Traga esta string URI para o arquivolocal.settings.jsondo seu projeto. Seu arquivo pode ter a seguinte aparência:
1 { 2 3 "IsEncrypted": false, 4 5 "Values": { 6 7 // Other fields here ... 8 9 "MONGODB_ATLAS_URI": "mongodb+srv://demo:<password>@examples.mx9pd.mongodb.net/?retryWrites=true&w=majority", 10 11 "MONGODB_ATLAS_CLUSTER": "examples", 12 13 "MONGODB_ATLAS_DATABASE": "sample_mflix", 14 15 "MONGODB_ATLAS_COLLECTION": "movies" 16 17 }, 18 19 "ConnectionStrings": {} 20 21 }
Os valores no arquivolocal.settings.json estarão acessíveis como variáveis de ambiente em nosso projeto local. Concluiremos etapas adicionais posteriormente no tutorial para torná-los compatíveis com a nuvem.
A primeira fase de nossa instalação e configuração do MongoDB Atlas está concluída!
Continuaremos com o arquivoGetMovies/index.jsdo nosso projeto, mas, desta vez, vamos nos concentrar em alguma lógica básica do MongoDB.
No código da função do Azure, devemos ter o seguinte a partir de agora:
1 const { MongoClient } = require("mongodb"); 2 const mongoClient = new MongoClient(process.env.MONGODB_ATLAS_URI); 3 module.exports = async function (context, req) { 4 5 // Function logic here ... 6 7 }
Ao trabalhar com uma função sem servidor, você não tem controle sobre a disponibilidade imediata ou não da sua função. Em outras palavras, você não tem controle se a função está pronta para ser consumida ou se deve ser criada. O ponto de não ter servidor é que você o use conforme necessário.
Devemos ser cuidadosos sobre como usamos uma função sem servidor com um banco de dados. Todos os bancos de dados, não específicos do MongoDB, podem manter um determinado número de conexões simultâneas antes de encerrar. Em um aplicativo tradicional, você geralmente estabelece uma única conexão que permanece enquanto o aplicativo existir. Não é o caso de uma função do Azure. Se você estabelecer uma nova conexão dentro do seu bloco de função, correrá o risco de que muitas conexões sejam estabelecidas se a sua função for popular. Em vez disso, o que estamos fazendo é criar o cliente MongoDB fora da função e estamos usando esse mesmo cliente dentro de nossa função. Isso nos permite criar conexões somente se as conexões não existirem.
Agora podemos pular para a lógica da função:
1 module.exports = async function (context, req) { 2 3 try { 4 5 const database = await mongoClient.db(process.env.MONGODB_ATLAS_DATABASE); 6 7 const collection = database.collection(process.env.MONGODB_ATLAS_COLLECTION); 8 9 const results = await collection.find({}).limit(10).toArray(); 10 11 context.res = { 12 13 "headers": { 14 15 "Content-Type": "application/json" 16 17 }, 18 19 "body": results 20 21 } 22 23 } catch (error) { 24 25 context.res = { 26 27 "status": 500, 28 29 "headers": { 30 31 "Content-Type": "application/json" 32 33 }, 34 35 "body": { 36 37 "message": error.toString() 38 39 } 40 41 } 42 43 } 44 45 }
Quando a função é executada, façamos referência ao banco de dados e à collection que planejamos usar. Eles são extraídos do nosso arquivolocal.settings.json ao trabalhar localmente.
Em seguida, realizamos uma operação
find
em nossa collection com um critério de correspondência vazio. Isso retornará todos os documentos em nossa collection, portanto, a próxima coisa que podemos fazer é limitar a dez (10) ou menos resultados.Qualquer resultado que retornarmos, usaremos como resposta. Por padrão, a resposta é texto simples, portanto, ao definir o cabeçalho, podemos garantir que a resposta seja JSON. Se em algum momento houve uma exceção, nós a capturamos e a retornamos.
Quer ver o que temos em ação?
Execute o seguinte comando a partir da raiz do seu projeto:
1 func start
Quando ele for concluído, você provavelmente poderá acessar sua função do Azure no seguinte endpoint local: http://localhost:7071/api/GetMovies
Lembre-se, não implantamos nada e estamos apenas simulando tudo localmente.
Se o servidor local iniciar com sucesso, mas você não conseguir acessar seus dados ao visitar o endpoint, verifique se você tem as regras de rede corretas no MongoDB Atlas. Lembre-se de que você pode ter adicionado as regras de rede do Azure Function, mas se estiver testando localmente, pode estar esquecendo seu IP local na lista.
Se tudo estiver funcionando conforme o esperado quando você testar sua função localmente, estará pronto para implementá-la na nuvem do Microsoft Azure.
Precisamos garantir que nossas variáveis de ambiente local cheguem à nuvem. Isso pode ser feito por meio do dashboard da web no Azure ou por meio da linha de comando. Vamos fazer tudo a partir da linha de comando.
Na CLI, execute os seguintes comandos, substituindo os valores do espaço reservado pelos seus próprios valores:
1 az functionapp config appsettings set --name <FUNCTION_APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --settings MONGODB_ATLAS_URI=<MONGODB_ATLAS_URI> 2 3 az functionapp config appsettings set --name <FUNCTION_APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --settings MONGODB_ATLAS_DATABASE=<MONGODB_ATLAS_DATABASE> 4 5 az functionapp config appsettings set --name <FUNCTION_APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --settings MONGODB_ATLAS_COLLECTION=<MONGODB_ATLAS_COLLECTION>
Com as variáveis de ambiente em vigor, podemos implantar a função usando o seguinte comando da CLI:
1 func azure functionapp publish <FUNCTION_APP_NAME>
Pode levar alguns minutos para ser implantado, mas, quando concluído, a CLI fornecerá uma URL pública para suas funções.
Antes de tentar testá-las a partir do cURL, Postman ou similar, certifique-se de obter uma "chave de host" do Azure para usar em suas solicitações HTTP.
Neste tutorial, vimos como conectar o MongoDB Atlas ao Azure Functions usando o driver do MongoDB Node.js para criar aplicativos escaláveis sem servidor. Embora não tenhamos visto isso neste tutorial, há muitas coisas que você pode fazer com o driver Node.js para MongoDB, como queries complexas com uma aggregation pipeline e operações CRUD básicas.
Para saber mais do que você pode realizar com o MongoDB e o Node.js, confira o Centro do Desenvolvedor do MongoDB.
Com o MongoDB Atlas no Microsoft Azure, os desenvolvedores recebem acesso à plataforma de dados para desenvolvedores mais abrangente, segura, escalável e baseada na cloud do mercado. Agora, com a disponibilidade do Atlas no Azure Marketplace, nunca foi tão fácil para os usuários começarem a construir com o Atlas enquanto simplificam os processos de aquisição e cobrança. Comece hoje mesmo por meio da listagemdo Atlas no Azure Marketplace .