Invocar un endpoint privado mediante el registro de servicios de Service Directory

Puedes orientar las llamadas HTTP de la ejecución de tu flujo de trabajo a un endpoint privado usando el registro de servicios de Directorio de servicios con Workflows. De esta forma, puedes proporcionar a tu flujo de trabajo un nombre de servicio de Service Directory. La ejecución del flujo de trabajo usa la información obtenida 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 endpoint de Service Directory:

  • Una red de VPC proporciona conectividad a tus instancias de VM y te permite crear endpoints privados en tu red de VPC mediante direcciones IP internas. Las llamadas HTTP a un recurso de una red de VPC se envían a través de una red privada, al tiempo que se aplican Gestión de Identidades y Accesos (IAM) y Controles de Servicio de VPC.

  • Service Directory es un registro de servicios que almacena información sobre los servicios de red registrados, como sus nombres, ubicaciones y atributos. Independientemente de su infraestructura, puedes registrar servicios automáticamente y obtener sus detalles. Esto te permite descubrir, publicar y conectar servicios a gran escala para todos tus endpoints de servicio.

En este diagrama se ofrece una descripción general:

Enviar una solicitud HTTP a un número de puerto de una instancia de VM mediante información de Service Directory

A grandes rasgos, debes hacer lo siguiente:

  1. Concede permisos al agente de servicio de Cloud Workflows para que pueda ver los recursos de Service Directory y acceder a las redes de VPC mediante Service Directory.
  2. Crea una red de VPC para proporcionar funciones de red.
  3. Crea una regla de cortafuegos de VPC para permitir o denegar el tráfico hacia o desde las instancias de VM de tu red de VPC.
  4. 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 indistintamente.
  5. Despliega una aplicación en la máquina virtual. Puedes ejecutar una aplicación en tu instancia de VM y confirmar que el tráfico se sirve correctamente.
  6. Configura Directorio de servicios para que la ejecución del flujo de trabajo pueda invocar un endpoint de Directorio de servicios.

  7. Crea y despliega tu flujo de trabajo. El valor private_service_name de tu flujo de trabajo especifica el endpoint de Directorio de servicios que has registrado en el paso anterior.

Conceder 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 lo crea después de que actives y uses la API.

  1. La primera vez que despliegues un flujo de trabajo, se creará automáticamente el agente de servicio de Cloud Workflows con el siguiente formato:

    service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com

    Puedes crear manualmente la cuenta de servicio en un proyecto sin ningún flujo de trabajo con este comando:

    gcloud beta services identity create \
        --service=workflows.googleapis.com \
        --project=PROJECT_ID

    Sustituye PROJECT_ID por el ID de tu proyecto. Google Cloud

  2. Para ver los recursos de Directorio de servicios, asigna el rol Lector de Directorio de servicios (servicedirectory.viewer) al agente de servicio de Workflows en el proyecto:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \
        --role=roles/servicedirectory.viewer

    Sustituye PROJECT_NUMBER por el número de tu proyecto. Google Cloud Puedes encontrar el número de tu proyecto en la página Bienvenido de la consola Google Cloud o ejecutando el siguiente comando:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'
  3. Para acceder a redes de VPC mediante Service Directory, otorga el rol 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 una red 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 a las instancias de máquina virtual de Compute Engine.

Puedes crear una red VPC en modo automático o personalizado. Cada red que cree debe tener un nombre único en el mismo proyecto.

Por ejemplo, el siguiente comando crea una red de VPC automática:

gcloud compute networks create NETWORK_NAME \
    --subnet-mode=auto

Sustituye NETWORK_NAME por el nombre de la red VPC.

Para obtener más información, consulta Crear y gestionar redes de VPC.

Crear una regla de cortafuegos de VPC

Las reglas de cortafuegos de VPC te permiten permitir o denegar el tráfico hacia o desde instancias de VM en una red de VPC en función del número de puerto, la etiqueta o el protocolo.

Las reglas de cortafuegos 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 único en el proyecto.

Por ejemplo, el siguiente comando crea una regla de cortafuegos para la red de VPC que has creado 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

Haz los cambios siguientes:

  • RULE_NAME: nombre de la regla de cortafuegos.

  • IP_ADDRESS_RANGE: uno o varios intervalos de direcciones IPv4 o IPv6. Como práctica recomendada, especifica los intervalos de direcciones IP concretos que se necesitan para permitir el acceso. Ten en cuenta lo siguiente:

    • El acceso a redes privadas de Directorio de Servicios usa 35.199.192.0/19 como intervalo solo interno con saltos siguientes que están completamente dentro de la red de Google. Para obtener más información, consulta Rutas de Cloud DNS y Service Directory.

    • Si se incluye 35.235.240.0/20 en los intervalos de origen, se podrán establecer conexiones SSH mediante el reenvío de TCP de Identity-Aware Proxy (IAP) si se cumplen todos los demás requisitos. Para obtener más información, consulta Usar IAP para reenviar TCP.

    • Si utilizas la herramienta SSH en el navegador para conectarte a tu máquina virtual de Compute Engine desde la consola de Google Cloud , hay requisitos específicos.

  • El valor all de la marca --rules hace que la regla de cortafuegos se aplique a todos los protocolos y a todos los puertos de destino. Puede acotar el ámbito especificando protocolos y puertos.

  • También puede usar las marcas --target-tags y --target-service-accounts para definir objetivos. De lo contrario, la regla se aplicará a todos los objetivos de la red.

Para obtener más información, consulta Usar reglas de cortafuegos de VPC.

Crear una instancia de VM en la red 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 creados en VMs de Compute Engine. Para admitir el acceso a redes privadas, un recurso de red de VPC puede ser una instancia de VM, una dirección IP de Cloud Interconnect o un balanceador de carga interno de capa 4.

Las instancias de Compute Engine pueden ejecutar imágenes públicas de Linux y Windows Server que proporciona Google, así como imágenes personalizadas privadas que puedes crear o importar desde tus sistemas. También puedes desplegar contenedores Docker.

Puedes elegir las propiedades de las máquinas de tus instancias, como el número de CPUs virtuales y la cantidad de memoria, mediante un conjunto de tipos de máquinas predefinidas o creando tus propios tipos de máquinas personalizadas.

Por ejemplo, el siguiente comando crea una instancia de VM Linux a partir de una imagen pública con una interfaz de red conectada a la red de VPC que has creado anteriormente.

  1. Crea e 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

    Sustituye VM_NAME por el nombre de la VM.

  2. Si se te pide que confirmes la zona de la instancia, escribe y.

    Después de crear la instancia de VM, anota la dirección INTERNAL_IP que se devuelve.

  3. En la consola de Google Cloud , ve a la página Instancias de VM.

    Ir a instancias de VM

  4. En la columna Nombre, haz clic en el nombre de la instancia de VM correspondiente.

  5. Si la VM está en ejecución, para detenerla, haz clic en Detener.

  6. Para editar la máquina virtual, haz clic en Editar.

  7. En la sección Redes > Cortafuegos, para permitir el tráfico HTTP o HTTPS a la VM, selecciona Permitir el tráfico HTTP o Permitir el tráfico HTTPS.

    En este ejemplo, selecciona la casilla Permitir el tráfico HTTP.

    Compute Engine añade una etiqueta de red a tu VM, lo que asocia la regla de cortafuegos a la VM. A continuación, crea la regla de cortafuegos de entrada correspondiente que permite todo el tráfico entrante en tcp:80 (HTTP) o tcp:443 (HTTPS).

  8. Para guardar los cambios, haz clic en Guardar.

  9. Para reiniciar la VM, haz clic en Iniciar/Reanudar.

Para obtener más información, consulta Crear e iniciar una instancia de VM.

Desplegar una aplicación en la VM

Para probar la configuración de la red y confirmar que el tráfico se sirve como se espera, puedes desplegar una aplicación básica en tu VM que escuche en un puerto.

Por ejemplo, los siguientes comandos crean un servicio web de Node.js que escucha en el puerto 3000.

  1. Establece una conexión SSH con tu instancia de VM.

  2. Actualiza los repositorios de paquetes:

    sudo apt update
  3. Instala NVM, Node.js y npm.

    Para obtener más información, consulta el artículo Configurar un entorno de desarrollo de Node.js.

  4. Crear un archivo package.json de forma interactiva:

    npm init

    Por ejemplo:

    {
    "name": "test",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
    "test": "hello"
    },
    "author": "",
    "license": "ISC"
    }
  5. Instala Express, un framework para aplicaciones web de Node.js:

    npm install express
  6. Escribe el código de la aplicación de prueba:

    vim app.js

    En el siguiente ejemplo se crea una aplicación que responde a las solicitudes GET a la ruta raíz (/) con el texto "Hello, world!".

    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
      res.status(200).send('Hello, world!').end();
    });
    
    app.listen(3000, () => {
      console.log('Sample app listening on port 3000.');
    });

    Anota el puerto en el que está escuchando la aplicación. Se debe usar el mismo número de puerto al configurar el endpoint del servicio Service Directory.

  7. Confirma que la aplicación está escuchando en el puerto 3000:

    node app.js

Compute Engine ofrece varias opciones de implementación. Para obtener más información, consulta Elegir una estrategia de implementación de Compute Engine para tu carga de trabajo.

Configurar Directorio de servicios

Para admitir la invocación de un endpoint privado desde la ejecución de un flujo de trabajo, debes configurar un espacio de nombres de Directory de servicios, registrar un servicio en el espacio de nombres y añadir un endpoint al servicio.

Por ejemplo, los siguientes comandos crean un espacio de nombres, un servicio y un endpoint que especifica la red VPC y la dirección IP interna de tu instancia de VM.

  1. Crea un espacio de nombres:

    gcloud service-directory namespaces create NAMESPACE \
        --location=REGION

    Haz los cambios siguientes:

    • NAMESPACE: el ID del espacio de nombres o el identificador completo del espacio de nombres.
    • REGION: la región Google Cloud que contiene el espacio de nombres; por ejemplo, us-central1.
  2. Crea un servicio:

    gcloud service-directory services create SERVICE \
        --namespace=NAMESPACE \
        --location=REGION

    Sustituye SERVICE por el nombre del servicio que vas a crear.

  3. Configura un endpoint.

    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

    Haz los cambios siguientes:

    • ENDPOINT: el nombre del endpoint que vas a crear.
    • PORT_NUMBER: el puerto en el que se ejecuta el endpoint; por ejemplo, 3000.
    • IP_ADDRESS: la dirección IPv6 o IPv4 del endpoint. Se trata de la dirección IP interna que has anotado anteriormente.

Para obtener más información, consulta los artículos sobre cómo configurar Service Directory y configurar el acceso a redes privadas.

Crear y desplegar un flujo de trabajo

Para llamar o invocar un endpoint privado desde Workflows, se usa una solicitud HTTP. Los métodos de solicitud HTTP más habituales tienen un acceso directo de llamada (como http.get y http.post), pero puedes hacer cualquier tipo de solicitud HTTP si asignas el valor http.request al campo call y especificas el tipo de solicitud mediante el campo method. Para obtener más información, consulta Hacer una solicitud HTTP.

  1. Crea un archivo de código fuente para tu flujo de trabajo:

    touch call-private-endpoint.JSON_OR_YAML

    Sustituye JSON_OR_YAML por yaml o json en función del formato de tu flujo de trabajo.

  2. 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 de private_service_name debe ser una cadena que especifique un nombre de servicio de Service Directory registrado con el siguiente formato:

    projects/PROJECT_ID/locations/LOCATION/namespaces/NAMESPACE_NAME/services/SERVICE_NAME

  3. Despliega el flujo de trabajo. Para hacer pruebas, puedes adjuntar 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
  4. Ejecuta el flujo de trabajo:

    gcloud workflows run call-private-endpoint \
        --location=REGION

    Deberías ver un resultado 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

Siguientes pasos