Your configuration has several issues that need systematic resolution to achieve proper routing between your shared VPC and service project.
VPC Peering Configuration: The peering command you used is missing the critical flags for custom route exchange. VPC peering only exchanges subnet routes by default. For custom routes to propagate, you must enable bidirectional route exchange:
gcloud compute networks peerings update peer-to-shared \
--network=service-vpc \
--import-custom-routes \
--export-custom-routes
You need to run this for both peering connections (one in each direction). Without these flags, only directly connected subnet routes are visible across the peering.
Custom Route Propagation: After enabling route exchange, verify which routes are actually being shared. Not all custom routes propagate through peering. Routes learned via Cloud Router (BGP) do NOT traverse VPC peering connections. Only static custom routes propagate when exchange is enabled. Check your route tables:
gcloud compute routes list --filter="network:shared-vpc"
gcloud compute routes list --filter="network:service-vpc"
Look for routes with next-hop types that are compatible with peering propagation.
Shared VPC Architecture: This is crucial - if your service project is already attached to the shared VPC as a service project, you shouldn’t be creating a separate VPC in the service project and peering it back to the shared VPC. This creates a routing loop and conflicts. The proper architecture is:
Option A: Service project uses shared VPC subnets directly (no separate VPC needed)
Option B: Service project has its own VPC that peers with a DIFFERENT VPC (not the shared VPC it’s attached to)
If you need isolation while using shared VPC, use firewall rules and separate subnets, not VPC peering. If you genuinely need a separate VPC in the service project that communicates with the shared VPC, the service project should NOT be attached as a shared VPC service project - it should remain standalone and use peering exclusively.
For your use case, I recommend removing the separate VPC from the service project and using the shared VPC with proper firewall segmentation. If you absolutely need the separate VPC, detach the service project from the shared VPC and rely solely on peering with proper route exchange enabled.