Private Service Connect: Migración de intercambio de tráfico entre VPC a Private Service Connect

1. Introducción

El intercambio de tráfico entre VPC es un método común para que los productores ofrezcan el consumo de servicios a sus usuarios. Sin embargo, el uso del intercambio de tráfico entre VPCs conlleva muchas complejidades de enrutamiento, como el intercambio de tráfico entre VPCs no transitivo, el gran consumo de direcciones IP y la sobreexposición de recursos en una VPC con intercambio de tráfico.

Private Service Connect (PSC) es un método de conectividad que permite a los productores exponer un servicio a través de un solo extremo que un consumidor aprovisiona en una VPC de cargas de trabajo. Esto elimina muchos de los problemas que enfrentan los usuarios con el intercambio de tráfico entre VPCs. Si bien se están creando muchos servicios nuevos con PSC, aún existen muchos servicios que se ofrecen como servicios de intercambio de tráfico entre VPCs.

Google Cloud se complace en presentar una ruta de migración para los servicios que creaste a través del intercambio de tráfico entre VPC para que se trasladen a una arquitectura basada en PSC. Con este método de migración, la dirección IP del servicio del productor que se expone a través del intercambio de tráfico entre VPC se conserva en la arquitectura basada en PSC, por lo que se requieren cambios mínimos para el consumidor. Sigue este codelab para conocer los pasos técnicos necesarios para realizar esta migración.

NOTA: Esta ruta de migración solo es para los servicios en los que el productor y el consumidor existen dentro de la misma organización de Google Cloud. En el caso de los servicios de Google Cloud o de terceros que usen el intercambio de tráfico de VPC, se aprovechará un método de migración similar, pero se personalizará para el servicio en sí. Comunícate con las partes correspondientes para consultar sobre la ruta de migración de estos tipos de servicios.

Qué aprenderás

  • Cómo configurar un servicio basado en el intercambio de tráfico entre VPCs
  • Cómo configurar un servicio basado en PSC
  • Usa la API de Internal-Ranges para realizar la migración de subredes a través del intercambio de tráfico entre VPC y lograr una migración del intercambio de tráfico entre VPC al servicio de PSC.
  • Cuándo debe ocurrir el tiempo de inactividad para la migración del servicio
  • Pasos para limpiar la migración

Requisitos

  • Proyecto de Google Cloud con permisos de propietario

2. Topología del codelab

Para simplificar, este codelab centraliza todos los recursos en un solo proyecto. En el codelab, se indicará qué acciones se deben realizar del lado del productor y qué acciones se deben realizar del lado del consumidor en caso de que los productores y los consumidores estén en proyectos diferentes.

Este codelab tendrá 4 estados.

7dbf27cf215f9703.png

El estado 1 es el estado de intercambio de tráfico entre VPC. Habrá dos VPC, consumer-vpc y producer-vpc, que se intercambiarán tráfico entre sí. Producer-vpc tendrá un servicio de Apache simple expuesto a través de un balanceador de cargas de red de transferencia interno. Consumer-vpc tendrá una sola VM de consumidor para fines de prueba.

7f64427c0e59d417.png

El estado 2 es el estado de la prueba del PSC. Crearemos una nueva regla de reenvío y la usaremos para asociarla con nuestro adjunto de servicio. Luego, crearemos un extremo de PSC de prueba en consumer-vpc para verificar que nuestro servicio de PSC funcione según lo esperado.

98c324c59c1fbf68.png

El estado 3 es el estado de migración. Reservaremos el rango de subred en producer-vpc en el que se implementó el servicio basado en el intercambio de tráfico de VPC para que se use en consumer-vpc. Luego, crearemos un nuevo extremo de PSC con la misma dirección IP que la regla de reenvío preexistente en producer-vpc.

a64ab7b69132c722.png

El estado 4 es el estado final del PSC. Limpiarás el extremo de PSC de prueba y borrarás el intercambio de tráfico de VPC entre consumer-vpc y producer-vpc.

3. Configuración y requisitos

Configuración del entorno de autoaprendizaje

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla cuando quieras.
  • El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. Por lo general, no importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID de tu proyecto (suele identificarse como PROJECT_ID). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se usa el mismo durante todo el proyecto.
  • Recuerda que hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no costará mucho, tal vez nada. Para cerrar recursos y evitar que se generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.

Inicia Cloud Shell

Si bien Google Cloud y Spanner se pueden operar de manera remota desde tu laptop, en este codelab usarás Google Cloud Shell, un entorno de línea de comandos que se ejecuta en la nube.

En Google Cloud Console, haz clic en el ícono de Cloud Shell en la barra de herramientas en la parte superior derecha:

55efc1aaa7a4d3ad.png

El aprovisionamiento y la conexión al entorno deberían tomar solo unos minutos. Cuando termine el proceso, debería ver algo como lo siguiente:

7ffe5cbb04455448.png

Esta máquina virtual está cargada con todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Todo tu trabajo en este codelab se puede hacer en un navegador. No es necesario que instales nada.

4. Antes de comenzar

Habilita las APIs

En Cloud Shell, asegúrate de que tu proyecto esté configurado y configura las variables.

gcloud auth login
gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
export projectid=[YOUR-PROJECT-ID]
export region=us-central1
export zone=$region-a
echo $projectid
echo $region
echo $zone

Habilita todos los servicios necesarios

gcloud services enable compute.googleapis.com
gcloud services enable networkconnectivity.googleapis.com
gcloud services enable dns.googleapis.com

5. Crea la red de VPC del productor (actividad del productor)

Red de VPC

Desde Cloud Shell

gcloud compute networks create producer-vpc \
    --subnet-mode=custom

Crear subredes

Desde Cloud Shell

gcloud compute networks subnets create producer-service-subnet \
    --network=producer-vpc \
    --range=10.0.0.0/28 \
    --region=$region

gcloud compute networks subnets create producer-fr-subnet \
        --network=producer-vpc \
        --range=192.168.0.0/28 \
        --region=$region

Crea un Cloud Router y una puerta de enlace de Cloud NAT del productor

Desde Cloud Shell

gcloud compute routers create $region-cr \
   --network=producer-vpc \
   --region=$region

gcloud compute routers nats create $region-nat \
    --router=$region-cr \
    --region=$region \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips

Crea una política de firewall de red del productor y reglas de firewall

Desde Cloud Shell

gcloud compute network-firewall-policies create producer-vpc-policy --global

gcloud compute network-firewall-policies associations create \
    --firewall-policy producer-vpc-policy \
    --network producer-vpc \
    --name network-producer-vpc \
    --global-firewall-policy

Para permitir que IAP se conecte a tus instancias de VM, crea una regla de firewall que cumpla con lo siguiente:

  • Se aplica a todas las instancias de VM a las que deseas acceder mediante IAP.
  • Permite el tráfico de entrada desde el rango de IP 35.235.240.0/20. Este rango contiene todas las direcciones IP que IAP usa para el reenvío de TCP.

Desde Cloud Shell

gcloud compute network-firewall-policies rules create 1000 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "SSH with IAP" \
    --direction INGRESS \
    --src-ip-ranges 35.235.240.0/20 \
    --layer4-configs tcp:22  \
    --global-firewall-policy

También crearemos dos reglas más que permitan las verificaciones de estado del balanceador de cargas en el servicio, así como el tráfico de red de las VMs que se conectarán desde consumer-vpc.

Desde Cloud Shell

gcloud compute network-firewall-policies rules create 2000 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "LB healthchecks" \
    --direction INGRESS \
    --src-ip-ranges 130.211.0.0/22,35.191.0.0/16 \
    --layer4-configs tcp:80  \
    --global-firewall-policy


gcloud compute network-firewall-policies rules create 3000 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "allow access from consumer-vpc" \
    --direction INGRESS \
    --src-ip-ranges 10.0.1.0/28 \
    --layer4-configs tcp:80  \
    --global-firewall-policy

6. Configuración del servicio de productor (actividad del productor)

Crearemos un servicio de productor con una sola VM que ejecute un servidor web Apache que se agregará a un grupo de instancias no administrado con un balanceador de cargas de red de transferencia interno regional.

Crea la VM y el grupo de instancias no administrado

Desde Cloud Shell

gcloud compute instances create producer-service-vm \
    --network producer-vpc \
    --subnet producer-service-subnet \
    --zone $zone \
    --no-address \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    a2enmod ssl
    sudo a2ensite default-ssl
    echo "I am a Producer Service." | \
    tee /var/www/html/index.html
    systemctl restart apache2'

Desde Cloud Shell

gcloud compute instance-groups unmanaged create prod-uig \
  --zone=$zone

gcloud compute instance-groups unmanaged add-instances prod-uig \
  --zone=$zone \
  --instances=producer-service-vm

Crea el balanceador de cargas de red de transferencia interno regional

Desde Cloud Shell

gcloud compute health-checks create http producer-hc \
        --region=$region

gcloud compute backend-services create producer-bes \
  --load-balancing-scheme=internal \
  --protocol=tcp \
  --region=$region \
  --health-checks=producer-hc \
  --health-checks-region=$region

gcloud compute backend-services add-backend producer-bes \
  --region=$region \
  --instance-group=prod-uig \
  --instance-group-zone=$zone

gcloud compute addresses create producer-fr-ip\
  --region $region \
  --subnet producer-fr-subnet \
  --addresses 192.168.0.2

gcloud compute forwarding-rules create producer-fr \
  --region=$region \
  --load-balancing-scheme=internal \
  --network=producer-vpc \
  --subnet=producer-fr-subnet \
  --address=producer-fr-ip \
  --ip-protocol=TCP \
  --ports=80 \
  --backend-service=producer-bes \
  --backend-service-region=$region

7. Crea la red de VPC del consumidor (actividad del consumidor)

Red de VPC

Desde Cloud Shell

gcloud compute networks create consumer-vpc \
    --subnet-mode=custom

Crear subred

Desde Cloud Shell

gcloud compute networks subnets create consumer-vm-subnet \
    --network=consumer-vpc \
    --range=10.0.1.0/28 \
    --region=$region

Crea una política de firewall de red del consumidor y reglas de firewall

Crearemos otra política de firewall de red para consumer-vpc.

Desde Cloud Shell

gcloud compute network-firewall-policies create consumer-vpc-policy --global

gcloud compute network-firewall-policies associations create \
    --firewall-policy consumer-vpc-policy \
    --network consumer-vpc \
    --name network-consumer-vpc \
    --global-firewall-policy

gcloud compute network-firewall-policies rules create 1000 \
    --action ALLOW \
    --firewall-policy consumer-vpc-policy \
    --description "SSH with IAP" \
    --direction INGRESS \
    --src-ip-ranges 35.235.240.0/20 \
    --layer4-configs tcp:22  \
    --global-firewall-policy

8. Crea un par de VPC

Actividad del productor

Desde Cloud Shell

gcloud compute networks peerings create producer-vpc-peering \
    --network=producer-vpc \
    --peer-project=$projectid \
    --peer-network=consumer-vpc

Actividad del consumidor

Desde Cloud Shell

gcloud compute networks peerings create consumer-vpc-peering \
    --network=consumer-vpc \
    --peer-project=$projectid \
    --peer-network=producer-vpc

Para confirmar que se estableció el intercambio de tráfico, consulta la lista de rutas en consumer-vpc. Deberías ver rutas para consumer-vpc y producer-vpc.

Actividad del consumidor

Desde Cloud Shell

gcloud compute routes list --filter="network=consumer-vpc"

Resultado esperado

NAME: default-route-49dda7094977e231
NETWORK: consumer-vpc
DEST_RANGE: 0.0.0.0/0
NEXT_HOP: default-internet-gateway
PRIORITY: 1000

NAME: default-route-r-10d65e16cc6278b2
NETWORK: consumer-vpc
DEST_RANGE: 10.0.1.0/28
NEXT_HOP: consumer-vpc
PRIORITY: 0

NAME: peering-route-496d0732b4f11cea
NETWORK: consumer-vpc
DEST_RANGE: 192.168.0.0/28
NEXT_HOP: consumer-vpc-peering
PRIORITY: 0

NAME: peering-route-b4f9d3acc4c08d55
NETWORK: consumer-vpc
DEST_RANGE: 10.0.0.0/28
NEXT_HOP: consumer-vpc-peering
PRIORITY: 0

9. Crear zona del DNS (actividad del consumidor)

Crearemos una zona privada de Cloud DNS para llamar al servicio del productor a través del DNS en lugar de una dirección IP privada para mostrar un ejemplo más realista.

Agregaremos un registro A al servicio de ejemplo de dominio.com que apunta a ejemplo.servicio.com a la dirección IP de la regla de reenvío del balanceador de cargas de red de transferencia que creamos anteriormente. La dirección IP de esa regla de reenvío es 192.168.0.2.

Desde Cloud Shell

gcloud dns managed-zones create "producer-service" \
   --dns-name=example.com \
   --description="producer service dns" \
   --visibility=private \
   --networks=consumer-vpc

gcloud dns record-sets transaction start \
   --zone="producer-service"

gcloud dns record-sets transaction add 192.168.0.2 \
   --name=service.example.com \
   --ttl=300 \
   --type=A \
   --zone="producer-service"

gcloud dns record-sets transaction execute \
   --zone="producer-service"

10. Prueba el servicio del productor a través del intercambio de tráfico entre VPC (actividad del consumidor)

En este punto, se creó la arquitectura del estado 1.

Crea una VM de cliente de consumidor

Desde Cloud Shell

gcloud compute instances create consumer-client \
   --zone=$zone \
   --subnet=consumer-vm-subnet \
   --no-address

Probar la conectividad

Desde Cloud Shell

gcloud compute ssh \
    --zone "$zone" "consumer-client" \
    --tunnel-through-iap \
    --project $projectid

Desde la VM del cliente de consumidor

curl service.example.com

Resultado esperado

I am a Producer Service. 

Desde la VM del cliente de consumidor

exit

11. Prepara el servicio para Private Service Connect (actividad del productor)

Ahora que terminamos todos los pasos de configuración inicial, comenzaremos a preparar el servicio con VPC interconectada para la migración a Private Service Connect. En esta sección, realizaremos cambios en producer-vpc configurando el servicio para que se exponga a través de un adjunto de servicio. Deberemos crear una subred nueva y una regla de reenvío nueva dentro de esa subred para poder migrar la subred existente a la VPC del consumidor y mantener intacta la dirección IP existente del servicio.

Crea la subred en la que se alojará la nueva IP de la regla de reenvío del balanceador de cargas.

Desde Cloud Shell

gcloud compute networks subnets create producer-psc-fr-subnet \
    --network=producer-vpc \
    --range=10.0.2.64/28 \
    --region=$region

Crea la dirección IP interna de la regla de reenvío del balanceador de cargas.

Desde Cloud Shell

gcloud compute addresses create producer-psc-ip \
  --region $region \
  --subnet producer-psc-fr-subnet \
  --addresses 10.0.2.66

Crea la nueva regla de reenvío del balanceador de cargas. Esta regla está configurada para usar el mismo servicio de backend y las mismas verificaciones de estado que configuramos anteriormente.

Desde Cloud Shell

gcloud compute forwarding-rules create psc-service-fr \
  --region=$region \
  --load-balancing-scheme=internal \
  --network=producer-vpc \
  --subnet=producer-psc-fr-subnet \
  --address=producer-psc-ip \
  --ip-protocol=TCP \
  --ports=80 \
  --backend-service=producer-bes \
  --backend-service-region=$region

La subred psc-nat-subnet se asociará con el adjunto de servicio de PSC para la traducción de direcciones de red. Para los casos de uso de producción, esta subred debe tener el tamaño adecuado para admitir la cantidad de extremos adjuntos. Consulta la documentación sobre el tamaño de la subred de NAT de PSC para obtener más información.

Desde Cloud Shell

gcloud compute networks subnets create psc-nat-subnet \
    --network=producer-vpc \
    --range=10.100.100.0/28 \
    --region=$region \
    --purpose=PRIVATE_SERVICE_CONNECT

Debemos agregar una regla de firewall adicional a la política de firewall de red para permitir el tráfico de psc-nat-subnet. Cuando se accede al servicio a través de PSC, la subred psc-nat-subnet es donde se originará el tráfico.

Desde Cloud Shell

gcloud compute network-firewall-policies rules create 2001 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "allow PSC NAT subnet" \
    --direction INGRESS \
    --src-ip-ranges 10.100.100.0/28 \
    --layer4-configs tcp:80  \
    --global-firewall-policy

Crea el adjunto de servicio y anota su URI para configurar el extremo de PSC en la siguiente sección.

Desde Cloud Shell

gcloud compute service-attachments create producer-sa \
    --region=$region \
    --producer-forwarding-rule=psc-service-fr  \
    --connection-preference=ACCEPT_MANUAL \
    --consumer-accept-list=$projectid=5 \
    --nat-subnets=psc-nat-subnet

Desde Cloud Shell

gcloud compute service-attachments describe producer-sa --region=$region

Resultado de muestra

connectionPreference: ACCEPT_MANUAL
consumerAcceptLists:
- connectionLimit: 5
  projectIdOrNum: $projectid
creationTimestamp: '2025-04-24T11:23:09.886-07:00'
description: ''
enableProxyProtocol: false
fingerprint: xxx
id: 'xxx'
kind: compute#serviceAttachment
name: producer-sa
natSubnets:
- https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/subnetworks/psc-nat-subnet
pscServiceAttachmentId:
  high: 'xxx'
  low: 'xxx'
reconcileConnections: false
region: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region
selfLink: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/serviceAttachments/producer-sa
targetService: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/forwardingRules/psc-service-fr

12. Conecta el extremo de PSC del consumidor "test" al servicio del productor y realiza pruebas (actividad del consumidor)

La arquitectura ahora está en el estado 2.

En este punto, el servicio del productor existente expuesto a través del intercambio de tráfico entre VPC sigue activo y funciona correctamente en una situación de producción. Crearemos un extremo de PSC de "prueba" para asegurarnos de que el adjunto de servicio expuesto funcione correctamente antes de iniciar un período de interrupción para migrar la subred actual de VPC Peering a la VPC del consumidor. Nuestra conectividad de estado final será un extremo de PSC con la misma dirección IP que la regla de reenvío actual para el servicio basado en el intercambio de tráfico entre VPC.

Crear extremo de PSC

Desde Cloud Shell

gcloud compute addresses create test-psc-endpoint-ip \
    --region=$region \
    --subnet=consumer-vm-subnet \
    --addresses 10.0.1.3

El servicio de destino que se muestra a continuación será el URI del adjunto de servicio que anotaste en el último paso.

Desde Cloud Shell

gcloud compute forwarding-rules create test-psc-endpoint \
  --region=$region \
  --network=consumer-vpc \
  --address=test-psc-endpoint-ip \
  --target-service-attachment=projects/$projectid/regions/$region/serviceAttachments/producer-sa

Prueba el extremo de PSC "test"

Desde Cloud Shell

gcloud compute ssh \
    --zone "$zone" "consumer-client" \
    --tunnel-through-iap \
    --project $projectid

Del cliente consumidor

curl 10.0.1.3

Resultado esperado

I am a Producer Service. 

Del cliente consumidor

exit

13. Migra la subred de la regla de reenvío del productor existente

Si realizas estos pasos, se iniciará una interrupción del servicio de productor basado en el intercambio de tráfico de VPC en vivo. Ahora migraremos la subred de la regla de reenvío de producer-vpc a consumer-vpc con la API de rangos internos. Esto bloqueará la subred para que no se use durante el período intermedio en el que borramos la subred en la VPC del productor y la designamos solo para fines de migración para su creación en la VPC del consumidor.

La API de rangos internos requiere que reserves la subred de la regla de reenvío de intercambio de tráfico entre VPCs existente (producer-fr-subnet, 192.168.0.0/28) y designes un nombre de subred de destino en la VPC del consumidor (consumer-psc-subnet). En unos pasos, crearemos una subred nueva en consumer-vpc con este nombre.

Reserva la subred producer-fr-subnet para la migración

Actividad del productor

Desde Cloud Shell

gcloud network-connectivity internal-ranges create producer-peering-internal-range \
    --ip-cidr-range=192.168.0.0/28 \
    --network=producer-vpc \
    --usage=FOR_MIGRATION \
    --migration-source=projects/$projectid/regions/$region/subnetworks/producer-fr-subnet \
    --migration-target=projects/$projectid/regions/$region/subnetworks/consumer-psc-subnet

Ejecuta una descripción en el rango interno que creamos para ver el estado de la subred.

Actividad del productor

Desde Cloud Shell

gcloud network-connectivity internal-ranges describe producer-peering-internal-range

Resultado de muestra

createTime: '2025-04-24T19:26:10.589343291Z'
ipCidrRange: 192.168.0.0/28
migration:
  source: projects/$projectid/regions/$region/subnetworks/producer-fr-subnet
  target: projects/$projectid/regions/$region/subnetworks/consumer-psc-subnet
name: projects/$projectid/locations/global/internalRanges/producer-peering-internal-range
network: https://www.googleapis.com/compute/v1/projects/$project/global/networks/producer-vpc
peering: FOR_SELF
updateTime: '2025-04-24T19:26:11.521960016Z'
usage: FOR_MIGRATION

Borra la regla de reenvío y la subred basadas en el intercambio de tráfico entre VPC

Actividad del productor

Desde Cloud Shell

gcloud compute forwarding-rules delete producer-fr --region=$region

gcloud compute addresses delete producer-fr-ip --region=$region

gcloud compute networks subnets delete producer-fr-subnet --region=$region

Migra la subred

Migra la subred a la VPC del consumidor creando una subred nueva con el rango interno que creamos antes. El nombre de esta subred debe ser el mismo que usamos anteriormente (consumer-psc-subnet). El propósito específico de PEER_MIGRATION indica que la subred está reservada para la migración de subredes entre VPCs con intercambio de tráfico. Con esta marca de propósito, la subred solo puede contener direcciones IP estáticas reservadas y extremos de PSC.

Actividad del consumidor

Desde Cloud Shell

gcloud compute networks subnets create consumer-psc-subnet \
  --purpose=PEER_MIGRATION \
  --network=consumer-vpc \
  --range=192.168.0.0/28 \
  --region=$region

14. Crea el extremo de PSC de estado final (actividad del consumidor)

En este punto, el servicio de Producer sigue inactivo. La subred que acabamos de crear sigue bloqueada y solo se puede usar para el propósito específico de la migración. Para probar esto, intenta crear una VM en esta subred. La creación de la VM fallará.

Desde Cloud Shell

gcloud compute instances create test-consumer-vm \
    --zone=$zone \
    --subnet=consumer-psc-subnet \
    --no-address

Resultado esperado

ERROR: (gcloud.compute.instances.create) Could not fetch resource:
 - Subnetwork must have purpose=PRIVATE.

Solo podemos usar esta subred para crear un extremo de PSC. Ten en cuenta que la dirección IP que creamos usa la misma IP que la regla de reenvío que usó nuestro servicio de productor a través de la interconexión de VPC.

Desde Cloud Shell

gcloud compute addresses create psc-endpoint-ip \
    --region=$region \
    --subnet=consumer-psc-subnet \
    --addresses 192.168.0.2

Una vez más, debes usar el mismo URI de vinculación de servicio que anotaste antes y que también se usó para crear el extremo de PSC "test".

Desde Cloud Shell

gcloud compute forwarding-rules create psc-endpoint \
    --region=$region \
    --network=consumer-vpc \
    --address=psc-endpoint-ip \
    --target-service-attachment=projects/$projectid/regions/$region/serviceAttachments/producer-sa

15. Prueba el extremo de PSC de estado final (actividad del consumidor)

En este punto, te encuentras en la arquitectura del Estado 3.

Desde Cloud Shell

gcloud compute ssh \
    --zone "$zone" "consumer-client" \
    --tunnel-through-iap \
    --project $projectid

Desde la VM del cliente de consumidor

curl service.example.com

Resultado esperado

I am a Producer Service. 

Desde la VM del cliente de consumidor

exit

En este punto, la interrupción finalizó y el servicio volvió a estar disponible. Ten en cuenta que no tuvimos que realizar ningún cambio en el DNS existente. No es necesario realizar cambios en el cliente del lado del consumidor. Las aplicaciones pueden reanudar las operaciones en el servicio migrado.

16. Limpieza de la migración

Para finalizar la migración, debemos realizar algunos pasos de limpieza. Debemos borrar y desbloquear recursos.

Desbloquea la subred del rango interno

Esto desbloqueará la subred migrada para que su propósito se pueda cambiar de "PEER_MIGRATION" a "PRIVATE".

Actividad del productor

Desde Cloud Shell

gcloud network-connectivity internal-ranges delete producer-peering-internal-range

Actividad del consumidor

Desde Cloud Shell

gcloud compute networks subnets update consumer-psc-subnet \
    --region=$region \
    --purpose=PRIVATE

gcloud compute networks subnets describe consumer-psc-subnet --region=$region

Resultado de muestra

creationTimestamp: '2025-04-24T12:29:33.883-07:00'
fingerprint: xxx
gatewayAddress: 192.168.0.1
id: 'xxx'
ipCidrRange: 192.168.0.0/28
kind: compute#subnetwork
name: consumer-psc-subnet
network: https://www.googleapis.com/compute/v1/projects/$projectid/global/networks/consumer-vpc
privateIpGoogleAccess: false
privateIpv6GoogleAccess: DISABLE_GOOGLE_ACCESS
purpose: PRIVATE
region: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region
selfLink: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/subnetworks/consumer-psc-subnet

Borra los pares de VPC

Actividad del productor

Desde Cloud Shell

gcloud compute networks peerings delete producer-vpc-peering \
    --network=producer-vpc

Actividad del consumidor

Desde Cloud Shell

gcloud compute networks peerings delete consumer-vpc-peering \
        --network=consumer-vpc

Borra el extremo de PSC "test"

Consumer-Activity

Desde Cloud Shell

gcloud compute forwarding-rules delete test-psc-endpoint --region=$region
gcloud compute addresses delete test-psc-endpoint-ip --region=$region

17. Prueba final después de la limpieza de la migración (actividad del consumidor)

En este punto, se logró la arquitectura del Estado 4 (el estado final).

Vuelve a probar la conectividad del extremo de PSC para asegurarte de que no se observen efectos adversos por la limpieza de la migración.

Desde Cloud Shell

gcloud compute ssh \
    --zone "$zone" "consumer-client" \
    --tunnel-through-iap \
    --project $projectid

Desde la VM del cliente de consumidor

curl service.example.com

Resultado esperado

I am a Producer Service. 

Desde la VM del cliente de consumidor

exit

Operación exitosa

18. Pasos para la limpieza

Desde Cloud Shell

gcloud compute forwarding-rules delete psc-endpoint --region=$region -q

gcloud compute addresses delete psc-endpoint-ip --region=$region -q

gcloud compute instances delete consumer-client --zone=$zone --project=$projectid -q

gcloud dns record-sets delete service.example.com --zone="producer-service" --type=A -q

gcloud dns managed-zones delete "producer-service" -q

gcloud compute network-firewall-policies rules delete 1000 --firewall-policy consumer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies associations delete --firewall-policy=consumer-vpc-policy  --name=network-consumer-vpc --global-firewall-policy -q

gcloud compute network-firewall-policies delete consumer-vpc-policy --global -q

gcloud compute networks subnets delete consumer-psc-subnet --region=$region -q

gcloud compute networks subnets delete consumer-vm-subnet --region=$region -q

gcloud compute networks delete consumer-vpc -q

gcloud compute service-attachments delete producer-sa --region=$region -q

gcloud compute forwarding-rules delete psc-service-fr --region=$region -q

gcloud compute addresses delete producer-psc-ip --region=$region -q

gcloud compute backend-services delete producer-bes --region=$region -q

gcloud compute health-checks delete producer-hc --region=$region -q

gcloud compute instance-groups unmanaged delete prod-uig --zone=$zone -q

gcloud compute instances delete producer-service-vm --zone=$zone --project=$projectid -q

gcloud compute network-firewall-policies rules delete 3000 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies rules delete 2001 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies rules delete 2000 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies rules delete 1000 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies associations delete --firewall-policy=producer-vpc-policy  --name=network-producer-vpc --global-firewall-policy -q

gcloud compute network-firewall-policies delete producer-vpc-policy --global -q

gcloud compute routers nats delete $region-nat --router=$region-cr --region=$region -q

gcloud compute routers delete $region-cr --region=$region -q

gcloud compute networks subnets delete psc-nat-subnet --region=$region -q

gcloud compute networks subnets delete producer-psc-fr-subnet --region=$region -q

gcloud compute networks subnets delete producer-service-subnet --region=$region -q

gcloud compute networks delete producer-vpc -q

19. ¡Felicitaciones!

Felicitaciones por completar el codelab.

Temas abordados

  • Cómo configurar un servicio basado en el intercambio de tráfico entre VPCs
  • Cómo configurar un servicio basado en PSC
  • Usa la API de Internal-Ranges para realizar la migración de subredes a través del intercambio de tráfico entre VPC y lograr una migración del intercambio de tráfico entre VPC al servicio de PSC.
  • Cuándo debe ocurrir el tiempo de inactividad para la migración del servicio
  • Pasos para limpiar la migración