Overview
En este tutorial, crea una Azure Function activada por HTTP que consulta datos de MongoDB Atlas utilizando el controlador de MongoDB para Node.js. También aprenderás a gestionar conexiones a bases de datos en un contexto sin servidor y a implementar tu función en la nube de Azure.
Requisitos previos
Antes de comenzar, sigue los siguientes pasos:
Implementa un clúster MongoDB Atlas, configura el acceso a la red y los usuarios de la base de datos, y carga los conjuntos de datos de ejemplo. Para aprender cómo, consulta la guía Introducción a MongoDB.
Instale y configure el Azure CLI.
Instale y configure Azure Functions Core Tools.
Instala Node.js versión 18 o posterior.
Tutorial
Este tutorial lo guía a través de los siguientes pasos:
Crear recursos en la nube de Azure.
Inicializa el proyecto local.
Instale el controlador de MongoDB para Nodo.js.
Configura la conexión de la base de datos a la base de datos
sample_mflix.Escribe una función para consultar la colección
sample_mflix.moviesy recuperar documentos que representen películas.Prueba la función localmente.
Implementa en Azure.
Crear recursos en la nube de Azure.
Ejecute el siguiente comando para crear un grupo de recursos, reemplazando <GROUP_NAME> por un nombre para su grupo y <AZURE_REGION> por una región de Azureadmitida:
az group create \ --name <GROUP_NAME> \ --location <AZURE_REGION>
Opcionalmente, si está utilizando Azure por primera vez, es posible que deba ejecutar los siguientes comandos para registrar el proveedor de recursos Functions:
az provider register --namespace Microsoft.Storage az provider register --namespace Microsoft.Web
A continuación, ejecuta el siguiente comando para crear una cuenta de almacenamiento. Utiliza la misma región y nombre de grupo del código anterior y proporciona un nombre único para la cuenta de almacenamiento, sustituyendo el marcador <STORAGE_NAME> por este nombre único:
az storage account create \ --name <STORAGE_NAME> \ --location <AZURE_REGION> \ --resource-group <GROUP_NAME> \ --sku Standard_LRS
Por último, ejecuta el siguiente comando para crear la aplicación de Function:
az functionapp create \ --resource-group <GROUP_NAME> \ --consumption-plan-location <AZURE_REGION> \ --runtime node \ --functions-version 4 \ --name <APP_NAME> \ --storage-account <STORAGE_NAME>
Inicializa el proyecto local.
Ejecuta el siguiente comando para iniciar un proyecto de función local:
func init MongoExample
Cuando se le indique, seleccione node como tiempo de ejecución de trabajador y javascript como lenguaje.
Ejecuta los siguientes comandos para navegar al directorio del proyecto y crear una nueva función activada por HTTP:
cd MongoExample func new --name GetMovies --template "HTTP trigger"
El comando crea el archivo src/functions/GetMovies.js, que se edita en pasos posteriores.
Para vincular tu proyecto local a la aplicación de Azure Function, ejecuta el siguiente comando desde el directorio del proyecto:
func azure functionapp fetch-app-settings <APP_NAME>
Este comando descarga todas las configuraciones de la aplicación desde Azure, incluidas la configuración de la cuenta de almacenamiento, y rellena el archivo local.settings.json de tu proyecto.
Configure la conexión con la base de datos.
Abre src/functions/GetMovies.js y reemplaza su contenido con el siguiente 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 } });
Tip
Defina mongoClient fuera de la función del handler para reutilizar las conexiones existentes entre invocaciones. Si creas una nueva conexión dentro del handler, cada invocación abre una nueva conexión y corre el riesgo de agotar el número máximo de conexiones simultáneas que admite tu base de datos. Definir el cliente a nivel de módulo mantiene la cantidad de conexiones proporcional al tráfico.
Dependiendo de tu versión de Node.js, puedes encontrar un error relacionado con la resolución de DNS al intentar conectarte a MongoDB. Si esto ocurre, añade el siguiente código a tu archivo src/functions/GetMovies.js antes de crear la instancia de 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 } });
Abre local.settings.json y añade los siguientes campos al objeto Values, sustituyendo cada marcador de posición por tus valores reales:
{ "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 tu cadena de conexión de MongoDB Atlas, ve al tablero Atlas, selecciona tu clúster y haz clic en Connect. Para saber cómo recuperar su cadena de conexión de almacenamiento de Azure, consulte Configurar una cadena de conexión en la documentación de Azure.
Escribe una función para consultar MongoDB.
En src/functions/GetMovies.js, reemplace el comentario // Query logic added in the next step dentro del controlador con el siguiente 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." } }; }
Cuando la función recibe una solicitud, se conecta a la base de datos y la colección especificadas por sus variables de entorno y devuelve hasta 10 documentos. Si ocurre un error, la función devuelve una respuesta 500 que contiene el mensaje de error.
Prueba la función localmente.
Desde la raíz de tu proyecto, ejecuta el siguiente comando para iniciar tu función:
func start
Cuando el servidor se inicia, la CLI muestra la URL local de tu función. Navega a http://localhost:7071/api/GetMovies en tu navegador o envía una solicitud utilizando una herramienta como cURL o Postman.
Nota
Si el servidor se inicia pero no se pueden recuperar datos, se debe verificar que la dirección IP local esté incluida en la lista de acceso a la red de Atlas. Las reglas de IP del centro de datos de Azure que configuró para producción no se aplican cuando realiza pruebas localmente. Para obtener más información, consulte Configurar entradas de listas de acceso IP.
Implementa en Azure.
Configura tus variables de entorno en Azure ejecutando los siguientes comandos, reemplazando cada marcador de posición con tus valores reales:
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 tu función ejecutando el siguiente 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
Cuando se complete la implementación, la CLI mostrará una URL pública para tu función. Debido a que la función utiliza authLevel: "anonymous", es accesible sin una clave.
Nota
Para implementaciones en producción, considere cambiar authLevel a "function" o "admin" y distribuir la clave adecuada a los clientes autorizados. Para obtener más información, consulta la Trabajar con claves de acceso en Azure Functions documentación.
Obtén más información
Para obtener más información sobre los conceptos abordados en este tutorial, consulta los siguientes recursos:
Consulta Administrar conexiones con Azure Functions en la documentación de Atlas para saber más sobre las mejores prácticas de conexión
Consulte la documentación de Azure Functions para obtener más información sobre Functions