Puedes orientar un extremo privado para las llamadas HTTP desde la ejecución de tu flujo de trabajo con el registro de servicios del Directorio de servicios con Workflows. Esto te permite proporcionar a tu flujo de trabajo un nombre de servicio del Directorio de servicios. La ejecución del flujo de trabajo usa la información recuperada del registro de servicios para enviar la solicitud HTTP adecuada, sin salir a una red pública.
En este documento, se muestra cómo registrar una máquina virtual (VM) en una red de nube privada virtual (VPC) como un extremo del Directorio de servicios:
Una red de VPC proporciona conectividad para tus instancias de VM y te permite crear extremos privados dentro de tu red de VPC con direcciones IP internas. Las llamadas HTTP a un recurso de red de VPC se envían a través de una red privada mientras se aplican Identity and Access Management (IAM) y los Controles del servicio de VPC.
El Directorio de servicios es un registro de servicios que almacena información sobre los servicios de red registrados, incluidos sus nombres, ubicaciones y atributos. Independientemente de su infraestructura, puedes registrar servicios de forma automática y capturar sus detalles. Esto te permite descubrir, publicar y conectar servicios a gran escala para todos tus extremos de servicio.
En este diagrama, se proporciona una descripción general:
En un nivel alto, debes seguir los siguientes pasos:
- Otorga permisos al agente de servicios de Cloud Workflows para que pueda ver los recursos del Directorio de servicios y acceder a las redes de VPC con el Directorio de servicios.
- Crea una red de VPC para proporcionar funcionalidad de red.
- Crea una regla de firewall de VPC para que puedas permitir o denegar tráfico hacia o desde las instancias de VM en tu red de VPC.
- Crea una instancia de VM en la red de VPC. Una instancia de VM de Compute Engine es una máquina virtual alojada en la infraestructura de Google. Los términos instancia de Compute Engine, instancia de VM y VM son sinónimos y se usan de manera intercambiable.
- Implementa una aplicación en la VM. Puedes ejecutar una app en tu instancia de VM y confirmar que el tráfico se entregue según lo previsto.
Configura el Directorio de servicios para que la ejecución del flujo de trabajo pueda invocar un extremo del Directorio de servicios.
Crea e implementa tu flujo de trabajo. El valor
private_service_namede tu flujo de trabajo especifica el extremo del Directorio de servicios que registraste en el paso anterior.
Otorga permisos al agente de servicio de Cloud Workflows
Algunos Google Cloud servicios tienen agentes de servicio que permiten que los servicios accedan a tus recursos. Si una API requiere un agente de servicio, Google crea el agente de servicio después de que activas y usas la API.
Cuando implementas un flujo de trabajo por primera vez, el agente de servicio de Cloud Workflows se crea automáticamente con el siguiente formato:
service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.comPuedes crear manualmente la cuenta de servicio en un proyecto sin flujos de trabajo con este comando:
gcloud beta services identity create \ --service=workflows.googleapis.com \ --project=PROJECT_ID
Reemplaza
PROJECT_IDpor el ID del Google Cloud proyecto.Para ver los recursos del Directorio de servicios, otorga el rol de visualizador del Directorio de servicios (
servicedirectory.viewer) en el proyecto al agente de servicio de Workflows:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \ --role=roles/servicedirectory.viewer
Reemplaza
PROJECT_NUMBERpor el Google Cloud número del proyecto. Para encontrar el número del proyecto, ve a la página de bienvenida de la Google Cloud consola de Google Cloud o ejecuta el siguiente comando:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
Para acceder a las redes de VPC con el Directorio de servicios, otorga el rol de servicio autorizado de Private Service Connect (
roles/servicedirectory.pscAuthorizedService) en el proyecto al agente de servicio de Workflows:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \ --role=roles/servicedirectory.pscAuthorizedService
Crear red de VPC
Una red de VPC es una versión virtual de una red física que se implementa en la red de producción de Google. Proporciona conectividad para las instancias de VM de Compute Engine.
Puedes crear redes de VPC en modo automático o personalizado. Cada red nueva que crees debe tener un nombre único dentro del mismo proyecto.
Por ejemplo, el siguiente comando crea una red de VPC en modo automático:
gcloud compute networks create NETWORK_NAME \ --subnet-mode=auto
Reemplaza NETWORK_NAME por un nombre para la red de VPC.
Para obtener más información, consulta Crea y administra redes de VPC.
Crear regla de firewall de VPC
Las reglas de firewall de VPC permiten o rechazan el tráfico desde o hacia las instancias de VM en una red de VPC según el número de puerto, la etiqueta o el protocolo.
Las reglas de firewall de VPC se definen a nivel de red y solo se aplican a la red en la que se crean; sin embargo, el nombre que elijas para una regla debe ser exclusivo del proyecto.
Por ejemplo, el siguiente comando crea una regla de firewall para la red de VPC que creaste anteriormente.
gcloud compute firewall-rules create RULE_NAME \ --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \ --direction=INGRESS \ --action=ALLOW \ --source-ranges=IP_ADDRESS_RANGE \ --rules=all
Reemplaza lo siguiente:
RULE_NAME: es un nombre para la regla de firewall.IP_ADDRESS_RANGE: uno o más rangos de direcciones IPv4 o IPv6. Como práctica recomendada, especifica los rangos de direcciones IP específicos que necesitas para permitir el acceso. Ten en cuenta lo siguiente:El acceso de red privada para el Directorio de servicios usa
35.199.192.0/19como un rango solo interno con próximos saltos que se encuentran completamente dentro de la red de Google. Para obtener más información, consulta Rutas de Cloud DNS y el Directorio de servicios.Incluir
35.235.240.0/20en los rangos de origen permite conexiones SSH mediante el reenvío de TCP de Identity-Aware Proxy (IAP) si se cumplen todos los demás requisitos previos. Si deseas obtener más información, consulta Usa IAP para el redireccionamiento de TCP.Si usas la herramienta SSH desde el navegador para conectarte a tu VM de Compute Engine desde la Google Cloud consola de Google Cloud, existen requisitos específicos.
El valor
allde la marca--ruleshace que la regla de firewall sea aplicable a todos los protocolos y puertos de destino. Puedes limitar el alcance si especificas protocolos y puertos.De manera opcional, puedes usar las marcas
--target-tagsy--target-service-accountspara definir destinos; de lo contrario, la regla se aplica a todos los destinos de la red.
Para obtener más información, consulta Reglas de firewall de VPC.
Crea una instancia de VM en la red de VPC
Las instancias de VM incluyen clústeres de Google Kubernetes Engine (GKE), instancias del entorno flexible de App Engine y otros Google Cloud productos decompilados en VMs de Compute Engine. Para admitir el acceso a la red privada, un recurso de red de VPC puede ser una instancia de VM o cualquier otro destino compatible. Para obtener más información, consulta Descripción general del acceso a la red privada.
Las instancias de Compute Engine pueden ejecutar las imágenes públicas de Linux y Windows Server que proporciona Google, así como las imágenes personalizadas privadas que puedes crear o importar desde tus sistemas existentes. También puedes implementar contenedores de Docker.
Si usas un conjunto de tipos predefinidos de máquinas o creas tus propios tipos personalizados de máquinas, puedes elegir las propiedades de máquina de tus instancias, como la cantidad de CPU virtuales y de memoria.
Por ejemplo, el siguiente comando crea una instancia de VM de Linux a partir de una imagen pública con una interfaz de red conectada a la red de VPC que creaste anteriormente.
Crea y después inicia una instancia de VM:
gcloud compute instances create VM_NAME \ --image-family=debian-11 \ --image-project=debian-cloud \ --machine-type=e2-micro \ --network-interface network=projects/PROJECT_ID/global/networks/NETWORK_NAME
Reemplaza
VM_NAMEpor un nombre para la VM.Si se te solicita confirmar la zona de la instancia, escribe
y.Después de crear la instancia de VM, toma nota de la dirección
INTERNAL_IPque se muestra.En la Google Cloud consola de Google Cloud, ve a la página Instancias de VM.
En la columna Nombre, haz clic en el nombre de la instancia de VM adecuada.
Si la VM se está ejecutando, haz clic en Detener para detenerla.
Para editar la VM, haz clic en Editar.
En la sección Redes > Firewalls, para permitir el tráfico HTTP o HTTPS a la VM, elige Permitir tráfico HTTP o Permitir tráfico HTTPS.
Para este ejemplo, selecciona la casilla de verificación Permitir tráfico HTTP.
Compute Engine agrega una etiqueta de red a la VM, que asocia la regla de firewall con la VM. Luego, crea la regla de firewall de entrada correspondiente que permite todo el tráfico entrante en
tcp:80(HTTP) otcp:443(HTTPS).Para guardar los cambios, haz clic en Guardar.
Para reiniciar la VM, haz clic en Iniciar/Reanudar.
Para obtener más información, consulta Crea y, luego, inicia una instancia de VM.
Implementa una aplicación en la VM
Para probar la configuración de red y confirmar que el tráfico se entrega según lo previsto, puedes implementar una app básica en tu VM que detecte un puerto.
Por ejemplo, los siguientes comandos crean un servicio web de Node.js que detecta el puerto 3000.
Establece una conexión SSH con tu instancia de VM.
Actualiza los repositorios de tus paquetes:
sudo apt update
-
Para obtener más información, consulta Configura un entorno de desarrollo de Node.js.
Crea de forma interactiva un archivo
package.json:npm initPor ejemplo:
{ "name": "test", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "hello" }, "author": "", "license": "ISC" }
Instala Express, un framework de aplicaciones web para Node.js:
npm install express
Escribe el código de la app de prueba:
vim app.jsEn el siguiente ejemplo, se crea una app que responde a las solicitudes
GETa la ruta de acceso raíz (/) con el texto "Hello, world!"Toma nota del puerto en el que escucha la app. Se debe usar el mismo número de puerto cuando se configura el extremo para el servicio del Directorio de servicios.
Confirma que la app detecta el puerto 3000:
node app.js
Compute Engine ofrece una variedad de opciones de implementación. Si deseas obtener más información, consulta Elige una estrategia de implementación de Compute Engine para tu carga de trabajo.
Configura el Directorio de servicios
Para admitir la invocación de un extremo privado desde una ejecución de flujo de trabajo, debes configurar un espacio de nombres del Directorio de servicios, registrar un servicio en el espacio de nombres y agregar un extremo al servicio.
Por ejemplo, los siguientes comandos crean un espacio de nombres, un servicio y un extremo que especifica la red de VPC y la dirección IP interna de tu instancia de VM.
Crea un espacio de nombres:
gcloud service-directory namespaces create NAMESPACE \ --location=REGION
Reemplaza lo siguiente:
NAMESPACE: el ID del espacio de nombres o el identificador completamente calificado del espacio de nombres.REGION: la Google Cloud región que contiene el espacio de nombres, por ejemplo,us-central1.
Crea un servicio:
gcloud service-directory services create SERVICE \ --namespace=NAMESPACE \ --location=REGION
Reemplaza
SERVICEpor el nombre del servicio que estás creando.Configura un extremo.
gcloud service-directory endpoints create ENDPOINT \ --namespace=NAMESPACE \ --service=SERVICE \ --network=projects/PROJECT_NUMBER/locations/global/networks/NETWORK_NAME \ --port=PORT_NUMBER \ --address=IP_ADDRESS \ --location=REGION
Reemplaza lo siguiente:
ENDPOINT: el nombre del extremo que estás creando.PORT_NUMBER: el puerto en el que se ejecuta el extremo, por ejemplo,3000.IP_ADDRESS: la dirección IPv6 o IPv4 del extremo; esta es la dirección IP interna que anotaste anteriormente.
Para obtener más información, consulta Configura el Directorio de servicios y Configura el acceso a la red privada.
Crea e implementa tu flujo de trabajo
Llamar o invocar un extremo privado desde Workflows se realiza a través de una solicitud HTTP. Los métodos de solicitud HTTP más comunes tienen un atajo de llamada (como http.get y
http.post), pero puedes realizar cualquier
tipo de solicitud HTTP si configuras el campo call en http.request y
especificas el tipo de solicitud con el campo method. Para obtener más información,
consulta Realiza una solicitud HTTP.
Crea un archivo de código fuente para tu flujo de trabajo:
touch call-private-endpoint.JSON_OR_YAMLReemplaza
JSON_OR_YAMLporyamlojson, según el formato de tu flujo de trabajo.En un editor de texto, copia el siguiente flujo de trabajo (que, en este caso, usa un protocolo HTTP para el valor
url) en tu archivo de código fuente:YAML
main: steps: - checkHttp: call: http.get args: url: http://IP_ADDRESS private_service_name: "projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE" result: res - ret: return: ${res}
JSON
{ "main": { "steps": [ { "checkHttp": { "call": "http.get", "args": { "url": "http://IP_ADDRESS", "private_service_name": "projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE" }, "result": "res" } }, { "ret": { "return": "${res}" } } ] } }
El valor
private_service_namedebe ser una cadena que especifique un nombre de servicio del Directorio de servicios registrado con el siguiente formato:projects/PROJECT_ID/locations/LOCATION/namespaces/NAMESPACE_NAME/services/SERVICE_NAMEImplementa el flujo de trabajo. Para fines de prueba, puedes conectar la cuenta de servicio predeterminada de Compute Engine al flujo de trabajo para representar su identidad:
gcloud workflows deploy call-private-endpoint \ --source=call-private-endpoint.JSON_OR_YAML \ --location=REGION \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
Ejecuta el flujo de trabajo:
gcloud workflows run call-private-endpoint \ --location=REGION
Deberías ver un mensaje similar al siguiente:
argument: 'null' duration: 0.650784403s endTime: '2023-06-09T18:19:52.570690079Z' name: projects/968807934019/locations/us-central1/workflows/call-private-endpoint/executions/4aac88d3-0b54-419b-b364-b6eb973cc932 result: '{"body":"Hello, world!","code":200,"headers":{"Connection":"keep-alive","Content-Length":"21","Content-Type":"text/html; charset=utf-8","Date":"Fri, 09 Jun 2023 18:19:52 GMT","Etag":"W/\"15-NFaeBgdti+9S7zm5kAdSuGJQm6Q\"","Keep-Alive":"timeout=5","X-Powered-By":"Express"}}' startTime: '2023-06-09T18:19:51.919905676Z' state: SUCCEEDED
¿Qué sigue?
- Más información sobre Private Service Connect.
- Configura el Directorio de servicios para GKE.
- Configura un perímetro de servicio con los Controles del servicio de VPC.
- Invoca un extremo protegido por IAP.