1. Introducción
Private Service Connect
Private Service Connect es una función de las redes de Google Cloud que permite a los consumidores acceder a los servicios administrados de forma privada desde su red de VPC. Del mismo modo, permite a los productores de servicios administrados alojar estos servicios en sus propias redes de VPC independientes y ofrecer una conexión privada a sus consumidores.

Control de acceso del productor de Private Service Connect
En lugar de aceptar automáticamente todas las conexiones de cualquier consumidor, los productores solo pueden aceptar solicitudes de conexión entrantes si el consumidor está en la lista de aceptación del consumidor. Puedes especificar consumidores por proyecto, red de VPC o extremo de PSC individual. No puedes incluir diferentes tipos de consumidores en la misma lista de aceptación o rechazo del consumidor.
Para cualquier preferencia de conexión, una política de la organización (compute.restrictPrivateServiceConnectConsumer) que bloquea las conexiones entrantes puede anular y rechazar las conexiones aceptadas.
Ten en cuenta que la política de la organización (compute.restrictPrivateServiceConnectConsumer) se aplica a la organización,la carpeta o el proyecto. Si deseas un control de acceso detallado al extremo de PSC, puedes usar la lista de aceptación del consumidor de extremos de PSC individuales.
Control de acceso basado en extremos
El control de acceso basado en extremos de PSC es la capacidad de un productor para autorizar a los consumidores a través de extremos de PSC individuales en las políticas de adjuntos de servicio.
Este enfoque, que se recomienda para los servicios de múltiples usuarios, proporciona el control más detallado para administrar las conexiones.
Este codelab se centra en aprender a configurar esta función.
Ten en cuenta que este método no se aplica a los backends de Private Service Connect.
2. Qué aprenderás
- Como productor, cómo publicar un servicio con PSC
- Como productor, cómo crear un control de acceso basado en extremos de PSC
- Como consumidor, cómo acceder al servicio de PSC
3. Arquitectura general del lab

4. Pasos de preparación
Roles de IAM necesarios para trabajar en el lab
Comienza por asignar los roles de IAM necesarios a la cuenta de GCP a nivel del proyecto.
- Administrador de redes de Compute (
roles/compute.networkAdmin): Este rol te otorga control total de los recursos de redes de Compute Engine. - Administrador de Logging (
roles/logging.admin): Este rol te otorga acceso a todos los permisos de Logging y a los permisos dependientes. - Administrador de Service Usage (
roles/serviceusage.serviceUsageAdmin): Este rol te permite inspeccionar, habilitar y también inhabilitar estados de servicio, inspeccionar operaciones junto con cuotas de consumo y facturación para un proyecto de consumidor. - Administrador de instancias de Compute (
roles/compute.instanceAdmin.v1): Este rol te otorga control total de instancias, grupos de instancias, discos, instantáneas y, también, imágenes de Compute Engine. Acceso de lectura a todos los recursos de red de Compute Engine. - Administrador de seguridad de Compute (
roles/compute.securityAdmin): Este rol te otorga permisos para crear, modificar y borrar reglas de firewall y certificados SSL, y también para configurar parámetros de configuración de VMs protegidas.
Habilita las APIs
En Cloud Shell, asegúrate de que tu proyecto esté configurado correctamente y establece las variables de entorno.
En Cloud Shell, haz lo siguiente:
gcloud auth login
gcloud config set project <your project id>
export project_id=$(gcloud config get-value project)
export region=us-central1
export zone=$region-a
echo $project_id
echo $region
echo $zone
Habilita todas las APIs de Google necesarias en el proyecto. En Cloud Shell, haz lo siguiente:
gcloud services enable \
compute.googleapis.com
Crea una VPC de productor
En el proyecto, crea una red de VPC con modo de subred personalizado. Realiza lo siguiente en Cloud Shell:
gcloud compute networks create producer-net \
--subnet-mode=custom
Crea subredes en la VPC de productor
Necesitarás tres subredes: producer-subnet para tu servicio, proxy-only-subnet para que el balanceador de cargas publique tu servicio y psc-subnet para que PSC publique el servicio.
En Cloud Shell, haz lo siguiente para crear subredes IPV4:
gcloud compute networks subnets create producer-subnet \
--network=producer-net \
--range=10.10.0.0/24 \
--region=$region
gcloud compute networks subnets create proxy-only-subnet \
--purpose=REGIONAL_MANAGED_PROXY \
--role=ACTIVE \
--region=$region \
--network=producer-net \
--range=10.30.0.0/24
gcloud compute networks subnets create psc-subnet \
--network=producer-net \
--region=$region \
--range=192.168.0.0/16 \
--purpose=PRIVATE_SERVICE_CONNECT
Crea Cloud NAT y Cloud Router para la VPC de productor
Cloud NAT se usa para permitir que la VM descargue e instale aplicaciones.
gcloud compute routers create $region-cr \
--network=producer-net \
--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 VPC de consumidor
En el proyecto, crea una red de VPC con modo de subred personalizado. Realiza lo siguiente en Cloud Shell:
gcloud compute networks create consumer-net \
--subnet-mode=custom
Crea una subred en la VPC de consumidor
En Cloud Shell, haz lo siguiente para crear una subred IPV4:
gcloud compute networks subnets create consumer-subnet \
--network=consumer-net \
--range=10.20.0.0/24 \
--region=$region
Crea una política de firewall global para la VPC de productor y la VPC de consumidor
Crearás una política de firewall de red global y la asociarás a la VPC de productor y a la VPC de consumidor.
gcloud compute network-firewall-policies create global-fw-policy \
--global
gcloud compute network-firewall-policies associations create \
--firewall-policy=global-fw-policy \
--name=producer-fw-policy \
--network=producer-net \
--global-firewall-policy
gcloud compute network-firewall-policies associations create \
--firewall-policy=global-fw-policy \
--name=consumer-fw-policy \
--network=consumer-net \
--global-firewall-policy
Permite SSH
Para permitir que Identity-Aware Proxy (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.
gcloud compute network-firewall-policies rules create 100 \
--action=ALLOW \
--firewall-policy=global-fw-policy \
--description="producer-allow-iap" \
--direction=INGRESS \
--src-ip-ranges=35.235.240.0/20 \
--layer4-configs=tcp:22 \
--global-firewall-policy
Agrega reglas de firewall de entrada a tu servicio
Usarás el balanceador de cargas de aplicaciones interno regional para publicar el servicio.La regla de firewall de entrada debe permitir que la subred de solo proxy acceda al servicio. Para obtener información detallada, consulta este documento.
gcloud compute network-firewall-policies rules create 200 \
--action=ALLOW \
--firewall-policy=global-fw-policy \
--description="producer-allow-access-service" \
--direction=INGRESS \
--src-ip-ranges=10.30.0.0/24 \
--layer4-configs=tcp:80 \
--global-firewall-policy
Permite la verificación de estado del balanceador de cargas a tu servicio
Los sondeos de verificación de estado del balanceador de cargas de aplicaciones interno regional usan los rangos de 35.191.0.0/16 y 130.211.0.0/22. Crearás una regla de firewall de entrada para permitir las verificaciones de estado de los sondeos. Para obtener más detalles, consulta este documento.
gcloud compute network-firewall-policies rules create 300 \
--action=ALLOW \
--firewall-policy=global-fw-policy \
--description="producer-allow-health-check" \
--direction=INGRESS \
--src-ip-ranges=35.191.0.0/16,130.211.0.0/22\
--layer4-configs=tcp:80 \
--global-firewall-policy
Crea una VM como cliente HTTP en la VPC de consumidor
En Cloud Shell, haz lo siguiente para crear una instancia de VM como cliente de prueba:
gcloud compute instances create myclient \
--zone=$zone \
--subnet=consumer-subnet \
--shielded-secure-boot \
--no-address
Crea una VM como servidor HTTP en la VPC de productor
En Cloud Shell, haz lo siguiente para crear una instancia de VM como servidor HTTP:
gcloud compute instances create myserver \
--subnet=producer-subnet \
--zone=$zone \
--no-address \
--shielded-secure-boot \
--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 Http Server." | \
tee /var/www/html/index.html
systemctl restart apache2'
5. El productor publica el servicio de PSC
Crea un balanceador de cargas de aplicaciones interno regional
Crearás un balanceador de cargas de aplicaciones interno regional como el frontend del servicio, y el backend es el grupo de instancias no administrado cuyo extremo es el servidor HTTP que creamos anteriormente.
Reserva la dirección IP del balanceador de cargas
gcloud compute addresses create l7-ilb-ip-address \
--region=$region \
--subnet=producer-subnet
Crea un grupo de instancias
Crearás un grupo de instancias no administrado y agregarás la instancia de VM, myserver, al grupo de instancias.
gcloud compute instance-groups unmanaged create my-service-ig \
--zone=$zone
gcloud compute instance-groups unmanaged add-instances my-service-ig \
--zone=$zone \
--instances=myserver
Crea una verificación de estado HTTP
gcloud compute health-checks create http l7-ilb-basic-check \
--region=$region \
--use-serving-port
Crea el servicio de backend.
gcloud compute backend-services create l7-ilb-backend-service \
--load-balancing-scheme=INTERNAL_MANAGED \
--protocol=HTTP \
--health-checks=l7-ilb-basic-check \
--health-checks-region=$region \
--region=$region
Agrega un backend al servicio de backend
gcloud compute backend-services add-backend l7-ilb-backend-service \
--balancing-mode=UTILIZATION \
--instance-group=my-service-ig \
--instance-group-zone=$zone \
--region=$region
Crea el mapa de URL
gcloud compute url-maps create l7-ilb-map \
--default-service=l7-ilb-backend-service \
--region=$region
Crea el proxy de destino
gcloud compute target-http-proxies create l7-ilb-proxy \
--url-map=l7-ilb-map \
--url-map-region=$region \
--region=$region
Crea la regla de reenvío
gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
--load-balancing-scheme=INTERNAL_MANAGED \
--network=producer-net \
--subnet=producer-subnet \
--address=l7-ilb-ip-address \
--ports=80 \
--region=$region \
--target-http-proxy=l7-ilb-proxy \
--target-http-proxy-region=$region
El productor de PSC publica el servicio
Usarás PSC para publicar el servicio con connection-preference=ACCEPT_MANUAL y listas de consumidores vacías.
gcloud compute service-attachments create my-psc-service \
--region=$region \
--target-service=projects/$project_id/regions/$region/forwardingRules/l7-ilb-forwarding-rule \
--connection-preference=ACCEPT_MANUAL \
--nat-subnets=psc-subnet
export myserver_service_attachment=$(gcloud compute service-attachments describe my-psc-service --region=$region --format="value(selfLink.scope(v1))")
echo $myserver_service_attachment
6. El consumidor crea el extremo de PSC
Reserva una IP para el extremo de PSC
gcloud compute addresses create myserver-psc-endpoint-ip \
--region=$region \
--subnet=consumer-subnet \
--ip-version=IPV4
Crea un extremo de PSC
Crea un extremo de PSC y obtén la IP del extremo de PSC para realizar pruebas en el siguiente paso.
gcloud compute forwarding-rules create myserver-psc-endpoint \
--region=$region \
--network=consumer-net \
--address=myserver-psc-endpoint-ip \
--target-service-attachment=$myserver_service_attachment
psc_endpoint_ip=$(gcloud compute forwarding-rules describe myserver-psc-endpoint \
--region=$region --format="value(IPAddress)")
echo $psc_endpoint_ip
El consumidor verifica el estado del extremo de PSC
Antes de que el productor agregue el extremo de PSC a la lista de consumidores, la conexión es visible en el extremo conectado en el lado del consumidor con el estado Pendiente.
gcloud compute forwarding-rules describe myserver-psc-endpoint \
--region=$region
Verás un resultado similar al siguiente:
IPAddress: 10.20.0.3
allowPscGlobalAccess: false
creationTimestamp: '2026-02-23T16:27:27.920-08:00'
fingerprint: yh_UiYqjHCc=
id: '934193159895862912'
kind: compute#forwardingRule
labelFingerprint: 42WmSpB8rSM=
name: myserver-psc-endpoint
network: https://www.googleapis.com/compute/v1/projects/<project_id>/global/networks/consumer-net
networkTier: PREMIUM
pscConnectionId: '160443618817212419'
pscConnectionStatus: PENDING
region: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1
selfLink: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint
selfLinkWithId: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/forwardingRules/934193159895862912
serviceDirectoryRegistrations:
- namespace: goog-psc-default
target: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/serviceAttachments/my-psc-service
7. Prueba el acceso de la VM de consumidor a la VM de productor
Verifica la IP del extremo de PSC.
echo $psc_endpoint_ip
Establece una conexión SSH con la VM llamada myclient y prueba si puede acceder a myserver en el puerto HTTP 80.
En Cloud Shell, haz lo siguiente:
gcloud compute ssh \
--zone=$zone "myclient" \
--tunnel-through-iap
Usa curl para acceder al extremo de PSC que creaste.
curl -m 10 <psc_endpoint_ip>
Verás que se agotó el tiempo de espera del comando curl. El cliente de prueba de la VPC de consumidor no puede acceder al servidor HTTP en la VPC de productor.
curl: (28) Connection timed out after 10001 milliseconds
Para regresar a Cloud Shell, sal de la sesión de SSH.
exit
8. El productor aprueba el extremo de PSC
El productor verifica el estado del extremo de PSC
Antes de que el productor agregue el extremo de PSC a la lista de consumidores, la conexión es visible en el adjunto de servicio con el estado Pendiente.
gcloud compute service-attachments describe my-psc-service --region=$region
Verás un resultado similar al siguiente:
connectedEndpoints:
- consumerNetwork: https://www.googleapis.com/compute/projects/<project_id>/global/networks/consumer-net
endpoint: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint
endpointWithId: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/934193159895862912
pscConnectionId: '160443618817212419'
status: PENDING
connectionPreference: ACCEPT_MANUAL
creationTimestamp: '2026-02-23T13:27:33.886-08:00'
description: ''
enableProxyProtocol: false
fingerprint: -9EI8FCALrA=
id: '2578692595155826858'
kind: compute#serviceAttachment
name: my-psc-service
natSubnets:
- https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/subnetworks/psc-subnet
pscServiceAttachmentId:
high: '149466704441770984'
low: '2578692595155826858'
reconcileConnections: false
region: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1
selfLink: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/serviceAttachments/my-psc-service
targetService: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/l7-ilb-forwarding-rule
Obtén el URI basado en el ID del extremo de PSC
El URI basado en el ID del extremo de PSC es el ID de la regla de reenvío que acaba de crear el consumidor. En el ejemplo anterior, “endpointWithId” es el URI del extremo de PSC creado por el consumidor. Necesitarás este URI para que el productor cree un control de acceso basado en extremos.
( Ten en cuenta que el ID de conexión de PSC no es el ID que estamos buscando. )
export psc_endpoint_uri=$(gcloud compute service-attachments describe my-psc-service --region=$region --format="value(connectedEndpoints.endpointWithId)")
echo $psc_endpoint_uri
Agrega el URI basado en el ID del extremo de PSC a la lista de aceptación del consumidor
gcloud compute service-attachments update my-psc-service \
--region=$region \
--consumer-accept-list=$psc_endpoint_uri
El productor verifica el estado del extremo de PSC
gcloud compute service-attachments describe my-psc-service --region=$region --format="value(connectedEndpoints)"
Verás un resultado similar al siguiente: El estado cambió a “ACCEPTED”.
{'consumerNetwork': 'https://www.googleapis.com/compute/projects/<project_id>/global/networks/consumer-net', 'endpoint': 'https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint', 'endpointWithId': 'https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/47564871796017232', 'pscConnectionId': '54547416268144643', 'status': 'ACCEPTED'}
9. Prueba el acceso de la VM de consumidor a la VM de productor
Verifica la IP del extremo de PSC.
echo $psc_endpoint_ip
Establece una conexión SSH con la VM llamada myclient y prueba si puede acceder a myserver en el puerto HTTP 80.
En Cloud Shell, haz lo siguiente:
gcloud compute ssh \
--zone=$zone "myclient" \
--tunnel-through-iap
Usa curl para acceder al extremo de PSC que creaste.
curl <psc_endpoint_ip>
Verás que el comando curl muestra correctamente la respuesta de myserver. El cliente de prueba de la VPC de consumidor accedió al servidor HTTP en la VPC de productor.
I am a Http Server.
Para regresar a Cloud Shell, sal de la sesión de SSH.
exit
10. Limpia
Limpia las VMs
En Cloud Shell, haz lo siguiente:
gcloud compute instances delete myserver --zone $zone --quiet
gcloud compute instances delete myclient --zone $zone --quiet
Limpia los componentes de consumidor de PSC
gcloud compute forwarding-rules delete myserver-psc-endpoint \
--region=$region --quiet
gcloud compute addresses delete myserver-psc-endpoint-ip \
--region=$region --quiet
Limpia los componentes de productor de PSC
gcloud compute service-attachments delete my-psc-service \
--region=$region --quiet
gcloud compute forwarding-rules delete l7-ilb-forwarding-rule \
--region=$region --quiet
gcloud compute target-http-proxies delete l7-ilb-proxy \
--region=$region --quiet
gcloud compute url-maps delete l7-ilb-map \
--region=$region --quiet
gcloud compute backend-services remove-backend l7-ilb-backend-service \
--instance-group=my-service-ig \
--instance-group-zone=$zone \
--region=$region --quiet
gcloud compute backend-services delete l7-ilb-backend-service \
--region=$region --quiet
gcloud compute health-checks delete l7-ilb-basic-check \
--region=$region --quiet
gcloud compute instance-groups unmanaged delete my-service-ig \
--zone=$zone --quiet
gcloud compute addresses delete l7-ilb-ip-address \
--region=$region --quiet
Limpia el firewall, Cloud NAT, Cloud Router y las VPCs
gcloud compute network-firewall-policies rules delete 100 \
--firewall-policy=global-fw-policy \
--global-firewall-policy --quiet
gcloud compute network-firewall-policies rules delete 200 \
--firewall-policy=global-fw-policy \
--global-firewall-policy --quiet
gcloud compute network-firewall-policies rules delete 300 \
--firewall-policy=global-fw-policy \
--global-firewall-policy --quiet
gcloud compute network-firewall-policies associations delete \
--firewall-policy=global-fw-policy \
--name=producer-fw-policy \
--global-firewall-policy --quiet
gcloud compute network-firewall-policies associations delete \
--firewall-policy=global-fw-policy \
--name=consumer-fw-policy \
--global-firewall-policy --quiet
gcloud compute network-firewall-policies delete global-fw-policy \
--global --quiet
gcloud compute routers nats delete $region-nat \
--router=$region-cr \
--region=$region --quiet
gcloud compute routers delete $region-cr \
--region=$region --quiet
gcloud compute networks subnets delete producer-subnet \
--region=$region --quiet
gcloud compute networks subnets delete proxy-only-subnet \
--region=$region --quiet
gcloud compute networks subnets delete psc-subnet \
--region=$region --quiet
gcloud compute networks delete producer-net --quiet
gcloud compute networks subnets delete consumer-subnet \
--region=$region --quiet
gcloud compute networks delete consumer-net --quiet
11. Felicitaciones
Probaste correctamente el control de acceso basado en extremos de productor de Private Service Connect.