Visão geral
Neste tutorial, você cria uma função do Azure acionada por HTTP que consulta dados do MongoDB Atlas usando o driver MongoDB Node.js Você também aprenderá a gerenciar conexões de banco de dados em um contexto sem servidor e implementar sua função na nuvem do Azure.
Pré-requisitos
Antes de começar, conclua as seguintes etapas:
Implemente um cluster MongoDB Atlas , configure o acesso à rede e os usuários do banco de dados , e carregue os conjuntos de dados de amostra. Para saber como, consulte o guiade Introdução ao MongoDB.
Instale e configure o Azure CLI.
Instale e configure as principais ferramentas do Azure Functions.
Instale o Node.js versão 18 ou posterior.
Tutorial
Este tutorial orienta você nas seguintes etapas:
Criar recursos de nuvem do Azure.
Inicialize o projeto local .
Instale o driver MongoDB Node.js
Configure a conexão do banco de dados com o banco de dados do
sample_mflix.Escreva uma função para consultar a coleção
sample_mflix.moviese recuperar documentos representando filmes.Teste a função localmente.
Implemente no Azure.
Criar recursos de nuvem do Azure.
Execute o seguinte comando para criar um grupo de recursos, substituindo <GROUP_NAME> por um nome para seu grupo e <AZURE_REGION> por uma região do Azure compatível:
az group create \ --name <GROUP_NAME> \ --location <AZURE_REGION>
Opcionalmente, se você estiver usando o Azure pela primeira vez, talvez seja necessário executar os seguintes comandos para registrar o fornecedor de recursos de funções:
az provider register --namespace Microsoft.Storage az provider register --namespace Microsoft.Web
Em seguida, execute o seguinte comando para criar uma conta de armazenamento. Use a mesma região e nome de grupo do código anterior e forneça um nome exclusivo para a conta de armazenamento, substituindo o espaço reservado <STORAGE_NAME> por este nome exclusivo:
az storage account create \ --name <STORAGE_NAME> \ --location <AZURE_REGION> \ --resource-group <GROUP_NAME> \ --sku Standard_LRS
Por fim, execute o seguinte comando para criar o aplicativo de Funções:
az functionapp create \ --resource-group <GROUP_NAME> \ --consumption-plan-location <AZURE_REGION> \ --runtime node \ --functions-version 4 \ --name <APP_NAME> \ --storage-account <STORAGE_NAME>
Inicialize o projeto local .
Execute o seguinte comando para inicializar um projeto de função local:
func init MongoExample
Quando solicitado, selecione node como o tempo de execução do trabalhador e javascript como o idioma.
Execute os seguintes comandos para navegar até o diretório do projeto e criar uma nova função acionada por HTTP:
cd MongoExample func new --name GetMovies --template "HTTP trigger"
O comando cria o arquivo src/functions/GetMovies.js, que você edita nas etapas posteriores.
Para vincular seu projeto local ao aplicativo Azure Function, execute o seguinte comando no diretório do projeto :
func azure functionapp fetch-app-settings <APP_NAME>
Este comando baixa todas as configurações do aplicação do Azure, incluindo a configuração da conta de armazenamento, e preenche o arquivo local.settings.json do seu projeto.
Configure a conexão do banco de dados .
Abra o src/functions/GetMovies.js e substitua seu conteúdo pelo seguinte código:
const { app } = require("@azure/functions"); const { MongoClient } = require("mongodb"); const mongoClient = new MongoClient( process.env.MONGODB_ATLAS_URI ); app.http("GetMovies", { methods: ["GET"], authLevel: "anonymous", handler: async (request, context) => { // Query logic added in the next step } });
Dica
Defina mongoClient fora da função do manipulador para reutilizar conexões existentes entre invocações. Se você criar uma nova conexão dentro do manipulador, cada invocação abrirá uma nova conexão e poderá esgotar o número máximo de conexões simultâneas suportadas pelo banco de dados . A definição do cliente no nível do módulo mantém as contagens de conexão proporcionais ao tráfego.
Dependendo da sua versão do Node.js, você poderá encontrar um erro relacionado à resolução de DNS ao tentar se conectar ao MongoDB. Se isso ocorrer, adicione o seguinte código ao seu arquivo src/functions/GetMovies.js antes de criar a instância do MongoClient:
const { app } = require("@azure/functions"); const { MongoClient } = require("mongodb"); // Forces DNS servers explicitly before connecting to MongoDB require("node:dns/promises").setServers(["1.1.1.1", "8.8.8.8"]); const mongoClient = new MongoClient( process.env.MONGODB_ATLAS_URI ); app.http("GetMovies", { methods: ["GET"], authLevel: "anonymous", handler: async (request, context) => { // Query logic added in the next step } });
Abra o local.settings.json e adicione os seguintes campos ao objeto Values, substituindo cada espaço reservado pelos seus valores reais:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "<storage-connection-string>", "FUNCTIONS_WORKER_RUNTIME": "node", "MONGODB_ATLAS_URI": "<atlas-connection-string>", "MONGODB_ATLAS_DATABASE": "sample_mflix", "MONGODB_ATLAS_COLLECTION": "movies" }, "ConnectionStrings": {} }
Para recuperar sua string de conexão do MongoDB Atlas , navegue até o dashboard do Atlas , selecione seu cluster e clique Connect em. Para saber como recuperar a string de conexão do armazenamento Azure, consulte Configurar uma string de conexão na documentação do Azure.
Escreva uma função para consultar MongoDB.
Em src/functions/GetMovies.js, substitua o comentário // Query logic added in the next step dentro do manipulador pelo seguinte código:
try { const database = mongoClient.db( process.env.MONGODB_ATLAS_DATABASE ); const collection = database.collection( process.env.MONGODB_ATLAS_COLLECTION ); const results = await collection .find({}) .limit(10) .toArray(); return { jsonBody: results }; } catch (error) { return { status: 500, jsonBody: { message: "Internal server error." } }; }
Quando a função recebe uma solicitação, ela se conecta ao banco de dados e à coleção especificados por suas variáveis de ambiente e retorna até 10 documentos. Se ocorrer um erro, a função retornará uma resposta 500 que contém a mensagem de erro.
Teste a função localmente.
Na raiz do seu projeto, execute o seguinte comando para iniciar sua função:
func start
Quando o servidor é iniciado, a CLI exibe a URL local da sua função. Navegue até http://localhost:7071/api/GetMovies em seu navegador ou envie uma solicitação usando uma ferramenta como cURL ou Postman.
Observação
Se o servidor iniciar, mas você não conseguir recuperar os dados, verifique se o seu endereço IP local está incluído na lista de acesso à rede do Atlas . As regras de IP do centro de dados do Azure que você configurou para produção não se aplicam ao testar localmente. Para obter mais informações, consulte Configurar entradas da lista de acesso IP.
Implemente no Azure.
Defina suas variáveis de ambiente no Azure executando os seguintes comandos, substituindo cada espaço reservado por seus valores reais:
az functionapp config appsettings set \ --name <APP_NAME> \ --resource-group <GROUP_NAME> \ --settings MONGODB_ATLAS_URI=<atlas-connection-string> az functionapp config appsettings set \ --name <APP_NAME> \ --resource-group <GROUP_NAME> \ --settings MONGODB_ATLAS_DATABASE=sample_mflix az functionapp config appsettings set \ --name <APP_NAME> \ --resource-group <GROUP_NAME> \ --settings MONGODB_ATLAS_COLLECTION=movies
Implemente sua função executando o seguinte comando:
func azure functionapp publish <APP_NAME>
Deployment successful. Remote build succeeded! Syncing triggers... Functions in <APP_NAME>: GetMovies - [httpTrigger] Invoke url: https://<APP_NAME>.azurewebsites.net/api/getmovies
Quando o sistema for concluído, a CLI exibirá um URL público para sua função. Como a função usa authLevel: "anonymous", ela é acessível sem uma chave.
Observação
Para sistemas de produção, considere authLevel alterar "function" para ou "admin" e distribuir a chave apropriada para clientes autorizados. Para saber mais, consulte a documentação Trabalhar com chaves de acesso no Azure Functions.
Saiba mais
Para saber mais sobre os conceitos abordados neste tutorial, consulte os seguintes recursos:
Consulte Gerenciar Conexões com Funções do Azure na documentação do Atlas para saber mais sobre as práticas recomendadas de conexão
Consulte a documentação de Funções do Azure para saber mais sobre Funções