A Cloud Run service can now be configured so that no unauthenticated request reaches the container, without running a load balancer in front of it.

Google's direct IAP integration for Cloud Run reached general availability on March 13, 2026 [1]. IAP intercepts every inbound HTTPS request, runs the OAuth flow against Google identity, validates the caller against an IAM policy, and only then forwards the request to the container. For personal apps holding real credentials, this moves authentication off application code and out of the load-balancer stack that previously made the pattern impractical.

Until the GA, applying this pattern required provisioning an HTTPS Application Load Balancer, a serverless NEG, a backend service, a static IP, and a managed TLS certificate. The GA reduces that stack to a Cloud Run-native setting plus IAM: enable IAP on the service, require authentication, grant the IAP service agent invoker, and grant authorized users IAP access. IAP itself has no additional charge for Google Cloud-hosted resources, though some advanced capabilities (customization, device attributes, custom access levels, non-Google Cloud resources) are paid features of Chrome Enterprise Premium [2].

Cloud Run IAM enforces authentication at the service invocation level: the caller must hold roles/run.invoker on the service. That works for service-to-service calls but not for human browser sessions, because there is no OAuth flow to obtain user credentials. IAP layers an OAuth 2.0 flow against Google identity in front of that check, redirects unauthenticated browsers to Google Sign-In, and forwards the validated request to the container with signed identity headers. Cloud Run IAM remains the right control for service-to-service traffic; IAP is the right control for human access. This article covers the human-access path.

For a single-user deployment, the IAM policy holds one binding: one Google account email, one role, one service. That is the entire authorization surface at the front door.

Prerequisite: the OAuth consent screen. The first time IAP is enabled in a project, Google prompts to configure an OAuth consent screen. By default, direct IAP on Cloud Run uses a Google-managed OAuth client for in-organization users [3]. For a Workspace-owned project where the only authorized identity is in the same organization (the scope of this post), this is mostly a one-time setup step and otherwise invisible. Outside-org users or projects without an organization may require Console setup or a custom OAuth client.

One structural limit deserves treatment before committing to this pattern: inbound webhooks. Stripe events, Pub/Sub push subscriptions, and most third-party notification services cannot perform browser-based OAuth. Three patterns resolve this, covered in detail below: service account OIDC tokens for GCP-native callers, a separate receptor service for external providers, and load-balancer path routing reserved for edge cases. IAP policies run before Cloud Run IAM, so a Pub/Sub push subscription authenticating against Cloud Run IAM rather than IAP fails at the intercept layer [4].

The March 2026 GA dropped the dollar cost of this pattern to near zero. Operational cost is small but not zero: an OAuth consent screen at first project setup, IAM binding hygiene, optional JWT validation in app code, and webhook exception plumbing for any provider that cannot send OIDC tokens. Three things to manage going forward: the user IAM binding, the IAP service agent binding, and OAuth consent screen state.

This pattern enforces who can reach the service, not fine-grained authorization within it. Per-route authorization, role-based access, and resource-level policy remain the application's responsibility. IAP is the front door; it does not replace internal authorization logic. In practice, the resulting deployment is materially simpler than the load-balancer-plus-IAP setup it replaces: fewer components, fewer surfaces to audit, fewer pieces to wire.

The pattern is GCP-specific. Equivalent setups on AWS use ALB + Cognito or API Gateway authorizers; on Azure, Application Gateway with AAD authentication. The architectural goal (terminate identity at the edge, before application code) carries across platforms; the components do not.

For any personal app holding credentials or personal data, that trade-off is worth making.