1. Introducción
En esta publicación,veremos cómo Cloud Run y MongoDB se unen para permitir una experiencia de desarrollo de aplicaciones de pila MEAN completamente sin servidores. Aprenderemos a compilar una aplicación MEAN sin servidores con Cloud Run y MongoDB Atlas, la plataforma de datos de aplicaciones multicloud de MongoDB.
¿Qué es Cloud Run?
Cloud Run te permite compilar e implementar apps escalables y alojadas en contenedores en cualquier lenguaje (incluidos Go, Python, Java, Node.js, .NET y Ruby) en una plataforma completamente administrada. Cloud Run se destaca por lo siguiente:
- Empaquetar código en varios contenedores sin estado que reconocen las solicitudes y lo invocan a través de solicitudes HTTP
- Solo se te cobrarán los recursos exactos que uses
- Admite cualquier lenguaje de programación o cualquier biblioteca del sistema operativo que elijas, o cualquier objeto binario
Consulta este vínculo para obtener más funciones en contexto.
Base de datos sin servidores con MongoDB Atlas
MongoDB lanzó instancias sin servidores, una nueva implementación de base de datos sin servidores completamente administrada en Atlas para resolver este problema. Con las instancias sin servidores, nunca tendrás que pensar en la infraestructura. Simplemente implementa tu base de datos y se ajustará automáticamente según la demanda, sin necesidad de administración manual. Y lo mejor de todo es que solo se te cobrarán las operaciones que ejecutes. Para que nuestra arquitectura sea verdaderamente sin servidores, combinaremos las capacidades de Cloud Run y MongoDB Atlas.
Pila de MEAN
La pila de MEAN es una pila de tecnología para compilar aplicaciones web de pila completa completamente con JavaScript y JSON. La pila de MEAN se compone de cuatro componentes principales: MongoDB, Express, Angular y Node.js.
- MongoDB es responsable del almacenamiento de datos.
- Express.js es un framework de aplicaciones web de Node.js para compilar APIs.
- Angular es una plataforma de JavaScript del cliente.
- Node.js es un entorno de ejecución de JavaScript del servidor. El servidor usa el controlador de MongoDB Node.js para conectarse a la base de datos y recuperar y almacenar datos.
Qué compilarás
Escribirás una aplicación de pila completa de Employee-Job Role en MongoDB, Express JS, Angular JS y Node JS. Contiene los elementos siguientes:
- Una aplicación de servidor en Node JS y Express JS, alojada en contenedores
- Una aplicación cliente compilada en AngularJS, alojada en contenedores
- Ambas aplicaciones se implementan en Cloud Run
- La app del servidor se conecta a la instancia de MongoDB sin servidores con el controlador de MongoDB NodeJS
- La API del servidor lleva a cabo las interacciones de lectura y escritura con la base de datos
- La aplicación cliente es la interfaz de usuario para la aplicación Employee-Job Role
Qué aprenderás
- Cómo crear instancias de MongoDB sin servidores
- Cómo configurar un proyecto de Cloud Run
- Cómo implementar aplicaciones web en Google Cloud Run
- Cómo crear e implementar una aplicación de pila MEAN
2. Requisitos
3. Crea la instancia y la base de datos de MongoDB sin servidores
- Para comenzar, comienza a usar MongoDB Atlas en Google Cloud

- Una vez que te registres, haz clic en el botón "Compilar una base de datos" para crear una nueva instancia sin servidores. Selecciona la siguiente configuración:

- Una vez que se aprovisione tu instancia sin servidores, deberías verla en funcionamiento.

- Haz clic en el botón "Conectar" para agregar una dirección IP de conexión y un usuario de la base de datos.
- En este codelab, usaremos el parámetro de configuración "Permitir acceso desde cualquier lugar". MongoDB Atlas incluye un conjunto de funciones de seguridad y acceso. Puedes obtener más información sobre ellas en el artículo de documentación sobre funciones de seguridad.
- Usa las credenciales que elijas para el nombre de usuario y la contraseña de la base de datos. Una vez que se completen estos pasos, deberías ver lo siguiente:

- Para continuar, haz clic en el botón "Elegir un método de conexión" y, luego, selecciona "Conectar tu aplicación".

- Copia la cadena de conexión que ves y reemplaza la contraseña por la tuya. Usaremos esa cadena para conectarnos a nuestra base de datos en las siguientes secciones.
4. Configura un proyecto de Cloud Run
- Primero, accede a la consola de Cloud, crea un proyecto nuevo o reutiliza uno existente.
- Recuerda el ID del proyecto que creaste.
- A continuación, se muestra una imagen que muestra la página del proyecto nuevo, en la que puedes ver el ID del proyecto mientras lo creas.

- Luego, habilita la API de Cloud Run desde Cloud Shell:
- Activa Cloud Shell desde la consola de Cloud. Solo haz clic en Activar Cloud Shell.
- Una vez que estés conectado a Cloud Shell, deberías ver que ya te autenticaste y que el proyecto ya se configuró con tu ID DEL PROYECTO. Si, por algún motivo, el proyecto no está configurado, solo emite el siguiente comando:
gcloud config set project PROJECT_ID

- Usa el siguiente comando:
gcloud services enable run.googleapis.com
- Usaremos Cloud Shell y el editor de Cloud Shell para las referencias de código. Para acceder al editor de Cloud Shell, haz clic en Abrir editor desde la terminal de Cloud Shell:

5. Clona el proyecto de pila MEAN
- Implementaremos una aplicación web de administración de empleados. La API de REST se compila con Express y Node.js; la interfaz web, con Angular; y los datos se almacenarán en la instancia de MongoDB Atlas que creamos anteriormente.
- Para clonar el repositorio del proyecto, ejecuta el siguiente comando en la terminal de Cloud Shell:
git clone https://github.com/mongodb-developer/mean-stack-example.git
6. Implementa la API de REST de Express y Node.js
Archivo de configuración de Docker
- Primero, implementaremos un servicio de Cloud Run para la API de REST de Express. El archivo más importante para nuestra implementación es el archivo de configuración de Docker. Echemos un vistazo:
mean-stack-example/server/Dockerfile
# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:17-slim
WORKDIR /usr/app
COPY ./ /usr/app
# Install dependencies and build the project.
RUN npm install
RUN npm run build
# Run the web service on container startup.
CMD ["node", "dist/server.js"]
- La configuración configura Node.js, y copia y compila el proyecto. Cuando se inicia el contenedor, el siguiente comando inicia el servicio.
node dist/server.js
- Para iniciar una nueva implementación de Cloud Run, haz clic en el ícono de Cloud Run en la barra lateral izquierda:

- Luego, haz clic en el ícono Implementar en Cloud Run:

- Completa la configuración del servicio de la siguiente manera:
- Nombre del servicio: node-express-api
- Plataforma de implementación: Cloud Run (completamente administrado)
- Región: Selecciona una región cercana a la región de tu base de datos para reducir la latencia.
- Autenticación: Permitir invocaciones no autenticadas
- En Configuración de revisión, haz clic en Mostrar configuración avanzada para expandirla:
- Puerto de contenedor: 5200
- Variables de entorno. Agrega el siguiente par clave-valor y asegúrate de agregar la cadena de conexión para tu propia implementación de MongoDB Atlas:
ATLAS_URI:mongodb+srv:/<username>:<password>@sandbox.pv0l7.mongodb.net/meanStackExample?retryWrites=true&w=majority
- En el entorno de compilación, selecciona Cloud Build.
- Por último, en la sección Configuración de compilación, selecciona lo siguiente:
- Compilador: Docker
- Docker: mean-stack-example/server/Dockerfile
- Haz clic en el botón Implementar y, luego, en Mostrar registros detallados para seguir la implementación de tu primer servicio de Cloud Run.
- Una vez que se complete la compilación, deberías ver la URL del servicio implementado:

- Abre la URL y agrega "/employees" al final.
- Deberías ver un array vacío porque, actualmente, no hay documentos en la base de datos.
Implementemos la interfaz de usuario para que podamos agregar algunos.
7. Implementa la aplicación web de Angular
Nuestra aplicación de Angular está en el directorio del cliente. Para implementarla, usaremos el servidor Nginx y Docker. Solo una idea, también hay una opción para usar Firebase Hosting para la implementación de tu aplicación de Angular, ya que puedes entregar tu contenido directamente a una CDN (red de distribución de contenido).
Archivos de configuración
Echemos un vistazo a los archivos de configuración:
mean-stack-example/client/nginx.conf
events{}
http {
include /etc/nginx/mime.types;
server {
listen 8080;
server_name 0.0.0.0;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
}
- En la configuración de Nginx, especificamos el puerto predeterminado (8080) y el archivo de inicio (index.html).
mean-stack-example/client/Dockerfile
FROM node:17-slim AS build
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
# Install dependencies and copy them to the container
RUN npm install
COPY . .
# Build the Angular application for production
RUN npm run build --prod
# Configure the nginx web server
FROM nginx:1.17.1-alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY --from=build /usr/src/app/dist/client /usr/share/nginx/html
# Run the web service on container startup.
CMD ["nginx", "-g", "daemon off;"]
- En la configuración de Docker, instalamos las dependencias de Node.js y compilamos el proyecto. Luego, copiamos los archivos compilados en el contenedor, configuramos y, luego, iniciamos el servicio Nginx.
- Por último, debemos configurar la URL de la API de REST para que nuestra aplicación cliente pueda enviarle solicitudes. Como solo usamos la URL en un solo archivo del proyecto, codificaremos la URL. Como alternativa, puedes adjuntar la variable de entorno al objeto de ventana y acceder a ella desde allí.
mean-stack-example/client/src/app/employee.service.ts
...
@Injectable({
providedIn: 'root'
})
export class EmployeeService {
// Replace with the URL of your REST API
private url = 'https://node-express-api-vsktparjta-uc.a.run.app';
...
- Todo listo para implementar en Cloud Run. Inicia una nueva implementación con los siguientes parámetros de configuración:
- Service Settings: Create a service - Nombre del servicio: angular-web-app
- Plataforma de implementación: Cloud Run (completamente administrado)
- Autenticación: Permitir invocaciones no autenticadas
- En el entorno de compilación, selecciona Cloud Build.
- Por último, en la sección Configuración de compilación, selecciona lo siguiente:
- Compilador: Docker
- Docker: mean-stack-example/client/Dockerfile
- Vuelve a hacer clic en el botón Implementar y mira los registros mientras se envía tu app a la nube. Cuando se complete la implementación, deberías ver la URL de la app cliente.

- Abre la URL y juega con tu aplicación.

8. Limpia
Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en esta publicación.
Finaliza las instancias de MongoDB
- Ve a los clústeres de instancias de MongoDB.
- Selecciona el clúster y la instancia que creaste.
- Haz clic en los puntos suspensivos junto al nombre del clúster y selecciona Finalizar en la lista.
Borra las implementaciones de Cloud Run
- Ve a la página de Cloud Run en la consola de Google Cloud.
- Selecciona el servicio de Cloud Run que deseas borrar.
- Haz clic en el ícono de borrar en la parte superior de la consola.
9. Felicitaciones
Felicitaciones, creaste correctamente la aplicación web de pila MEAN en Cloud Run.