Blog

So konfigurieren Sie ein Google Pub/Sub-Push-Abonnement innerhalb eines VPC Service Control Perimeters

Mark van Holsteijn

Mark van Holsteijn

Aktualisiert Oktober 20, 2025
2 Minuten

Wenn Ihr Projekt innerhalb eines VPC Service Control Perimeters läuft, werden Google Cloud Pub/Sub Push-Abonnements nicht unterstützt. In diesem Blog stelle ich Ihnen einen einfachen Egress-Proxy vor, mit dem Sie diese Einschränkung umgehen können.

Laut der Dokumentation der VPC-Dienststeuerung ist Google Pub/Sub ein vollständig unterstütztes Produkt. Mit einer Ausnahme für Push-Abonnements. Push-Abonnements können nur auf Google Cloud Run-Dienste abzielen. Ein bestehendes Push-Abonnement funktioniert weiterhin, aber wenn Sie versuchen, ein neues zu erstellen, erhalten Sie die Fehlermeldung: Request is prohibited by organization's policy.

Um dieses Problem zu umgehen, haben wir einen einfachen https-Proxy in go erstellt. Wenn Sie Ihr Push-Abonnement so ändern, dass es auf diesen Proxy zielt, leitet er die Anfragen an das ursprüngliche Ziel weiter.

den Proxy einsetzen

Um den Proxy einzusetzen, verwenden Sie das folgende Terraform-Snippet:

resource "google_cloud_run_service" "push_subscription_proxy" {
  name     = "push-subscription-proxy"
  location = data.google_client_config.current.region

  template {
    spec {
      service_account_name = google_service_account.push_subscription_proxy.email
      containers {
        image = "gcr.io/binx-io-public/simple-egress-proxy:0.1.0"
        args = [ "--target-url", "https://httpbin.org/anything/event"]
      }
    }
  }
}

Natürlich müssen Sie die URL auf Ihr ursprüngliches Ziel ändern.

das Push-Abonnement ändern

Als nächstes ändern Sie das Push-Abonnement so, dass es auf den Egress-Proxy verweist:

resource "google_pubsub_subscription" "proxied_push_subscription" {
  name  = "proxied-push-subscription"
  topic = google_pubsub_topic.notifications.name

  push_config {
    push_endpoint = google_cloud_run_service.push_subscription_proxy.status[0].url
    oidc_token {
      service_account_email = google_service_account.push_subscription_proxy.email
    }
  }
}

Um sicherzustellen, dass der Dienst nur von diesem Abonnement aufgerufen werden kann, erstellen Sie ein separates Dienstkonto und verwenden Sie die folgende Richtlinie:

resource "google_service_account" "push_subscription_proxy" {
  account_id   = "push-subscription-proxy"
  display_name = "Pub/Sub push subscription proxy"
}

resource "google_cloud_run_service_iam_binding" "push_subscription_proxy_run_invokers" {
  location = google_cloud_run_service.push_subscription_proxy.location
  project  = google_cloud_run_service.push_subscription_proxy.project
  service  = google_cloud_run_service.push_subscription_proxy.name
  role     = "roles/run.invoker"
  members = [
    format("serviceAccount:%s", google_service_account.push_subscription_proxy.email)
  ]
  depends_on = [google_cloud_run_service.push_subscription_proxy]
}

Sehen Sie sich die terraform Demo-Vorlage an, um eine voll funktionsfähige Version zu erhalten.

Fazit

Der einfache Egress-Proxy wurde mit nur wenigen Zeilen Code unter Verwendung der Standard-Golang-Proxy-Bibliothek geschrieben. Er bietet eine schnelle Lösung für die Beschränkung von Google Pub/Sub-Push-Benachrichtigungen innerhalb eines VPC-Dienstkontrollbereichs.

Bild von Екатерина Гусева von Pixabay

Verfasst von

Mark van Holsteijn

Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.

Contact

Let’s discuss how we can support your journey.