1. Introducción
Descripción general
Para proteger el tráfico de red de sus servicios y aplicaciones, muchas organizaciones usan una red de nube privada virtual (VPC) en Google Cloud con controles perimetrales para evitar el robo de datos. Una red de VPC es una versión virtual de una red física que se implementa dentro de la red de producción de Google. Una red de VPC proporciona conectividad para tus instancias de máquina virtual (VM) de Compute Engine, ofrece balanceadores de cargas de red de transferencia internos nativos y sistemas proxy para balanceadores de cargas de aplicaciones internos, se conecta a redes locales con túneles de Cloud VPN y adjuntos de VLAN para Cloud Interconnect, y distribuye el tráfico de balanceadores de cargas externos de Google Cloud a backends.
A diferencia de las VMs, los servicios de Cloud Run no están asociados con ninguna red de VPC en particular de forma predeterminada. En este codelab, se muestra cómo cambiar la configuración de entrada (conexiones entrantes) para que solo el tráfico proveniente de una VPC pueda acceder a un servicio de Cloud Run (p.ej., un servicio de backend). Además, en este codelab se muestra cómo hacer que un segundo servicio (p.ej., un servicio de frontend) acceda al servicio de backend de Cloud Run a través de una VPC.
En este ejemplo, el servicio de backend de Cloud Run muestra Hello World. El servicio de frontend de Cloud Run proporciona un campo de entrada en la IU para recopilar una URL. Luego, el servicio de frontend realiza una solicitud GET a esa URL (p.ej., el servicio de backend), por lo que se convierte en una solicitud de servicio a servicio (en lugar de una solicitud de navegador a servicio). Cuando el servicio de frontend llega correctamente al backend, se muestra el mensaje Hello World en el navegador.
Qué aprenderás
- Cómo permitir solo el tráfico de una VPC al servicio de Cloud Run
- Cómo configurar la salida en un servicio de Cloud Run para comunicarse con un servicio de Cloud Run solo de entrada interna
2. Configuración y requisitos
Requisitos previos
- Accediste a la consola de Cloud.
- Ya implementaste un servicio de Cloud Run. Por ejemplo, puedes seguir la guía de inicio rápido para implementar un servicio web desde el código fuente para comenzar.
Activar Cloud Shell
- En la consola de Cloud, haz clic en Activar Cloud Shell
.
Si es la primera vez que inicias Cloud Shell, verás una pantalla intermedia que describe en qué consiste. Si apareció una pantalla intermedia, haz clic en Continuar.
El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos.
Esta máquina virtual está cargada con todas las herramientas de desarrollo necesarias. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que mejora considerablemente el rendimiento de la red y la autenticación. Gran parte de tu trabajo en este codelab, si no todo, se puede hacer con un navegador.
Una vez que te conectes a Cloud Shell, deberías ver que estás autenticado y que el proyecto está configurado con tu ID del proyecto.
- En Cloud Shell, ejecuta el siguiente comando para confirmar que tienes la autenticación:
gcloud auth list
Resultado del comando
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Ejecuta el siguiente comando en Cloud Shell para confirmar que el comando de gcloud conoce tu proyecto:
gcloud config list project
Resultado del comando
[core] project = <PROJECT_ID>
De lo contrario, puedes configurarlo con el siguiente comando:
gcloud config set project <PROJECT_ID>
Resultado del comando
Updated property [core/project].
3. Crea los servicios de Cloud Run
Configura variables de entorno
Puedes establecer variables de entorno que se usarán en este codelab.
REGION=<YOUR_REGION, e.g. us-central1> FRONTEND=frontend BACKEND=backend
Crea el servicio de backend de Cloud Run
Primero, crea un directorio para el código fuente y desplázate a ese directorio con el comando cd.
mkdir -p internal-codelab/frontend internal-codelab/backend && cd internal-codelab/backend
Luego, crea un archivo package.json
con el siguiente contenido:
{ "name": "backend-service", "version": "1.0.0", "description": "", "scripts": { "start": "node index.js" }, "dependencies": { "express": "^4.18.1" } }
A continuación, crea un archivo fuente index.js
con el siguiente contenido. Este archivo contiene el punto de entrada del servicio y la lógica principal de la app.
const express = require('express'); const app = express(); app.use(express.urlencoded({ extended: true })); app.get('/', function (req, res) { res.send("hello world"); }); const port = parseInt(process.env.PORT) || 8080; app.listen(port, () => { console.log(`helloworld: listening on port ${port}`); });
Por último, implementa el servicio de Cloud Run ejecutando el siguiente comando.
gcloud run deploy $BACKEND --source . --allow-unauthenticated --region $REGION
Crea el servicio de Cloud Run de frontend
Navega al directorio de frontend.
cd ../frontend
Luego, crea un archivo package.json
con el siguiente contenido:
{ "name": "frontend", "version": "1.0.0", "description": "", "scripts": { "start": "node index.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "axios": "^1.6.6", "express": "^4.18.2" } }
A continuación, crea un archivo fuente index.js
con el siguiente contenido. Este archivo contiene el punto de entrada del servicio y la lógica principal de la app.
const express = require("express"); const app = express(); const port = 8080; const path = require('path'); const axios = require('axios'); // serve static content (index.html) using // built-in middleware function in Express app.use(express.static('public')); app.use(express.urlencoded({ extended: true })); // this endpoint receives a URL in the post body // and then makes a get request to that URL // results are sent back to the caller app.post('/callService', async (req, res) => { const url = req.body.url; let message = ""; try { console.log("url: ", url); const response = await axios.get(url); message = response.data; } catch (error) { message = error.message; console.error(error.message); } res.send(` ${message} <p> </p> `); }); app.listen(port, () => { console.log(`Example app listening on port ${port}`); });
Crea un directorio público para el archivo index.html
mkdir public touch public/index.html
Por último, actualice index.html para que contenga lo siguiente:
<html> <script src="https://unpkg.com/htmx.org@1.9.10" integrity="sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC" crossorigin="anonymous" ></script> <body> <div style="margin-top: 100px; margin-left: 100px"> <h1>I'm the Frontend service on the Internet</h1> <form hx-trigger="submit" hx-post="/callService" hx-target="#message"> <label for="url"> URL:</label> <input style="width: 308px" type="text" id="url" name="url" placeholder="The backend service URL" required /> <button hx-indicator="#loading" type="submit">Submit</button> <p></p> <span class="htmx-indicator" id="loading"> Loading... </span> <div id="message" style="white-space: pre-wrap"></div> <p></p> </form> </div> </body> </html>
Por último, implementa el servicio de Cloud Run ejecutando el siguiente comando.
gcloud run deploy $FRONTEND --source . --allow-unauthenticated --region $REGION
Llama al servicio de backend
Verifica si implementaste correctamente dos servicios de Cloud Run.
Abre la URL del servicio de frontend en tu navegador web.
En el cuadro de texto, ingresa la URL del servicio de backend. Ten en cuenta que esta solicitud se enruta desde la instancia de frontend de Cloud Run hasta el servicio de backend de Cloud Run, en lugar de enrutarse desde tu navegador.
Verás “Hello World”.
4. Configurar el servicio de backend solo para entrada interna
Ejecuta el siguiente comando de gcloud para permitir que solo el tráfico de tu red de VPC acceda al servicio de backend.
gcloud run services update $BACKEND --ingress internal --region $REGION
Para confirmar que tu servicio de backend solo puede recibir tráfico de tu VPC, intenta llamar a tu servicio de backend desde tu servicio de frontend.
Esta vez, verás el mensaje "Se produjo un error en la solicitud con el código de estado 404".
Recibiste este error porque la solicitud de salida (es decir, la salida) del servicio de frontend de Cloud Run se envía primero a Internet, por lo que Google Cloud no conoce el origen de la solicitud.
En la siguiente sección, configurarás el servicio de frontend para acceder a la VPC, de modo que Google Cloud sepa que la solicitud proviene de la VPC, que se reconoce como una fuente interna.
5. Configurar el servicio de frontend para acceder a la VPC
En esta sección, configurarás tu servicio de frontend de Cloud Run para que se comunique con tu servicio de backend a través de una VPC.
Para ello, deberás agregar una salida de VPC directa a tus instancias de frontend de Cloud Run para darle a tu servicio una IP interna que se pueda usar dentro de la VPC. Luego, configurarás la salida para que todas las conexiones salientes del servicio de frontend vayan a la VPC.
Primero, ejecuta este comando para habilitar la salida de VPC directa:
gcloud beta run services update $FRONTEND \ --network=default \ --subnet=default \ --vpc-egress=all-traffic \ --region=$REGION
Ahora puedes confirmar que tu servicio de frontend tenga acceso a la VPC:
gcloud beta run services describe $FRONTEND \ --region=$REGION
Deberías ver un resultado similar al siguiente
VPC access: Network: default Subnet: default Egress: all-traffic
Ahora intenta llamar nuevamente a tu servicio de backend desde tu servicio de frontend.
Esta vez, verás “Hello World”.
Nota: Tu servicio de frontend no tendrá acceso a Internet, ya que todas las salidas se enrutaron a la VPC. Por ejemplo, tu servicio de frontend agotará el tiempo de espera si intenta acceder a https://curlmyip.org/.
6. ¡Felicitaciones!
¡Felicitaciones por completar el codelab!
Te recomendamos que revises la documentación de Cloud Run y cómo configurar redes privadas para los servicios de Cloud Run.
Temas abordados
- Cómo permitir solo el tráfico de una VPC al servicio de Cloud Run
- Cómo configurar la salida en un servicio de Cloud Run para comunicarse con un servicio de Cloud Run solo de entrada interna
7. Limpia
Para evitar cargos involuntarios (por ejemplo, si los servicios de Cloud Run se invocan de forma involuntaria más veces que tu asignación mensual de invocación de Cloud Run en el nivel gratuito), puedes borrar Cloud Run o el proyecto que creaste en el paso 2.
Para borrar el servicio de Cloud Run, dirígete a la consola de Cloud Run en https://console.cloud.google.com/run y borra los servicios de $FRONTEND y $BACKEND.
Si decides borrar el proyecto completo, puedes ir a https://console.cloud.google.com/cloud-resource-manager, seleccionar el proyecto que creaste en el paso 2 y elegir Borrar. Si borras el proyecto, deberás cambiar los proyectos en tu SDK de Cloud. Para ver la lista de todos los proyectos disponibles, ejecuta gcloud projects list
.