The gcp:compute/regionUrlMap:RegionUrlMap resource, part of the Pulumi GCP provider, defines routing rules that direct HTTP(S) requests to backend services based on hostname, path, headers, and other request attributes. This guide focuses on four capabilities: host and path-based routing, traffic management policies, advanced request matching and URL rewriting, and traffic mirroring.
URL maps reference RegionBackendService resources that must exist with configured health checks. The examples are intentionally small. Combine them with your own backend services, health checks, and load balancer infrastructure.
Route requests by host and path to backend services
Most load balancer deployments route incoming requests to different backend services based on the requested hostname and URL path.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const _default = new gcp.compute.RegionHealthCheck("default", {
region: "us-central1",
name: "health-check",
checkIntervalSec: 1,
timeoutSec: 1,
httpHealthCheck: {
port: 80,
requestPath: "/",
},
});
const login = new gcp.compute.RegionBackendService("login", {
region: "us-central1",
name: "login",
protocol: "HTTP",
loadBalancingScheme: "INTERNAL_MANAGED",
timeoutSec: 10,
healthChecks: _default.id,
});
const home = new gcp.compute.RegionBackendService("home", {
region: "us-central1",
name: "home",
protocol: "HTTP",
loadBalancingScheme: "INTERNAL_MANAGED",
timeoutSec: 10,
healthChecks: _default.id,
});
const regionurlmap = new gcp.compute.RegionUrlMap("regionurlmap", {
region: "us-central1",
name: "regionurlmap",
description: "a description",
defaultService: home.id,
hostRules: [{
hosts: ["mysite.com"],
pathMatcher: "allpaths",
}],
pathMatchers: [{
name: "allpaths",
defaultService: home.id,
pathRules: [
{
paths: ["/home"],
service: home.id,
},
{
paths: ["/login"],
service: login.id,
},
],
}],
tests: [{
service: home.id,
host: "hi.com",
path: "/home",
}],
});
import pulumi
import pulumi_gcp as gcp
default = gcp.compute.RegionHealthCheck("default",
region="us-central1",
name="health-check",
check_interval_sec=1,
timeout_sec=1,
http_health_check={
"port": 80,
"request_path": "/",
})
login = gcp.compute.RegionBackendService("login",
region="us-central1",
name="login",
protocol="HTTP",
load_balancing_scheme="INTERNAL_MANAGED",
timeout_sec=10,
health_checks=default.id)
home = gcp.compute.RegionBackendService("home",
region="us-central1",
name="home",
protocol="HTTP",
load_balancing_scheme="INTERNAL_MANAGED",
timeout_sec=10,
health_checks=default.id)
regionurlmap = gcp.compute.RegionUrlMap("regionurlmap",
region="us-central1",
name="regionurlmap",
description="a description",
default_service=home.id,
host_rules=[{
"hosts": ["mysite.com"],
"path_matcher": "allpaths",
}],
path_matchers=[{
"name": "allpaths",
"default_service": home.id,
"path_rules": [
{
"paths": ["/home"],
"service": home.id,
},
{
"paths": ["/login"],
"service": login.id,
},
],
}],
tests=[{
"service": home.id,
"host": "hi.com",
"path": "/home",
}])
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_default, err := compute.NewRegionHealthCheck(ctx, "default", &compute.RegionHealthCheckArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("health-check"),
CheckIntervalSec: pulumi.Int(1),
TimeoutSec: pulumi.Int(1),
HttpHealthCheck: &compute.RegionHealthCheckHttpHealthCheckArgs{
Port: pulumi.Int(80),
RequestPath: pulumi.String("/"),
},
})
if err != nil {
return err
}
login, err := compute.NewRegionBackendService(ctx, "login", &compute.RegionBackendServiceArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("login"),
Protocol: pulumi.String("HTTP"),
LoadBalancingScheme: pulumi.String("INTERNAL_MANAGED"),
TimeoutSec: pulumi.Int(10),
HealthChecks: _default.ID(),
})
if err != nil {
return err
}
home, err := compute.NewRegionBackendService(ctx, "home", &compute.RegionBackendServiceArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("home"),
Protocol: pulumi.String("HTTP"),
LoadBalancingScheme: pulumi.String("INTERNAL_MANAGED"),
TimeoutSec: pulumi.Int(10),
HealthChecks: _default.ID(),
})
if err != nil {
return err
}
_, err = compute.NewRegionUrlMap(ctx, "regionurlmap", &compute.RegionUrlMapArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("regionurlmap"),
Description: pulumi.String("a description"),
DefaultService: home.ID(),
HostRules: compute.RegionUrlMapHostRuleArray{
&compute.RegionUrlMapHostRuleArgs{
Hosts: pulumi.StringArray{
pulumi.String("mysite.com"),
},
PathMatcher: pulumi.String("allpaths"),
},
},
PathMatchers: compute.RegionUrlMapPathMatcherArray{
&compute.RegionUrlMapPathMatcherArgs{
Name: pulumi.String("allpaths"),
DefaultService: home.ID(),
PathRules: compute.RegionUrlMapPathMatcherPathRuleArray{
&compute.RegionUrlMapPathMatcherPathRuleArgs{
Paths: pulumi.StringArray{
pulumi.String("/home"),
},
Service: home.ID(),
},
&compute.RegionUrlMapPathMatcherPathRuleArgs{
Paths: pulumi.StringArray{
pulumi.String("/login"),
},
Service: login.ID(),
},
},
},
},
Tests: compute.RegionUrlMapTestArray{
&compute.RegionUrlMapTestArgs{
Service: home.ID(),
Host: pulumi.String("hi.com"),
Path: pulumi.String("/home"),
},
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var @default = new Gcp.Compute.RegionHealthCheck("default", new()
{
Region = "us-central1",
Name = "health-check",
CheckIntervalSec = 1,
TimeoutSec = 1,
HttpHealthCheck = new Gcp.Compute.Inputs.RegionHealthCheckHttpHealthCheckArgs
{
Port = 80,
RequestPath = "/",
},
});
var login = new Gcp.Compute.RegionBackendService("login", new()
{
Region = "us-central1",
Name = "login",
Protocol = "HTTP",
LoadBalancingScheme = "INTERNAL_MANAGED",
TimeoutSec = 10,
HealthChecks = @default.Id,
});
var home = new Gcp.Compute.RegionBackendService("home", new()
{
Region = "us-central1",
Name = "home",
Protocol = "HTTP",
LoadBalancingScheme = "INTERNAL_MANAGED",
TimeoutSec = 10,
HealthChecks = @default.Id,
});
var regionurlmap = new Gcp.Compute.RegionUrlMap("regionurlmap", new()
{
Region = "us-central1",
Name = "regionurlmap",
Description = "a description",
DefaultService = home.Id,
HostRules = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapHostRuleArgs
{
Hosts = new[]
{
"mysite.com",
},
PathMatcher = "allpaths",
},
},
PathMatchers = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherArgs
{
Name = "allpaths",
DefaultService = home.Id,
PathRules = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleArgs
{
Paths = new[]
{
"/home",
},
Service = home.Id,
},
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleArgs
{
Paths = new[]
{
"/login",
},
Service = login.Id,
},
},
},
},
Tests = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapTestArgs
{
Service = home.Id,
Host = "hi.com",
Path = "/home",
},
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.compute.RegionHealthCheck;
import com.pulumi.gcp.compute.RegionHealthCheckArgs;
import com.pulumi.gcp.compute.inputs.RegionHealthCheckHttpHealthCheckArgs;
import com.pulumi.gcp.compute.RegionBackendService;
import com.pulumi.gcp.compute.RegionBackendServiceArgs;
import com.pulumi.gcp.compute.RegionUrlMap;
import com.pulumi.gcp.compute.RegionUrlMapArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapHostRuleArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapPathMatcherArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapTestArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var default_ = new RegionHealthCheck("default", RegionHealthCheckArgs.builder()
.region("us-central1")
.name("health-check")
.checkIntervalSec(1)
.timeoutSec(1)
.httpHealthCheck(RegionHealthCheckHttpHealthCheckArgs.builder()
.port(80)
.requestPath("/")
.build())
.build());
var login = new RegionBackendService("login", RegionBackendServiceArgs.builder()
.region("us-central1")
.name("login")
.protocol("HTTP")
.loadBalancingScheme("INTERNAL_MANAGED")
.timeoutSec(10)
.healthChecks(default_.id())
.build());
var home = new RegionBackendService("home", RegionBackendServiceArgs.builder()
.region("us-central1")
.name("home")
.protocol("HTTP")
.loadBalancingScheme("INTERNAL_MANAGED")
.timeoutSec(10)
.healthChecks(default_.id())
.build());
var regionurlmap = new RegionUrlMap("regionurlmap", RegionUrlMapArgs.builder()
.region("us-central1")
.name("regionurlmap")
.description("a description")
.defaultService(home.id())
.hostRules(RegionUrlMapHostRuleArgs.builder()
.hosts("mysite.com")
.pathMatcher("allpaths")
.build())
.pathMatchers(RegionUrlMapPathMatcherArgs.builder()
.name("allpaths")
.defaultService(home.id())
.pathRules(
RegionUrlMapPathMatcherPathRuleArgs.builder()
.paths("/home")
.service(home.id())
.build(),
RegionUrlMapPathMatcherPathRuleArgs.builder()
.paths("/login")
.service(login.id())
.build())
.build())
.tests(RegionUrlMapTestArgs.builder()
.service(home.id())
.host("hi.com")
.path("/home")
.build())
.build());
}
}
resources:
regionurlmap:
type: gcp:compute:RegionUrlMap
properties:
region: us-central1
name: regionurlmap
description: a description
defaultService: ${home.id}
hostRules:
- hosts:
- mysite.com
pathMatcher: allpaths
pathMatchers:
- name: allpaths
defaultService: ${home.id}
pathRules:
- paths:
- /home
service: ${home.id}
- paths:
- /login
service: ${login.id}
tests:
- service: ${home.id}
host: hi.com
path: /home
login:
type: gcp:compute:RegionBackendService
properties:
region: us-central1
name: login
protocol: HTTP
loadBalancingScheme: INTERNAL_MANAGED
timeoutSec: 10
healthChecks: ${default.id}
home:
type: gcp:compute:RegionBackendService
properties:
region: us-central1
name: home
protocol: HTTP
loadBalancingScheme: INTERNAL_MANAGED
timeoutSec: 10
healthChecks: ${default.id}
default:
type: gcp:compute:RegionHealthCheck
properties:
region: us-central1
name: health-check
checkIntervalSec: 1
timeoutSec: 1
httpHealthCheck:
port: 80
requestPath: /
When a request arrives, the URL map evaluates hostRules to find a matching hostname, then uses the associated pathMatcher to check pathRules. Each path rule maps a URL path pattern to a backend service. The defaultService handles requests that don’t match any path rule.
Apply traffic management policies to all requests
Applications that need consistent behavior across all routes can define retry policies, header transformations, and traffic splitting at the URL map level.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const _default = new gcp.compute.RegionHealthCheck("default", {
region: "us-central1",
name: "health-check",
checkIntervalSec: 1,
timeoutSec: 1,
httpHealthCheck: {
port: 80,
requestPath: "/",
},
});
const login = new gcp.compute.RegionBackendService("login", {
region: "us-central1",
name: "login",
protocol: "HTTP",
loadBalancingScheme: "INTERNAL_MANAGED",
timeoutSec: 10,
healthChecks: _default.id,
});
const home = new gcp.compute.RegionBackendService("home", {
region: "us-central1",
name: "home",
protocol: "HTTP",
loadBalancingScheme: "INTERNAL_MANAGED",
timeoutSec: 10,
healthChecks: _default.id,
});
const regionurlmap = new gcp.compute.RegionUrlMap("regionurlmap", {
region: "us-central1",
name: "regionurlmap",
description: "a description",
defaultRouteAction: {
retryPolicy: {
retryConditions: [
"5xx",
"gateway-error",
],
numRetries: 3,
perTryTimeout: {
seconds: "0",
nanos: 500,
},
},
requestMirrorPolicy: {
backendService: home.id,
},
weightedBackendServices: [
{
backendService: login.id,
weight: 200,
headerAction: {
requestHeadersToAdds: [{
headerName: "foo-request-1",
headerValue: "bar",
replace: true,
}],
requestHeadersToRemoves: ["fizz"],
responseHeadersToAdds: [{
headerName: "foo-response-1",
headerValue: "bar",
replace: true,
}],
responseHeadersToRemoves: ["buzz"],
},
},
{
backendService: home.id,
weight: 100,
headerAction: {
requestHeadersToAdds: [
{
headerName: "foo-request-1",
headerValue: "bar",
replace: true,
},
{
headerName: "foo-request-2",
headerValue: "bar",
replace: true,
},
],
requestHeadersToRemoves: ["fizz"],
responseHeadersToAdds: [
{
headerName: "foo-response-2",
headerValue: "bar",
replace: true,
},
{
headerName: "foo-response-1",
headerValue: "bar",
replace: true,
},
],
responseHeadersToRemoves: ["buzz"],
},
},
],
urlRewrite: {
hostRewrite: "dev.example.com",
pathPrefixRewrite: "/v1/api/",
},
corsPolicy: {
disabled: false,
allowCredentials: true,
allowHeaders: ["foobar"],
allowMethods: [
"GET",
"POST",
],
allowOrigins: ["example.com"],
exposeHeaders: ["foobar"],
maxAge: 60,
},
faultInjectionPolicy: {
delay: {
fixedDelay: {
seconds: "0",
nanos: 500,
},
percentage: 0.5,
},
abort: {
httpStatus: 500,
percentage: 0.5,
},
},
timeout: {
seconds: "0",
nanos: 500,
},
},
hostRules: [{
hosts: ["mysite.com"],
pathMatcher: "allpaths",
}],
pathMatchers: [{
name: "allpaths",
defaultService: home.id,
pathRules: [
{
paths: ["/home"],
service: home.id,
},
{
paths: ["/login"],
service: login.id,
},
],
}],
tests: [{
service: home.id,
host: "hi.com",
path: "/home",
}],
});
import pulumi
import pulumi_gcp as gcp
default = gcp.compute.RegionHealthCheck("default",
region="us-central1",
name="health-check",
check_interval_sec=1,
timeout_sec=1,
http_health_check={
"port": 80,
"request_path": "/",
})
login = gcp.compute.RegionBackendService("login",
region="us-central1",
name="login",
protocol="HTTP",
load_balancing_scheme="INTERNAL_MANAGED",
timeout_sec=10,
health_checks=default.id)
home = gcp.compute.RegionBackendService("home",
region="us-central1",
name="home",
protocol="HTTP",
load_balancing_scheme="INTERNAL_MANAGED",
timeout_sec=10,
health_checks=default.id)
regionurlmap = gcp.compute.RegionUrlMap("regionurlmap",
region="us-central1",
name="regionurlmap",
description="a description",
default_route_action={
"retry_policy": {
"retry_conditions": [
"5xx",
"gateway-error",
],
"num_retries": 3,
"per_try_timeout": {
"seconds": "0",
"nanos": 500,
},
},
"request_mirror_policy": {
"backend_service": home.id,
},
"weighted_backend_services": [
{
"backend_service": login.id,
"weight": 200,
"header_action": {
"request_headers_to_adds": [{
"header_name": "foo-request-1",
"header_value": "bar",
"replace": True,
}],
"request_headers_to_removes": ["fizz"],
"response_headers_to_adds": [{
"header_name": "foo-response-1",
"header_value": "bar",
"replace": True,
}],
"response_headers_to_removes": ["buzz"],
},
},
{
"backend_service": home.id,
"weight": 100,
"header_action": {
"request_headers_to_adds": [
{
"header_name": "foo-request-1",
"header_value": "bar",
"replace": True,
},
{
"header_name": "foo-request-2",
"header_value": "bar",
"replace": True,
},
],
"request_headers_to_removes": ["fizz"],
"response_headers_to_adds": [
{
"header_name": "foo-response-2",
"header_value": "bar",
"replace": True,
},
{
"header_name": "foo-response-1",
"header_value": "bar",
"replace": True,
},
],
"response_headers_to_removes": ["buzz"],
},
},
],
"url_rewrite": {
"host_rewrite": "dev.example.com",
"path_prefix_rewrite": "/v1/api/",
},
"cors_policy": {
"disabled": False,
"allow_credentials": True,
"allow_headers": ["foobar"],
"allow_methods": [
"GET",
"POST",
],
"allow_origins": ["example.com"],
"expose_headers": ["foobar"],
"max_age": 60,
},
"fault_injection_policy": {
"delay": {
"fixed_delay": {
"seconds": "0",
"nanos": 500,
},
"percentage": 0.5,
},
"abort": {
"http_status": 500,
"percentage": 0.5,
},
},
"timeout": {
"seconds": "0",
"nanos": 500,
},
},
host_rules=[{
"hosts": ["mysite.com"],
"path_matcher": "allpaths",
}],
path_matchers=[{
"name": "allpaths",
"default_service": home.id,
"path_rules": [
{
"paths": ["/home"],
"service": home.id,
},
{
"paths": ["/login"],
"service": login.id,
},
],
}],
tests=[{
"service": home.id,
"host": "hi.com",
"path": "/home",
}])
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_default, err := compute.NewRegionHealthCheck(ctx, "default", &compute.RegionHealthCheckArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("health-check"),
CheckIntervalSec: pulumi.Int(1),
TimeoutSec: pulumi.Int(1),
HttpHealthCheck: &compute.RegionHealthCheckHttpHealthCheckArgs{
Port: pulumi.Int(80),
RequestPath: pulumi.String("/"),
},
})
if err != nil {
return err
}
login, err := compute.NewRegionBackendService(ctx, "login", &compute.RegionBackendServiceArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("login"),
Protocol: pulumi.String("HTTP"),
LoadBalancingScheme: pulumi.String("INTERNAL_MANAGED"),
TimeoutSec: pulumi.Int(10),
HealthChecks: _default.ID(),
})
if err != nil {
return err
}
home, err := compute.NewRegionBackendService(ctx, "home", &compute.RegionBackendServiceArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("home"),
Protocol: pulumi.String("HTTP"),
LoadBalancingScheme: pulumi.String("INTERNAL_MANAGED"),
TimeoutSec: pulumi.Int(10),
HealthChecks: _default.ID(),
})
if err != nil {
return err
}
_, err = compute.NewRegionUrlMap(ctx, "regionurlmap", &compute.RegionUrlMapArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("regionurlmap"),
Description: pulumi.String("a description"),
DefaultRouteAction: &compute.RegionUrlMapDefaultRouteActionArgs{
RetryPolicy: &compute.RegionUrlMapDefaultRouteActionRetryPolicyArgs{
RetryConditions: pulumi.StringArray{
pulumi.String("5xx"),
pulumi.String("gateway-error"),
},
NumRetries: pulumi.Int(3),
PerTryTimeout: &compute.RegionUrlMapDefaultRouteActionRetryPolicyPerTryTimeoutArgs{
Seconds: pulumi.String("0"),
Nanos: pulumi.Int(500),
},
},
RequestMirrorPolicy: &compute.RegionUrlMapDefaultRouteActionRequestMirrorPolicyArgs{
BackendService: home.ID(),
},
WeightedBackendServices: compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceArray{
&compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceArgs{
BackendService: login.ID(),
Weight: pulumi.Int(200),
HeaderAction: &compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionArgs{
RequestHeadersToAdds: compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArray{
&compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArgs{
HeaderName: pulumi.String("foo-request-1"),
HeaderValue: pulumi.String("bar"),
Replace: pulumi.Bool(true),
},
},
RequestHeadersToRemoves: pulumi.StringArray{
pulumi.String("fizz"),
},
ResponseHeadersToAdds: compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArray{
&compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArgs{
HeaderName: pulumi.String("foo-response-1"),
HeaderValue: pulumi.String("bar"),
Replace: pulumi.Bool(true),
},
},
ResponseHeadersToRemoves: pulumi.StringArray{
pulumi.String("buzz"),
},
},
},
&compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceArgs{
BackendService: home.ID(),
Weight: pulumi.Int(100),
HeaderAction: &compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionArgs{
RequestHeadersToAdds: compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArray{
&compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArgs{
HeaderName: pulumi.String("foo-request-1"),
HeaderValue: pulumi.String("bar"),
Replace: pulumi.Bool(true),
},
&compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArgs{
HeaderName: pulumi.String("foo-request-2"),
HeaderValue: pulumi.String("bar"),
Replace: pulumi.Bool(true),
},
},
RequestHeadersToRemoves: pulumi.StringArray{
pulumi.String("fizz"),
},
ResponseHeadersToAdds: compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArray{
&compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArgs{
HeaderName: pulumi.String("foo-response-2"),
HeaderValue: pulumi.String("bar"),
Replace: pulumi.Bool(true),
},
&compute.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArgs{
HeaderName: pulumi.String("foo-response-1"),
HeaderValue: pulumi.String("bar"),
Replace: pulumi.Bool(true),
},
},
ResponseHeadersToRemoves: pulumi.StringArray{
pulumi.String("buzz"),
},
},
},
},
UrlRewrite: &compute.RegionUrlMapDefaultRouteActionUrlRewriteArgs{
HostRewrite: pulumi.String("dev.example.com"),
PathPrefixRewrite: pulumi.String("/v1/api/"),
},
CorsPolicy: &compute.RegionUrlMapDefaultRouteActionCorsPolicyArgs{
Disabled: pulumi.Bool(false),
AllowCredentials: pulumi.Bool(true),
AllowHeaders: pulumi.StringArray{
pulumi.String("foobar"),
},
AllowMethods: pulumi.StringArray{
pulumi.String("GET"),
pulumi.String("POST"),
},
AllowOrigins: pulumi.StringArray{
pulumi.String("example.com"),
},
ExposeHeaders: pulumi.StringArray{
pulumi.String("foobar"),
},
MaxAge: pulumi.Int(60),
},
FaultInjectionPolicy: &compute.RegionUrlMapDefaultRouteActionFaultInjectionPolicyArgs{
Delay: &compute.RegionUrlMapDefaultRouteActionFaultInjectionPolicyDelayArgs{
FixedDelay: &compute.RegionUrlMapDefaultRouteActionFaultInjectionPolicyDelayFixedDelayArgs{
Seconds: pulumi.String("0"),
Nanos: pulumi.Int(500),
},
Percentage: pulumi.Float64(0.5),
},
Abort: &compute.RegionUrlMapDefaultRouteActionFaultInjectionPolicyAbortArgs{
HttpStatus: pulumi.Int(500),
Percentage: pulumi.Float64(0.5),
},
},
Timeout: &compute.RegionUrlMapDefaultRouteActionTimeoutArgs{
Seconds: pulumi.String("0"),
Nanos: pulumi.Int(500),
},
},
HostRules: compute.RegionUrlMapHostRuleArray{
&compute.RegionUrlMapHostRuleArgs{
Hosts: pulumi.StringArray{
pulumi.String("mysite.com"),
},
PathMatcher: pulumi.String("allpaths"),
},
},
PathMatchers: compute.RegionUrlMapPathMatcherArray{
&compute.RegionUrlMapPathMatcherArgs{
Name: pulumi.String("allpaths"),
DefaultService: home.ID(),
PathRules: compute.RegionUrlMapPathMatcherPathRuleArray{
&compute.RegionUrlMapPathMatcherPathRuleArgs{
Paths: pulumi.StringArray{
pulumi.String("/home"),
},
Service: home.ID(),
},
&compute.RegionUrlMapPathMatcherPathRuleArgs{
Paths: pulumi.StringArray{
pulumi.String("/login"),
},
Service: login.ID(),
},
},
},
},
Tests: compute.RegionUrlMapTestArray{
&compute.RegionUrlMapTestArgs{
Service: home.ID(),
Host: pulumi.String("hi.com"),
Path: pulumi.String("/home"),
},
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var @default = new Gcp.Compute.RegionHealthCheck("default", new()
{
Region = "us-central1",
Name = "health-check",
CheckIntervalSec = 1,
TimeoutSec = 1,
HttpHealthCheck = new Gcp.Compute.Inputs.RegionHealthCheckHttpHealthCheckArgs
{
Port = 80,
RequestPath = "/",
},
});
var login = new Gcp.Compute.RegionBackendService("login", new()
{
Region = "us-central1",
Name = "login",
Protocol = "HTTP",
LoadBalancingScheme = "INTERNAL_MANAGED",
TimeoutSec = 10,
HealthChecks = @default.Id,
});
var home = new Gcp.Compute.RegionBackendService("home", new()
{
Region = "us-central1",
Name = "home",
Protocol = "HTTP",
LoadBalancingScheme = "INTERNAL_MANAGED",
TimeoutSec = 10,
HealthChecks = @default.Id,
});
var regionurlmap = new Gcp.Compute.RegionUrlMap("regionurlmap", new()
{
Region = "us-central1",
Name = "regionurlmap",
Description = "a description",
DefaultRouteAction = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionArgs
{
RetryPolicy = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionRetryPolicyArgs
{
RetryConditions = new[]
{
"5xx",
"gateway-error",
},
NumRetries = 3,
PerTryTimeout = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionRetryPolicyPerTryTimeoutArgs
{
Seconds = "0",
Nanos = 500,
},
},
RequestMirrorPolicy = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionRequestMirrorPolicyArgs
{
BackendService = home.Id,
},
WeightedBackendServices = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionWeightedBackendServiceArgs
{
BackendService = login.Id,
Weight = 200,
HeaderAction = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionArgs
{
RequestHeadersToAdds = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArgs
{
HeaderName = "foo-request-1",
HeaderValue = "bar",
Replace = true,
},
},
RequestHeadersToRemoves = new[]
{
"fizz",
},
ResponseHeadersToAdds = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArgs
{
HeaderName = "foo-response-1",
HeaderValue = "bar",
Replace = true,
},
},
ResponseHeadersToRemoves = new[]
{
"buzz",
},
},
},
new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionWeightedBackendServiceArgs
{
BackendService = home.Id,
Weight = 100,
HeaderAction = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionArgs
{
RequestHeadersToAdds = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArgs
{
HeaderName = "foo-request-1",
HeaderValue = "bar",
Replace = true,
},
new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArgs
{
HeaderName = "foo-request-2",
HeaderValue = "bar",
Replace = true,
},
},
RequestHeadersToRemoves = new[]
{
"fizz",
},
ResponseHeadersToAdds = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArgs
{
HeaderName = "foo-response-2",
HeaderValue = "bar",
Replace = true,
},
new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArgs
{
HeaderName = "foo-response-1",
HeaderValue = "bar",
Replace = true,
},
},
ResponseHeadersToRemoves = new[]
{
"buzz",
},
},
},
},
UrlRewrite = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionUrlRewriteArgs
{
HostRewrite = "dev.example.com",
PathPrefixRewrite = "/v1/api/",
},
CorsPolicy = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionCorsPolicyArgs
{
Disabled = false,
AllowCredentials = true,
AllowHeaders = new[]
{
"foobar",
},
AllowMethods = new[]
{
"GET",
"POST",
},
AllowOrigins = new[]
{
"example.com",
},
ExposeHeaders = new[]
{
"foobar",
},
MaxAge = 60,
},
FaultInjectionPolicy = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionFaultInjectionPolicyArgs
{
Delay = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionFaultInjectionPolicyDelayArgs
{
FixedDelay = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionFaultInjectionPolicyDelayFixedDelayArgs
{
Seconds = "0",
Nanos = 500,
},
Percentage = 0.5,
},
Abort = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionFaultInjectionPolicyAbortArgs
{
HttpStatus = 500,
Percentage = 0.5,
},
},
Timeout = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionTimeoutArgs
{
Seconds = "0",
Nanos = 500,
},
},
HostRules = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapHostRuleArgs
{
Hosts = new[]
{
"mysite.com",
},
PathMatcher = "allpaths",
},
},
PathMatchers = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherArgs
{
Name = "allpaths",
DefaultService = home.Id,
PathRules = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleArgs
{
Paths = new[]
{
"/home",
},
Service = home.Id,
},
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleArgs
{
Paths = new[]
{
"/login",
},
Service = login.Id,
},
},
},
},
Tests = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapTestArgs
{
Service = home.Id,
Host = "hi.com",
Path = "/home",
},
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.compute.RegionHealthCheck;
import com.pulumi.gcp.compute.RegionHealthCheckArgs;
import com.pulumi.gcp.compute.inputs.RegionHealthCheckHttpHealthCheckArgs;
import com.pulumi.gcp.compute.RegionBackendService;
import com.pulumi.gcp.compute.RegionBackendServiceArgs;
import com.pulumi.gcp.compute.RegionUrlMap;
import com.pulumi.gcp.compute.RegionUrlMapArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapDefaultRouteActionArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapDefaultRouteActionRetryPolicyArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapDefaultRouteActionRetryPolicyPerTryTimeoutArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapDefaultRouteActionRequestMirrorPolicyArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapDefaultRouteActionUrlRewriteArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapDefaultRouteActionCorsPolicyArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapDefaultRouteActionFaultInjectionPolicyArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapDefaultRouteActionFaultInjectionPolicyDelayArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapDefaultRouteActionFaultInjectionPolicyDelayFixedDelayArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapDefaultRouteActionFaultInjectionPolicyAbortArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapDefaultRouteActionTimeoutArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapHostRuleArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapPathMatcherArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapTestArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var default_ = new RegionHealthCheck("default", RegionHealthCheckArgs.builder()
.region("us-central1")
.name("health-check")
.checkIntervalSec(1)
.timeoutSec(1)
.httpHealthCheck(RegionHealthCheckHttpHealthCheckArgs.builder()
.port(80)
.requestPath("/")
.build())
.build());
var login = new RegionBackendService("login", RegionBackendServiceArgs.builder()
.region("us-central1")
.name("login")
.protocol("HTTP")
.loadBalancingScheme("INTERNAL_MANAGED")
.timeoutSec(10)
.healthChecks(default_.id())
.build());
var home = new RegionBackendService("home", RegionBackendServiceArgs.builder()
.region("us-central1")
.name("home")
.protocol("HTTP")
.loadBalancingScheme("INTERNAL_MANAGED")
.timeoutSec(10)
.healthChecks(default_.id())
.build());
var regionurlmap = new RegionUrlMap("regionurlmap", RegionUrlMapArgs.builder()
.region("us-central1")
.name("regionurlmap")
.description("a description")
.defaultRouteAction(RegionUrlMapDefaultRouteActionArgs.builder()
.retryPolicy(RegionUrlMapDefaultRouteActionRetryPolicyArgs.builder()
.retryConditions(
"5xx",
"gateway-error")
.numRetries(3)
.perTryTimeout(RegionUrlMapDefaultRouteActionRetryPolicyPerTryTimeoutArgs.builder()
.seconds("0")
.nanos(500)
.build())
.build())
.requestMirrorPolicy(RegionUrlMapDefaultRouteActionRequestMirrorPolicyArgs.builder()
.backendService(home.id())
.build())
.weightedBackendServices(
RegionUrlMapDefaultRouteActionWeightedBackendServiceArgs.builder()
.backendService(login.id())
.weight(200)
.headerAction(RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionArgs.builder()
.requestHeadersToAdds(RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArgs.builder()
.headerName("foo-request-1")
.headerValue("bar")
.replace(true)
.build())
.requestHeadersToRemoves("fizz")
.responseHeadersToAdds(RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArgs.builder()
.headerName("foo-response-1")
.headerValue("bar")
.replace(true)
.build())
.responseHeadersToRemoves("buzz")
.build())
.build(),
RegionUrlMapDefaultRouteActionWeightedBackendServiceArgs.builder()
.backendService(home.id())
.weight(100)
.headerAction(RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionArgs.builder()
.requestHeadersToAdds(
RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArgs.builder()
.headerName("foo-request-1")
.headerValue("bar")
.replace(true)
.build(),
RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArgs.builder()
.headerName("foo-request-2")
.headerValue("bar")
.replace(true)
.build())
.requestHeadersToRemoves("fizz")
.responseHeadersToAdds(
RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArgs.builder()
.headerName("foo-response-2")
.headerValue("bar")
.replace(true)
.build(),
RegionUrlMapDefaultRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArgs.builder()
.headerName("foo-response-1")
.headerValue("bar")
.replace(true)
.build())
.responseHeadersToRemoves("buzz")
.build())
.build())
.urlRewrite(RegionUrlMapDefaultRouteActionUrlRewriteArgs.builder()
.hostRewrite("dev.example.com")
.pathPrefixRewrite("/v1/api/")
.build())
.corsPolicy(RegionUrlMapDefaultRouteActionCorsPolicyArgs.builder()
.disabled(false)
.allowCredentials(true)
.allowHeaders("foobar")
.allowMethods(
"GET",
"POST")
.allowOrigins("example.com")
.exposeHeaders("foobar")
.maxAge(60)
.build())
.faultInjectionPolicy(RegionUrlMapDefaultRouteActionFaultInjectionPolicyArgs.builder()
.delay(RegionUrlMapDefaultRouteActionFaultInjectionPolicyDelayArgs.builder()
.fixedDelay(RegionUrlMapDefaultRouteActionFaultInjectionPolicyDelayFixedDelayArgs.builder()
.seconds("0")
.nanos(500)
.build())
.percentage(0.5)
.build())
.abort(RegionUrlMapDefaultRouteActionFaultInjectionPolicyAbortArgs.builder()
.httpStatus(500)
.percentage(0.5)
.build())
.build())
.timeout(RegionUrlMapDefaultRouteActionTimeoutArgs.builder()
.seconds("0")
.nanos(500)
.build())
.build())
.hostRules(RegionUrlMapHostRuleArgs.builder()
.hosts("mysite.com")
.pathMatcher("allpaths")
.build())
.pathMatchers(RegionUrlMapPathMatcherArgs.builder()
.name("allpaths")
.defaultService(home.id())
.pathRules(
RegionUrlMapPathMatcherPathRuleArgs.builder()
.paths("/home")
.service(home.id())
.build(),
RegionUrlMapPathMatcherPathRuleArgs.builder()
.paths("/login")
.service(login.id())
.build())
.build())
.tests(RegionUrlMapTestArgs.builder()
.service(home.id())
.host("hi.com")
.path("/home")
.build())
.build());
}
}
resources:
regionurlmap:
type: gcp:compute:RegionUrlMap
properties:
region: us-central1
name: regionurlmap
description: a description
defaultRouteAction:
retryPolicy:
retryConditions:
- 5xx
- gateway-error
numRetries: 3
perTryTimeout:
seconds: 0
nanos: 500
requestMirrorPolicy:
backendService: ${home.id}
weightedBackendServices:
- backendService: ${login.id}
weight: 200
headerAction:
requestHeadersToAdds:
- headerName: foo-request-1
headerValue: bar
replace: true
requestHeadersToRemoves:
- fizz
responseHeadersToAdds:
- headerName: foo-response-1
headerValue: bar
replace: true
responseHeadersToRemoves:
- buzz
- backendService: ${home.id}
weight: 100
headerAction:
requestHeadersToAdds:
- headerName: foo-request-1
headerValue: bar
replace: true
- headerName: foo-request-2
headerValue: bar
replace: true
requestHeadersToRemoves:
- fizz
responseHeadersToAdds:
- headerName: foo-response-2
headerValue: bar
replace: true
- headerName: foo-response-1
headerValue: bar
replace: true
responseHeadersToRemoves:
- buzz
urlRewrite:
hostRewrite: dev.example.com
pathPrefixRewrite: /v1/api/
corsPolicy:
disabled: false
allowCredentials: true
allowHeaders:
- foobar
allowMethods:
- GET
- POST
allowOrigins:
- example.com
exposeHeaders:
- foobar
maxAge: 60
faultInjectionPolicy:
delay:
fixedDelay:
seconds: 0
nanos: 500
percentage: 0.5
abort:
httpStatus: 500
percentage: 0.5
timeout:
seconds: 0
nanos: 500
hostRules:
- hosts:
- mysite.com
pathMatcher: allpaths
pathMatchers:
- name: allpaths
defaultService: ${home.id}
pathRules:
- paths:
- /home
service: ${home.id}
- paths:
- /login
service: ${login.id}
tests:
- service: ${home.id}
host: hi.com
path: /home
login:
type: gcp:compute:RegionBackendService
properties:
region: us-central1
name: login
protocol: HTTP
loadBalancingScheme: INTERNAL_MANAGED
timeoutSec: 10
healthChecks: ${default.id}
home:
type: gcp:compute:RegionBackendService
properties:
region: us-central1
name: home
protocol: HTTP
loadBalancingScheme: INTERNAL_MANAGED
timeoutSec: 10
healthChecks: ${default.id}
default:
type: gcp:compute:RegionHealthCheck
properties:
region: us-central1
name: health-check
checkIntervalSec: 1
timeoutSec: 1
httpHealthCheck:
port: 80
requestPath: /
The defaultRouteAction applies to all requests before they reach backend services. The retryPolicy configures automatic retries for failed requests. The weightedBackendServices array splits traffic between backends by weight, enabling canary deployments or A/B testing. The corsPolicy, faultInjectionPolicy, and urlRewrite properties control cross-origin requests, chaos testing, and URL transformation.
Configure advanced routing per path with full policy set
When different URL paths need distinct traffic management policies, you can attach routeAction to individual path rules.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const _default = new gcp.compute.RegionHealthCheck("default", {
name: "health-check",
httpHealthCheck: {
port: 80,
},
});
const home = new gcp.compute.RegionBackendService("home", {
name: "home",
protocol: "HTTP",
timeoutSec: 10,
healthChecks: _default.id,
loadBalancingScheme: "INTERNAL_MANAGED",
});
const regionurlmap = new gcp.compute.RegionUrlMap("regionurlmap", {
name: "regionurlmap",
description: "a description",
defaultService: home.id,
hostRules: [{
hosts: ["mysite.com"],
pathMatcher: "allpaths",
}],
pathMatchers: [{
name: "allpaths",
defaultService: home.id,
pathRules: [{
paths: ["/home"],
routeAction: {
corsPolicy: {
allowCredentials: true,
allowHeaders: ["Allowed content"],
allowMethods: ["GET"],
allowOrigins: ["Allowed origin"],
exposeHeaders: ["Exposed header"],
maxAge: 30,
disabled: false,
},
faultInjectionPolicy: {
abort: {
httpStatus: 234,
percentage: 5.6,
},
delay: {
fixedDelay: {
seconds: "0",
nanos: 50000,
},
percentage: 7.8,
},
},
requestMirrorPolicy: {
backendService: home.id,
},
retryPolicy: {
numRetries: 4,
perTryTimeout: {
seconds: "30",
},
retryConditions: [
"5xx",
"deadline-exceeded",
],
},
timeout: {
seconds: "20",
nanos: 750000000,
},
urlRewrite: {
hostRewrite: "dev.example.com",
pathPrefixRewrite: "/v1/api/",
},
weightedBackendServices: [{
backendService: home.id,
weight: 400,
headerAction: {
requestHeadersToRemoves: ["RemoveMe"],
requestHeadersToAdds: [{
headerName: "AddMe",
headerValue: "MyValue",
replace: true,
}],
responseHeadersToRemoves: ["RemoveMe"],
responseHeadersToAdds: [{
headerName: "AddMe",
headerValue: "MyValue",
replace: false,
}],
},
}],
},
}],
}],
tests: [{
service: home.id,
host: "hi.com",
path: "/home",
}],
});
import pulumi
import pulumi_gcp as gcp
default = gcp.compute.RegionHealthCheck("default",
name="health-check",
http_health_check={
"port": 80,
})
home = gcp.compute.RegionBackendService("home",
name="home",
protocol="HTTP",
timeout_sec=10,
health_checks=default.id,
load_balancing_scheme="INTERNAL_MANAGED")
regionurlmap = gcp.compute.RegionUrlMap("regionurlmap",
name="regionurlmap",
description="a description",
default_service=home.id,
host_rules=[{
"hosts": ["mysite.com"],
"path_matcher": "allpaths",
}],
path_matchers=[{
"name": "allpaths",
"default_service": home.id,
"path_rules": [{
"paths": ["/home"],
"route_action": {
"cors_policy": {
"allow_credentials": True,
"allow_headers": ["Allowed content"],
"allow_methods": ["GET"],
"allow_origins": ["Allowed origin"],
"expose_headers": ["Exposed header"],
"max_age": 30,
"disabled": False,
},
"fault_injection_policy": {
"abort": {
"http_status": 234,
"percentage": 5.6,
},
"delay": {
"fixed_delay": {
"seconds": "0",
"nanos": 50000,
},
"percentage": 7.8,
},
},
"request_mirror_policy": {
"backend_service": home.id,
},
"retry_policy": {
"num_retries": 4,
"per_try_timeout": {
"seconds": "30",
},
"retry_conditions": [
"5xx",
"deadline-exceeded",
],
},
"timeout": {
"seconds": "20",
"nanos": 750000000,
},
"url_rewrite": {
"host_rewrite": "dev.example.com",
"path_prefix_rewrite": "/v1/api/",
},
"weighted_backend_services": [{
"backend_service": home.id,
"weight": 400,
"header_action": {
"request_headers_to_removes": ["RemoveMe"],
"request_headers_to_adds": [{
"header_name": "AddMe",
"header_value": "MyValue",
"replace": True,
}],
"response_headers_to_removes": ["RemoveMe"],
"response_headers_to_adds": [{
"header_name": "AddMe",
"header_value": "MyValue",
"replace": False,
}],
},
}],
},
}],
}],
tests=[{
"service": home.id,
"host": "hi.com",
"path": "/home",
}])
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_default, err := compute.NewRegionHealthCheck(ctx, "default", &compute.RegionHealthCheckArgs{
Name: pulumi.String("health-check"),
HttpHealthCheck: &compute.RegionHealthCheckHttpHealthCheckArgs{
Port: pulumi.Int(80),
},
})
if err != nil {
return err
}
home, err := compute.NewRegionBackendService(ctx, "home", &compute.RegionBackendServiceArgs{
Name: pulumi.String("home"),
Protocol: pulumi.String("HTTP"),
TimeoutSec: pulumi.Int(10),
HealthChecks: _default.ID(),
LoadBalancingScheme: pulumi.String("INTERNAL_MANAGED"),
})
if err != nil {
return err
}
_, err = compute.NewRegionUrlMap(ctx, "regionurlmap", &compute.RegionUrlMapArgs{
Name: pulumi.String("regionurlmap"),
Description: pulumi.String("a description"),
DefaultService: home.ID(),
HostRules: compute.RegionUrlMapHostRuleArray{
&compute.RegionUrlMapHostRuleArgs{
Hosts: pulumi.StringArray{
pulumi.String("mysite.com"),
},
PathMatcher: pulumi.String("allpaths"),
},
},
PathMatchers: compute.RegionUrlMapPathMatcherArray{
&compute.RegionUrlMapPathMatcherArgs{
Name: pulumi.String("allpaths"),
DefaultService: home.ID(),
PathRules: compute.RegionUrlMapPathMatcherPathRuleArray{
&compute.RegionUrlMapPathMatcherPathRuleArgs{
Paths: pulumi.StringArray{
pulumi.String("/home"),
},
RouteAction: &compute.RegionUrlMapPathMatcherPathRuleRouteActionArgs{
CorsPolicy: &compute.RegionUrlMapPathMatcherPathRuleRouteActionCorsPolicyArgs{
AllowCredentials: pulumi.Bool(true),
AllowHeaders: pulumi.StringArray{
pulumi.String("Allowed content"),
},
AllowMethods: pulumi.StringArray{
pulumi.String("GET"),
},
AllowOrigins: pulumi.StringArray{
pulumi.String("Allowed origin"),
},
ExposeHeaders: pulumi.StringArray{
pulumi.String("Exposed header"),
},
MaxAge: pulumi.Int(30),
Disabled: pulumi.Bool(false),
},
FaultInjectionPolicy: &compute.RegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyArgs{
Abort: &compute.RegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbortArgs{
HttpStatus: pulumi.Int(234),
Percentage: pulumi.Float64(5.6),
},
Delay: &compute.RegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayArgs{
FixedDelay: &compute.RegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelayArgs{
Seconds: pulumi.String("0"),
Nanos: pulumi.Int(50000),
},
Percentage: pulumi.Float64(7.8),
},
},
RequestMirrorPolicy: &compute.RegionUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicyArgs{
BackendService: home.ID(),
},
RetryPolicy: &compute.RegionUrlMapPathMatcherPathRuleRouteActionRetryPolicyArgs{
NumRetries: pulumi.Int(4),
PerTryTimeout: &compute.RegionUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeoutArgs{
Seconds: pulumi.String("30"),
},
RetryConditions: pulumi.StringArray{
pulumi.String("5xx"),
pulumi.String("deadline-exceeded"),
},
},
Timeout: &compute.RegionUrlMapPathMatcherPathRuleRouteActionTimeoutArgs{
Seconds: pulumi.String("20"),
Nanos: pulumi.Int(750000000),
},
UrlRewrite: &compute.RegionUrlMapPathMatcherPathRuleRouteActionUrlRewriteArgs{
HostRewrite: pulumi.String("dev.example.com"),
PathPrefixRewrite: pulumi.String("/v1/api/"),
},
WeightedBackendServices: compute.RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceArray{
&compute.RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceArgs{
BackendService: home.ID(),
Weight: pulumi.Int(400),
HeaderAction: &compute.RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceHeaderActionArgs{
RequestHeadersToRemoves: pulumi.StringArray{
pulumi.String("RemoveMe"),
},
RequestHeadersToAdds: compute.RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArray{
&compute.RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArgs{
HeaderName: pulumi.String("AddMe"),
HeaderValue: pulumi.String("MyValue"),
Replace: pulumi.Bool(true),
},
},
ResponseHeadersToRemoves: pulumi.StringArray{
pulumi.String("RemoveMe"),
},
ResponseHeadersToAdds: compute.RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArray{
&compute.RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArgs{
HeaderName: pulumi.String("AddMe"),
HeaderValue: pulumi.String("MyValue"),
Replace: pulumi.Bool(false),
},
},
},
},
},
},
},
},
},
},
Tests: compute.RegionUrlMapTestArray{
&compute.RegionUrlMapTestArgs{
Service: home.ID(),
Host: pulumi.String("hi.com"),
Path: pulumi.String("/home"),
},
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var @default = new Gcp.Compute.RegionHealthCheck("default", new()
{
Name = "health-check",
HttpHealthCheck = new Gcp.Compute.Inputs.RegionHealthCheckHttpHealthCheckArgs
{
Port = 80,
},
});
var home = new Gcp.Compute.RegionBackendService("home", new()
{
Name = "home",
Protocol = "HTTP",
TimeoutSec = 10,
HealthChecks = @default.Id,
LoadBalancingScheme = "INTERNAL_MANAGED",
});
var regionurlmap = new Gcp.Compute.RegionUrlMap("regionurlmap", new()
{
Name = "regionurlmap",
Description = "a description",
DefaultService = home.Id,
HostRules = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapHostRuleArgs
{
Hosts = new[]
{
"mysite.com",
},
PathMatcher = "allpaths",
},
},
PathMatchers = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherArgs
{
Name = "allpaths",
DefaultService = home.Id,
PathRules = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleArgs
{
Paths = new[]
{
"/home",
},
RouteAction = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionArgs
{
CorsPolicy = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionCorsPolicyArgs
{
AllowCredentials = true,
AllowHeaders = new[]
{
"Allowed content",
},
AllowMethods = new[]
{
"GET",
},
AllowOrigins = new[]
{
"Allowed origin",
},
ExposeHeaders = new[]
{
"Exposed header",
},
MaxAge = 30,
Disabled = false,
},
FaultInjectionPolicy = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyArgs
{
Abort = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbortArgs
{
HttpStatus = 234,
Percentage = 5.6,
},
Delay = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayArgs
{
FixedDelay = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelayArgs
{
Seconds = "0",
Nanos = 50000,
},
Percentage = 7.8,
},
},
RequestMirrorPolicy = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicyArgs
{
BackendService = home.Id,
},
RetryPolicy = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionRetryPolicyArgs
{
NumRetries = 4,
PerTryTimeout = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeoutArgs
{
Seconds = "30",
},
RetryConditions = new[]
{
"5xx",
"deadline-exceeded",
},
},
Timeout = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionTimeoutArgs
{
Seconds = "20",
Nanos = 750000000,
},
UrlRewrite = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionUrlRewriteArgs
{
HostRewrite = "dev.example.com",
PathPrefixRewrite = "/v1/api/",
},
WeightedBackendServices = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceArgs
{
BackendService = home.Id,
Weight = 400,
HeaderAction = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceHeaderActionArgs
{
RequestHeadersToRemoves = new[]
{
"RemoveMe",
},
RequestHeadersToAdds = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArgs
{
HeaderName = "AddMe",
HeaderValue = "MyValue",
Replace = true,
},
},
ResponseHeadersToRemoves = new[]
{
"RemoveMe",
},
ResponseHeadersToAdds = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArgs
{
HeaderName = "AddMe",
HeaderValue = "MyValue",
Replace = false,
},
},
},
},
},
},
},
},
},
},
Tests = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapTestArgs
{
Service = home.Id,
Host = "hi.com",
Path = "/home",
},
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.compute.RegionHealthCheck;
import com.pulumi.gcp.compute.RegionHealthCheckArgs;
import com.pulumi.gcp.compute.inputs.RegionHealthCheckHttpHealthCheckArgs;
import com.pulumi.gcp.compute.RegionBackendService;
import com.pulumi.gcp.compute.RegionBackendServiceArgs;
import com.pulumi.gcp.compute.RegionUrlMap;
import com.pulumi.gcp.compute.RegionUrlMapArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapHostRuleArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapPathMatcherArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapTestArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var default_ = new RegionHealthCheck("default", RegionHealthCheckArgs.builder()
.name("health-check")
.httpHealthCheck(RegionHealthCheckHttpHealthCheckArgs.builder()
.port(80)
.build())
.build());
var home = new RegionBackendService("home", RegionBackendServiceArgs.builder()
.name("home")
.protocol("HTTP")
.timeoutSec(10)
.healthChecks(default_.id())
.loadBalancingScheme("INTERNAL_MANAGED")
.build());
var regionurlmap = new RegionUrlMap("regionurlmap", RegionUrlMapArgs.builder()
.name("regionurlmap")
.description("a description")
.defaultService(home.id())
.hostRules(RegionUrlMapHostRuleArgs.builder()
.hosts("mysite.com")
.pathMatcher("allpaths")
.build())
.pathMatchers(RegionUrlMapPathMatcherArgs.builder()
.name("allpaths")
.defaultService(home.id())
.pathRules(RegionUrlMapPathMatcherPathRuleArgs.builder()
.paths("/home")
.routeAction(RegionUrlMapPathMatcherPathRuleRouteActionArgs.builder()
.corsPolicy(RegionUrlMapPathMatcherPathRuleRouteActionCorsPolicyArgs.builder()
.allowCredentials(true)
.allowHeaders("Allowed content")
.allowMethods("GET")
.allowOrigins("Allowed origin")
.exposeHeaders("Exposed header")
.maxAge(30)
.disabled(false)
.build())
.faultInjectionPolicy(RegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyArgs.builder()
.abort(RegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbortArgs.builder()
.httpStatus(234)
.percentage(5.6)
.build())
.delay(RegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayArgs.builder()
.fixedDelay(RegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelayArgs.builder()
.seconds("0")
.nanos(50000)
.build())
.percentage(7.8)
.build())
.build())
.requestMirrorPolicy(RegionUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicyArgs.builder()
.backendService(home.id())
.build())
.retryPolicy(RegionUrlMapPathMatcherPathRuleRouteActionRetryPolicyArgs.builder()
.numRetries(4)
.perTryTimeout(RegionUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeoutArgs.builder()
.seconds("30")
.build())
.retryConditions(
"5xx",
"deadline-exceeded")
.build())
.timeout(RegionUrlMapPathMatcherPathRuleRouteActionTimeoutArgs.builder()
.seconds("20")
.nanos(750000000)
.build())
.urlRewrite(RegionUrlMapPathMatcherPathRuleRouteActionUrlRewriteArgs.builder()
.hostRewrite("dev.example.com")
.pathPrefixRewrite("/v1/api/")
.build())
.weightedBackendServices(RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceArgs.builder()
.backendService(home.id())
.weight(400)
.headerAction(RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceHeaderActionArgs.builder()
.requestHeadersToRemoves("RemoveMe")
.requestHeadersToAdds(RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceHeaderActionRequestHeadersToAddArgs.builder()
.headerName("AddMe")
.headerValue("MyValue")
.replace(true)
.build())
.responseHeadersToRemoves("RemoveMe")
.responseHeadersToAdds(RegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServiceHeaderActionResponseHeadersToAddArgs.builder()
.headerName("AddMe")
.headerValue("MyValue")
.replace(false)
.build())
.build())
.build())
.build())
.build())
.build())
.tests(RegionUrlMapTestArgs.builder()
.service(home.id())
.host("hi.com")
.path("/home")
.build())
.build());
}
}
resources:
regionurlmap:
type: gcp:compute:RegionUrlMap
properties:
name: regionurlmap
description: a description
defaultService: ${home.id}
hostRules:
- hosts:
- mysite.com
pathMatcher: allpaths
pathMatchers:
- name: allpaths
defaultService: ${home.id}
pathRules:
- paths:
- /home
routeAction:
corsPolicy:
allowCredentials: true
allowHeaders:
- Allowed content
allowMethods:
- GET
allowOrigins:
- Allowed origin
exposeHeaders:
- Exposed header
maxAge: 30
disabled: false
faultInjectionPolicy:
abort:
httpStatus: 234
percentage: 5.6
delay:
fixedDelay:
seconds: 0
nanos: 50000
percentage: 7.8
requestMirrorPolicy:
backendService: ${home.id}
retryPolicy:
numRetries: 4
perTryTimeout:
seconds: 30
retryConditions:
- 5xx
- deadline-exceeded
timeout:
seconds: 20
nanos: 7.5e+08
urlRewrite:
hostRewrite: dev.example.com
pathPrefixRewrite: /v1/api/
weightedBackendServices:
- backendService: ${home.id}
weight: 400
headerAction:
requestHeadersToRemoves:
- RemoveMe
requestHeadersToAdds:
- headerName: AddMe
headerValue: MyValue
replace: true
responseHeadersToRemoves:
- RemoveMe
responseHeadersToAdds:
- headerName: AddMe
headerValue: MyValue
replace: false
tests:
- service: ${home.id}
host: hi.com
path: /home
home:
type: gcp:compute:RegionBackendService
properties:
name: home
protocol: HTTP
timeoutSec: 10
healthChecks: ${default.id}
loadBalancingScheme: INTERNAL_MANAGED
default:
type: gcp:compute:RegionHealthCheck
properties:
name: health-check
httpHealthCheck:
port: 80
Each pathRule can have its own routeAction with policies that override the URL map defaults. This configuration applies CORS headers, injects faults for testing, retries failed requests, rewrites URLs, and manipulates headers specifically for the /home path. The weightedBackendServices property enables traffic splitting at the path level.
Match requests with advanced rules and redirect
Complex routing scenarios require matching on headers, query parameters, and metadata before deciding how to handle the request.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const _default = new gcp.compute.RegionHealthCheck("default", {
name: "health-check",
httpHealthCheck: {
port: 80,
},
});
const home = new gcp.compute.RegionBackendService("home", {
name: "home",
protocol: "HTTP",
timeoutSec: 10,
healthChecks: _default.id,
loadBalancingScheme: "INTERNAL_MANAGED",
});
const regionurlmap = new gcp.compute.RegionUrlMap("regionurlmap", {
name: "regionurlmap",
description: "a description",
defaultService: home.id,
hostRules: [{
hosts: ["mysite.com"],
pathMatcher: "allpaths",
}],
pathMatchers: [{
name: "allpaths",
defaultService: home.id,
routeRules: [{
priority: 1,
headerAction: {
requestHeadersToRemoves: ["RemoveMe2"],
requestHeadersToAdds: [{
headerName: "AddSomethingElse",
headerValue: "MyOtherValue",
replace: true,
}],
responseHeadersToRemoves: ["RemoveMe3"],
responseHeadersToAdds: [{
headerName: "AddMe",
headerValue: "MyValue",
replace: false,
}],
},
matchRules: [{
fullPathMatch: "a full path",
headerMatches: [{
headerName: "someheader",
exactMatch: "match this exactly",
invertMatch: true,
}],
ignoreCase: true,
metadataFilters: [{
filterMatchCriteria: "MATCH_ANY",
filterLabels: [{
name: "PLANET",
value: "MARS",
}],
}],
queryParameterMatches: [{
name: "a query parameter",
presentMatch: true,
}],
}],
urlRedirect: {
hostRedirect: "A host",
httpsRedirect: false,
pathRedirect: "some/path",
redirectResponseCode: "TEMPORARY_REDIRECT",
stripQuery: true,
},
}],
}],
tests: [{
service: home.id,
host: "hi.com",
path: "/home",
}],
});
import pulumi
import pulumi_gcp as gcp
default = gcp.compute.RegionHealthCheck("default",
name="health-check",
http_health_check={
"port": 80,
})
home = gcp.compute.RegionBackendService("home",
name="home",
protocol="HTTP",
timeout_sec=10,
health_checks=default.id,
load_balancing_scheme="INTERNAL_MANAGED")
regionurlmap = gcp.compute.RegionUrlMap("regionurlmap",
name="regionurlmap",
description="a description",
default_service=home.id,
host_rules=[{
"hosts": ["mysite.com"],
"path_matcher": "allpaths",
}],
path_matchers=[{
"name": "allpaths",
"default_service": home.id,
"route_rules": [{
"priority": 1,
"header_action": {
"request_headers_to_removes": ["RemoveMe2"],
"request_headers_to_adds": [{
"header_name": "AddSomethingElse",
"header_value": "MyOtherValue",
"replace": True,
}],
"response_headers_to_removes": ["RemoveMe3"],
"response_headers_to_adds": [{
"header_name": "AddMe",
"header_value": "MyValue",
"replace": False,
}],
},
"match_rules": [{
"full_path_match": "a full path",
"header_matches": [{
"header_name": "someheader",
"exact_match": "match this exactly",
"invert_match": True,
}],
"ignore_case": True,
"metadata_filters": [{
"filter_match_criteria": "MATCH_ANY",
"filter_labels": [{
"name": "PLANET",
"value": "MARS",
}],
}],
"query_parameter_matches": [{
"name": "a query parameter",
"present_match": True,
}],
}],
"url_redirect": {
"host_redirect": "A host",
"https_redirect": False,
"path_redirect": "some/path",
"redirect_response_code": "TEMPORARY_REDIRECT",
"strip_query": True,
},
}],
}],
tests=[{
"service": home.id,
"host": "hi.com",
"path": "/home",
}])
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_default, err := compute.NewRegionHealthCheck(ctx, "default", &compute.RegionHealthCheckArgs{
Name: pulumi.String("health-check"),
HttpHealthCheck: &compute.RegionHealthCheckHttpHealthCheckArgs{
Port: pulumi.Int(80),
},
})
if err != nil {
return err
}
home, err := compute.NewRegionBackendService(ctx, "home", &compute.RegionBackendServiceArgs{
Name: pulumi.String("home"),
Protocol: pulumi.String("HTTP"),
TimeoutSec: pulumi.Int(10),
HealthChecks: _default.ID(),
LoadBalancingScheme: pulumi.String("INTERNAL_MANAGED"),
})
if err != nil {
return err
}
_, err = compute.NewRegionUrlMap(ctx, "regionurlmap", &compute.RegionUrlMapArgs{
Name: pulumi.String("regionurlmap"),
Description: pulumi.String("a description"),
DefaultService: home.ID(),
HostRules: compute.RegionUrlMapHostRuleArray{
&compute.RegionUrlMapHostRuleArgs{
Hosts: pulumi.StringArray{
pulumi.String("mysite.com"),
},
PathMatcher: pulumi.String("allpaths"),
},
},
PathMatchers: compute.RegionUrlMapPathMatcherArray{
&compute.RegionUrlMapPathMatcherArgs{
Name: pulumi.String("allpaths"),
DefaultService: home.ID(),
RouteRules: compute.RegionUrlMapPathMatcherRouteRuleArray{
&compute.RegionUrlMapPathMatcherRouteRuleArgs{
Priority: pulumi.Int(1),
HeaderAction: &compute.RegionUrlMapPathMatcherRouteRuleHeaderActionArgs{
RequestHeadersToRemoves: pulumi.StringArray{
pulumi.String("RemoveMe2"),
},
RequestHeadersToAdds: compute.RegionUrlMapPathMatcherRouteRuleHeaderActionRequestHeadersToAddArray{
&compute.RegionUrlMapPathMatcherRouteRuleHeaderActionRequestHeadersToAddArgs{
HeaderName: pulumi.String("AddSomethingElse"),
HeaderValue: pulumi.String("MyOtherValue"),
Replace: pulumi.Bool(true),
},
},
ResponseHeadersToRemoves: pulumi.StringArray{
pulumi.String("RemoveMe3"),
},
ResponseHeadersToAdds: compute.RegionUrlMapPathMatcherRouteRuleHeaderActionResponseHeadersToAddArray{
&compute.RegionUrlMapPathMatcherRouteRuleHeaderActionResponseHeadersToAddArgs{
HeaderName: pulumi.String("AddMe"),
HeaderValue: pulumi.String("MyValue"),
Replace: pulumi.Bool(false),
},
},
},
MatchRules: compute.RegionUrlMapPathMatcherRouteRuleMatchRuleArray{
&compute.RegionUrlMapPathMatcherRouteRuleMatchRuleArgs{
FullPathMatch: pulumi.String("a full path"),
HeaderMatches: compute.RegionUrlMapPathMatcherRouteRuleMatchRuleHeaderMatchArray{
&compute.RegionUrlMapPathMatcherRouteRuleMatchRuleHeaderMatchArgs{
HeaderName: pulumi.String("someheader"),
ExactMatch: pulumi.String("match this exactly"),
InvertMatch: pulumi.Bool(true),
},
},
IgnoreCase: pulumi.Bool(true),
MetadataFilters: compute.RegionUrlMapPathMatcherRouteRuleMatchRuleMetadataFilterArray{
&compute.RegionUrlMapPathMatcherRouteRuleMatchRuleMetadataFilterArgs{
FilterMatchCriteria: pulumi.String("MATCH_ANY"),
FilterLabels: compute.RegionUrlMapPathMatcherRouteRuleMatchRuleMetadataFilterFilterLabelArray{
&compute.RegionUrlMapPathMatcherRouteRuleMatchRuleMetadataFilterFilterLabelArgs{
Name: pulumi.String("PLANET"),
Value: pulumi.String("MARS"),
},
},
},
},
QueryParameterMatches: compute.RegionUrlMapPathMatcherRouteRuleMatchRuleQueryParameterMatchArray{
&compute.RegionUrlMapPathMatcherRouteRuleMatchRuleQueryParameterMatchArgs{
Name: pulumi.String("a query parameter"),
PresentMatch: pulumi.Bool(true),
},
},
},
},
UrlRedirect: &compute.RegionUrlMapPathMatcherRouteRuleUrlRedirectArgs{
HostRedirect: pulumi.String("A host"),
HttpsRedirect: pulumi.Bool(false),
PathRedirect: pulumi.String("some/path"),
RedirectResponseCode: pulumi.String("TEMPORARY_REDIRECT"),
StripQuery: pulumi.Bool(true),
},
},
},
},
},
Tests: compute.RegionUrlMapTestArray{
&compute.RegionUrlMapTestArgs{
Service: home.ID(),
Host: pulumi.String("hi.com"),
Path: pulumi.String("/home"),
},
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var @default = new Gcp.Compute.RegionHealthCheck("default", new()
{
Name = "health-check",
HttpHealthCheck = new Gcp.Compute.Inputs.RegionHealthCheckHttpHealthCheckArgs
{
Port = 80,
},
});
var home = new Gcp.Compute.RegionBackendService("home", new()
{
Name = "home",
Protocol = "HTTP",
TimeoutSec = 10,
HealthChecks = @default.Id,
LoadBalancingScheme = "INTERNAL_MANAGED",
});
var regionurlmap = new Gcp.Compute.RegionUrlMap("regionurlmap", new()
{
Name = "regionurlmap",
Description = "a description",
DefaultService = home.Id,
HostRules = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapHostRuleArgs
{
Hosts = new[]
{
"mysite.com",
},
PathMatcher = "allpaths",
},
},
PathMatchers = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherArgs
{
Name = "allpaths",
DefaultService = home.Id,
RouteRules = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleArgs
{
Priority = 1,
HeaderAction = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleHeaderActionArgs
{
RequestHeadersToRemoves = new[]
{
"RemoveMe2",
},
RequestHeadersToAdds = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleHeaderActionRequestHeadersToAddArgs
{
HeaderName = "AddSomethingElse",
HeaderValue = "MyOtherValue",
Replace = true,
},
},
ResponseHeadersToRemoves = new[]
{
"RemoveMe3",
},
ResponseHeadersToAdds = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleHeaderActionResponseHeadersToAddArgs
{
HeaderName = "AddMe",
HeaderValue = "MyValue",
Replace = false,
},
},
},
MatchRules = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleMatchRuleArgs
{
FullPathMatch = "a full path",
HeaderMatches = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleMatchRuleHeaderMatchArgs
{
HeaderName = "someheader",
ExactMatch = "match this exactly",
InvertMatch = true,
},
},
IgnoreCase = true,
MetadataFilters = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleMatchRuleMetadataFilterArgs
{
FilterMatchCriteria = "MATCH_ANY",
FilterLabels = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleMatchRuleMetadataFilterFilterLabelArgs
{
Name = "PLANET",
Value = "MARS",
},
},
},
},
QueryParameterMatches = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleMatchRuleQueryParameterMatchArgs
{
Name = "a query parameter",
PresentMatch = true,
},
},
},
},
UrlRedirect = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleUrlRedirectArgs
{
HostRedirect = "A host",
HttpsRedirect = false,
PathRedirect = "some/path",
RedirectResponseCode = "TEMPORARY_REDIRECT",
StripQuery = true,
},
},
},
},
},
Tests = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapTestArgs
{
Service = home.Id,
Host = "hi.com",
Path = "/home",
},
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.compute.RegionHealthCheck;
import com.pulumi.gcp.compute.RegionHealthCheckArgs;
import com.pulumi.gcp.compute.inputs.RegionHealthCheckHttpHealthCheckArgs;
import com.pulumi.gcp.compute.RegionBackendService;
import com.pulumi.gcp.compute.RegionBackendServiceArgs;
import com.pulumi.gcp.compute.RegionUrlMap;
import com.pulumi.gcp.compute.RegionUrlMapArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapHostRuleArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapPathMatcherArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapTestArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var default_ = new RegionHealthCheck("default", RegionHealthCheckArgs.builder()
.name("health-check")
.httpHealthCheck(RegionHealthCheckHttpHealthCheckArgs.builder()
.port(80)
.build())
.build());
var home = new RegionBackendService("home", RegionBackendServiceArgs.builder()
.name("home")
.protocol("HTTP")
.timeoutSec(10)
.healthChecks(default_.id())
.loadBalancingScheme("INTERNAL_MANAGED")
.build());
var regionurlmap = new RegionUrlMap("regionurlmap", RegionUrlMapArgs.builder()
.name("regionurlmap")
.description("a description")
.defaultService(home.id())
.hostRules(RegionUrlMapHostRuleArgs.builder()
.hosts("mysite.com")
.pathMatcher("allpaths")
.build())
.pathMatchers(RegionUrlMapPathMatcherArgs.builder()
.name("allpaths")
.defaultService(home.id())
.routeRules(RegionUrlMapPathMatcherRouteRuleArgs.builder()
.priority(1)
.headerAction(RegionUrlMapPathMatcherRouteRuleHeaderActionArgs.builder()
.requestHeadersToRemoves("RemoveMe2")
.requestHeadersToAdds(RegionUrlMapPathMatcherRouteRuleHeaderActionRequestHeadersToAddArgs.builder()
.headerName("AddSomethingElse")
.headerValue("MyOtherValue")
.replace(true)
.build())
.responseHeadersToRemoves("RemoveMe3")
.responseHeadersToAdds(RegionUrlMapPathMatcherRouteRuleHeaderActionResponseHeadersToAddArgs.builder()
.headerName("AddMe")
.headerValue("MyValue")
.replace(false)
.build())
.build())
.matchRules(RegionUrlMapPathMatcherRouteRuleMatchRuleArgs.builder()
.fullPathMatch("a full path")
.headerMatches(RegionUrlMapPathMatcherRouteRuleMatchRuleHeaderMatchArgs.builder()
.headerName("someheader")
.exactMatch("match this exactly")
.invertMatch(true)
.build())
.ignoreCase(true)
.metadataFilters(RegionUrlMapPathMatcherRouteRuleMatchRuleMetadataFilterArgs.builder()
.filterMatchCriteria("MATCH_ANY")
.filterLabels(RegionUrlMapPathMatcherRouteRuleMatchRuleMetadataFilterFilterLabelArgs.builder()
.name("PLANET")
.value("MARS")
.build())
.build())
.queryParameterMatches(RegionUrlMapPathMatcherRouteRuleMatchRuleQueryParameterMatchArgs.builder()
.name("a query parameter")
.presentMatch(true)
.build())
.build())
.urlRedirect(RegionUrlMapPathMatcherRouteRuleUrlRedirectArgs.builder()
.hostRedirect("A host")
.httpsRedirect(false)
.pathRedirect("some/path")
.redirectResponseCode("TEMPORARY_REDIRECT")
.stripQuery(true)
.build())
.build())
.build())
.tests(RegionUrlMapTestArgs.builder()
.service(home.id())
.host("hi.com")
.path("/home")
.build())
.build());
}
}
resources:
regionurlmap:
type: gcp:compute:RegionUrlMap
properties:
name: regionurlmap
description: a description
defaultService: ${home.id}
hostRules:
- hosts:
- mysite.com
pathMatcher: allpaths
pathMatchers:
- name: allpaths
defaultService: ${home.id}
routeRules:
- priority: 1
headerAction:
requestHeadersToRemoves:
- RemoveMe2
requestHeadersToAdds:
- headerName: AddSomethingElse
headerValue: MyOtherValue
replace: true
responseHeadersToRemoves:
- RemoveMe3
responseHeadersToAdds:
- headerName: AddMe
headerValue: MyValue
replace: false
matchRules:
- fullPathMatch: a full path
headerMatches:
- headerName: someheader
exactMatch: match this exactly
invertMatch: true
ignoreCase: true
metadataFilters:
- filterMatchCriteria: MATCH_ANY
filterLabels:
- name: PLANET
value: MARS
queryParameterMatches:
- name: a query parameter
presentMatch: true
urlRedirect:
hostRedirect: A host
httpsRedirect: false
pathRedirect: some/path
redirectResponseCode: TEMPORARY_REDIRECT
stripQuery: true
tests:
- service: ${home.id}
host: hi.com
path: /home
home:
type: gcp:compute:RegionBackendService
properties:
name: home
protocol: HTTP
timeoutSec: 10
healthChecks: ${default.id}
loadBalancingScheme: INTERNAL_MANAGED
default:
type: gcp:compute:RegionHealthCheck
properties:
name: health-check
httpHealthCheck:
port: 80
The routeRules array defines ordered matching rules that evaluate before path-based routing. Each rule has matchRules that check fullPathMatch, headerMatches, queryParameterMatches, and metadataFilters. The priority property controls evaluation order (lower numbers first). When a rule matches, the urlRedirect property sends an HTTP redirect instead of proxying to a backend.
Extract path variables with template matching
RESTful APIs often embed identifiers in URL paths. Path template matching extracts these variables and enables URL rewriting based on captured values.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const _default = new gcp.compute.RegionHealthCheck("default", {
region: "us-central1",
name: "health-check",
checkIntervalSec: 1,
timeoutSec: 1,
httpHealthCheck: {
port: 80,
requestPath: "/",
},
});
const home_backend = new gcp.compute.RegionBackendService("home-backend", {
region: "us-central1",
name: "home-service",
portName: "http",
protocol: "HTTP",
timeoutSec: 10,
loadBalancingScheme: "EXTERNAL_MANAGED",
healthChecks: _default.id,
});
const cart_backend = new gcp.compute.RegionBackendService("cart-backend", {
region: "us-central1",
name: "cart-service",
portName: "http",
protocol: "HTTP",
timeoutSec: 10,
loadBalancingScheme: "EXTERNAL_MANAGED",
healthChecks: _default.id,
});
const user_backend = new gcp.compute.RegionBackendService("user-backend", {
region: "us-central1",
name: "user-service",
portName: "http",
protocol: "HTTP",
timeoutSec: 10,
loadBalancingScheme: "EXTERNAL_MANAGED",
healthChecks: _default.id,
});
const urlmap = new gcp.compute.RegionUrlMap("urlmap", {
region: "us-central1",
name: "urlmap",
description: "a description",
defaultService: home_backend.id,
hostRules: [{
hosts: ["mysite.com"],
pathMatcher: "mysite",
}],
pathMatchers: [{
name: "mysite",
defaultService: home_backend.id,
routeRules: [
{
matchRules: [{
pathTemplateMatch: "/xyzwebservices/v2/xyz/users/{username=*}/carts/{cartid=**}",
}],
service: cart_backend.id,
priority: 1,
routeAction: {
urlRewrite: {
pathTemplateRewrite: "/{username}-{cartid}/",
},
},
},
{
matchRules: [{
pathTemplateMatch: "/xyzwebservices/v2/xyz/users/*/accountinfo/*",
}],
service: user_backend.id,
priority: 2,
},
],
}],
});
import pulumi
import pulumi_gcp as gcp
default = gcp.compute.RegionHealthCheck("default",
region="us-central1",
name="health-check",
check_interval_sec=1,
timeout_sec=1,
http_health_check={
"port": 80,
"request_path": "/",
})
home_backend = gcp.compute.RegionBackendService("home-backend",
region="us-central1",
name="home-service",
port_name="http",
protocol="HTTP",
timeout_sec=10,
load_balancing_scheme="EXTERNAL_MANAGED",
health_checks=default.id)
cart_backend = gcp.compute.RegionBackendService("cart-backend",
region="us-central1",
name="cart-service",
port_name="http",
protocol="HTTP",
timeout_sec=10,
load_balancing_scheme="EXTERNAL_MANAGED",
health_checks=default.id)
user_backend = gcp.compute.RegionBackendService("user-backend",
region="us-central1",
name="user-service",
port_name="http",
protocol="HTTP",
timeout_sec=10,
load_balancing_scheme="EXTERNAL_MANAGED",
health_checks=default.id)
urlmap = gcp.compute.RegionUrlMap("urlmap",
region="us-central1",
name="urlmap",
description="a description",
default_service=home_backend.id,
host_rules=[{
"hosts": ["mysite.com"],
"path_matcher": "mysite",
}],
path_matchers=[{
"name": "mysite",
"default_service": home_backend.id,
"route_rules": [
{
"match_rules": [{
"path_template_match": "/xyzwebservices/v2/xyz/users/{username=*}/carts/{cartid=**}",
}],
"service": cart_backend.id,
"priority": 1,
"route_action": {
"url_rewrite": {
"path_template_rewrite": "/{username}-{cartid}/",
},
},
},
{
"match_rules": [{
"path_template_match": "/xyzwebservices/v2/xyz/users/*/accountinfo/*",
}],
"service": user_backend.id,
"priority": 2,
},
],
}])
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_default, err := compute.NewRegionHealthCheck(ctx, "default", &compute.RegionHealthCheckArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("health-check"),
CheckIntervalSec: pulumi.Int(1),
TimeoutSec: pulumi.Int(1),
HttpHealthCheck: &compute.RegionHealthCheckHttpHealthCheckArgs{
Port: pulumi.Int(80),
RequestPath: pulumi.String("/"),
},
})
if err != nil {
return err
}
home_backend, err := compute.NewRegionBackendService(ctx, "home-backend", &compute.RegionBackendServiceArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("home-service"),
PortName: pulumi.String("http"),
Protocol: pulumi.String("HTTP"),
TimeoutSec: pulumi.Int(10),
LoadBalancingScheme: pulumi.String("EXTERNAL_MANAGED"),
HealthChecks: _default.ID(),
})
if err != nil {
return err
}
cart_backend, err := compute.NewRegionBackendService(ctx, "cart-backend", &compute.RegionBackendServiceArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("cart-service"),
PortName: pulumi.String("http"),
Protocol: pulumi.String("HTTP"),
TimeoutSec: pulumi.Int(10),
LoadBalancingScheme: pulumi.String("EXTERNAL_MANAGED"),
HealthChecks: _default.ID(),
})
if err != nil {
return err
}
user_backend, err := compute.NewRegionBackendService(ctx, "user-backend", &compute.RegionBackendServiceArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("user-service"),
PortName: pulumi.String("http"),
Protocol: pulumi.String("HTTP"),
TimeoutSec: pulumi.Int(10),
LoadBalancingScheme: pulumi.String("EXTERNAL_MANAGED"),
HealthChecks: _default.ID(),
})
if err != nil {
return err
}
_, err = compute.NewRegionUrlMap(ctx, "urlmap", &compute.RegionUrlMapArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("urlmap"),
Description: pulumi.String("a description"),
DefaultService: home_backend.ID(),
HostRules: compute.RegionUrlMapHostRuleArray{
&compute.RegionUrlMapHostRuleArgs{
Hosts: pulumi.StringArray{
pulumi.String("mysite.com"),
},
PathMatcher: pulumi.String("mysite"),
},
},
PathMatchers: compute.RegionUrlMapPathMatcherArray{
&compute.RegionUrlMapPathMatcherArgs{
Name: pulumi.String("mysite"),
DefaultService: home_backend.ID(),
RouteRules: compute.RegionUrlMapPathMatcherRouteRuleArray{
&compute.RegionUrlMapPathMatcherRouteRuleArgs{
MatchRules: compute.RegionUrlMapPathMatcherRouteRuleMatchRuleArray{
&compute.RegionUrlMapPathMatcherRouteRuleMatchRuleArgs{
PathTemplateMatch: pulumi.String("/xyzwebservices/v2/xyz/users/{username=*}/carts/{cartid=**}"),
},
},
Service: cart_backend.ID(),
Priority: pulumi.Int(1),
RouteAction: &compute.RegionUrlMapPathMatcherRouteRuleRouteActionArgs{
UrlRewrite: &compute.RegionUrlMapPathMatcherRouteRuleRouteActionUrlRewriteArgs{
PathTemplateRewrite: pulumi.String("/{username}-{cartid}/"),
},
},
},
&compute.RegionUrlMapPathMatcherRouteRuleArgs{
MatchRules: compute.RegionUrlMapPathMatcherRouteRuleMatchRuleArray{
&compute.RegionUrlMapPathMatcherRouteRuleMatchRuleArgs{
PathTemplateMatch: pulumi.String("/xyzwebservices/v2/xyz/users/*/accountinfo/*"),
},
},
Service: user_backend.ID(),
Priority: pulumi.Int(2),
},
},
},
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var @default = new Gcp.Compute.RegionHealthCheck("default", new()
{
Region = "us-central1",
Name = "health-check",
CheckIntervalSec = 1,
TimeoutSec = 1,
HttpHealthCheck = new Gcp.Compute.Inputs.RegionHealthCheckHttpHealthCheckArgs
{
Port = 80,
RequestPath = "/",
},
});
var home_backend = new Gcp.Compute.RegionBackendService("home-backend", new()
{
Region = "us-central1",
Name = "home-service",
PortName = "http",
Protocol = "HTTP",
TimeoutSec = 10,
LoadBalancingScheme = "EXTERNAL_MANAGED",
HealthChecks = @default.Id,
});
var cart_backend = new Gcp.Compute.RegionBackendService("cart-backend", new()
{
Region = "us-central1",
Name = "cart-service",
PortName = "http",
Protocol = "HTTP",
TimeoutSec = 10,
LoadBalancingScheme = "EXTERNAL_MANAGED",
HealthChecks = @default.Id,
});
var user_backend = new Gcp.Compute.RegionBackendService("user-backend", new()
{
Region = "us-central1",
Name = "user-service",
PortName = "http",
Protocol = "HTTP",
TimeoutSec = 10,
LoadBalancingScheme = "EXTERNAL_MANAGED",
HealthChecks = @default.Id,
});
var urlmap = new Gcp.Compute.RegionUrlMap("urlmap", new()
{
Region = "us-central1",
Name = "urlmap",
Description = "a description",
DefaultService = home_backend.Id,
HostRules = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapHostRuleArgs
{
Hosts = new[]
{
"mysite.com",
},
PathMatcher = "mysite",
},
},
PathMatchers = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherArgs
{
Name = "mysite",
DefaultService = home_backend.Id,
RouteRules = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleArgs
{
MatchRules = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleMatchRuleArgs
{
PathTemplateMatch = "/xyzwebservices/v2/xyz/users/{username=*}/carts/{cartid=**}",
},
},
Service = cart_backend.Id,
Priority = 1,
RouteAction = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleRouteActionArgs
{
UrlRewrite = new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleRouteActionUrlRewriteArgs
{
PathTemplateRewrite = "/{username}-{cartid}/",
},
},
},
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleArgs
{
MatchRules = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherRouteRuleMatchRuleArgs
{
PathTemplateMatch = "/xyzwebservices/v2/xyz/users/*/accountinfo/*",
},
},
Service = user_backend.Id,
Priority = 2,
},
},
},
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.compute.RegionHealthCheck;
import com.pulumi.gcp.compute.RegionHealthCheckArgs;
import com.pulumi.gcp.compute.inputs.RegionHealthCheckHttpHealthCheckArgs;
import com.pulumi.gcp.compute.RegionBackendService;
import com.pulumi.gcp.compute.RegionBackendServiceArgs;
import com.pulumi.gcp.compute.RegionUrlMap;
import com.pulumi.gcp.compute.RegionUrlMapArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapHostRuleArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapPathMatcherArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var default_ = new RegionHealthCheck("default", RegionHealthCheckArgs.builder()
.region("us-central1")
.name("health-check")
.checkIntervalSec(1)
.timeoutSec(1)
.httpHealthCheck(RegionHealthCheckHttpHealthCheckArgs.builder()
.port(80)
.requestPath("/")
.build())
.build());
var home_backend = new RegionBackendService("home-backend", RegionBackendServiceArgs.builder()
.region("us-central1")
.name("home-service")
.portName("http")
.protocol("HTTP")
.timeoutSec(10)
.loadBalancingScheme("EXTERNAL_MANAGED")
.healthChecks(default_.id())
.build());
var cart_backend = new RegionBackendService("cart-backend", RegionBackendServiceArgs.builder()
.region("us-central1")
.name("cart-service")
.portName("http")
.protocol("HTTP")
.timeoutSec(10)
.loadBalancingScheme("EXTERNAL_MANAGED")
.healthChecks(default_.id())
.build());
var user_backend = new RegionBackendService("user-backend", RegionBackendServiceArgs.builder()
.region("us-central1")
.name("user-service")
.portName("http")
.protocol("HTTP")
.timeoutSec(10)
.loadBalancingScheme("EXTERNAL_MANAGED")
.healthChecks(default_.id())
.build());
var urlmap = new RegionUrlMap("urlmap", RegionUrlMapArgs.builder()
.region("us-central1")
.name("urlmap")
.description("a description")
.defaultService(home_backend.id())
.hostRules(RegionUrlMapHostRuleArgs.builder()
.hosts("mysite.com")
.pathMatcher("mysite")
.build())
.pathMatchers(RegionUrlMapPathMatcherArgs.builder()
.name("mysite")
.defaultService(home_backend.id())
.routeRules(
RegionUrlMapPathMatcherRouteRuleArgs.builder()
.matchRules(RegionUrlMapPathMatcherRouteRuleMatchRuleArgs.builder()
.pathTemplateMatch("/xyzwebservices/v2/xyz/users/{username=*}/carts/{cartid=**}")
.build())
.service(cart_backend.id())
.priority(1)
.routeAction(RegionUrlMapPathMatcherRouteRuleRouteActionArgs.builder()
.urlRewrite(RegionUrlMapPathMatcherRouteRuleRouteActionUrlRewriteArgs.builder()
.pathTemplateRewrite("/{username}-{cartid}/")
.build())
.build())
.build(),
RegionUrlMapPathMatcherRouteRuleArgs.builder()
.matchRules(RegionUrlMapPathMatcherRouteRuleMatchRuleArgs.builder()
.pathTemplateMatch("/xyzwebservices/v2/xyz/users/*/accountinfo/*")
.build())
.service(user_backend.id())
.priority(2)
.build())
.build())
.build());
}
}
resources:
urlmap:
type: gcp:compute:RegionUrlMap
properties:
region: us-central1
name: urlmap
description: a description
defaultService: ${["home-backend"].id}
hostRules:
- hosts:
- mysite.com
pathMatcher: mysite
pathMatchers:
- name: mysite
defaultService: ${["home-backend"].id}
routeRules:
- matchRules:
- pathTemplateMatch: /xyzwebservices/v2/xyz/users/{username=*}/carts/{cartid=**}
service: ${["cart-backend"].id}
priority: 1
routeAction:
urlRewrite:
pathTemplateRewrite: /{username}-{cartid}/
- matchRules:
- pathTemplateMatch: /xyzwebservices/v2/xyz/users/*/accountinfo/*
service: ${["user-backend"].id}
priority: 2
home-backend:
type: gcp:compute:RegionBackendService
properties:
region: us-central1
name: home-service
portName: http
protocol: HTTP
timeoutSec: 10
loadBalancingScheme: EXTERNAL_MANAGED
healthChecks: ${default.id}
cart-backend:
type: gcp:compute:RegionBackendService
properties:
region: us-central1
name: cart-service
portName: http
protocol: HTTP
timeoutSec: 10
loadBalancingScheme: EXTERNAL_MANAGED
healthChecks: ${default.id}
user-backend:
type: gcp:compute:RegionBackendService
properties:
region: us-central1
name: user-service
portName: http
protocol: HTTP
timeoutSec: 10
loadBalancingScheme: EXTERNAL_MANAGED
healthChecks: ${default.id}
default:
type: gcp:compute:RegionHealthCheck
properties:
region: us-central1
name: health-check
checkIntervalSec: 1
timeoutSec: 1
httpHealthCheck:
port: 80
requestPath: /
The pathTemplateMatch property uses a template syntax with {variable=pattern} to capture path segments. Single asterisks match one segment; double asterisks match multiple segments. The pathTemplateRewrite property reconstructs URLs using captured variables, allowing you to transform API paths before sending them to backend services. The priority property ensures more specific templates match before generic ones.
Mirror a percentage of traffic for testing
Before fully migrating to a new backend, teams often mirror a percentage of production traffic to validate behavior without affecting user requests.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const _default = new gcp.compute.RegionHealthCheck("default", {
region: "us-central1",
name: "health-check",
httpHealthCheck: {
port: 80,
},
});
const home = new gcp.compute.RegionBackendService("home", {
region: "us-central1",
name: "home",
portName: "http",
protocol: "HTTP",
timeoutSec: 10,
loadBalancingScheme: "INTERNAL_MANAGED",
healthChecks: _default.id,
});
const mirror = new gcp.compute.RegionBackendService("mirror", {
region: "us-central1",
name: "mirror",
portName: "http",
protocol: "HTTP",
timeoutSec: 10,
loadBalancingScheme: "INTERNAL_MANAGED",
healthChecks: _default.id,
});
const regionurlmap = new gcp.compute.RegionUrlMap("regionurlmap", {
region: "us-central1",
name: "regionurlmap",
description: "Test for default route action mirror percent",
defaultService: home.id,
defaultRouteAction: {
requestMirrorPolicy: {
backendService: mirror.id,
mirrorPercent: 50,
},
},
hostRules: [{
hosts: ["mysite.com"],
pathMatcher: "allpaths",
}],
pathMatchers: [{
name: "allpaths",
defaultService: home.id,
}],
});
import pulumi
import pulumi_gcp as gcp
default = gcp.compute.RegionHealthCheck("default",
region="us-central1",
name="health-check",
http_health_check={
"port": 80,
})
home = gcp.compute.RegionBackendService("home",
region="us-central1",
name="home",
port_name="http",
protocol="HTTP",
timeout_sec=10,
load_balancing_scheme="INTERNAL_MANAGED",
health_checks=default.id)
mirror = gcp.compute.RegionBackendService("mirror",
region="us-central1",
name="mirror",
port_name="http",
protocol="HTTP",
timeout_sec=10,
load_balancing_scheme="INTERNAL_MANAGED",
health_checks=default.id)
regionurlmap = gcp.compute.RegionUrlMap("regionurlmap",
region="us-central1",
name="regionurlmap",
description="Test for default route action mirror percent",
default_service=home.id,
default_route_action={
"request_mirror_policy": {
"backend_service": mirror.id,
"mirror_percent": 50,
},
},
host_rules=[{
"hosts": ["mysite.com"],
"path_matcher": "allpaths",
}],
path_matchers=[{
"name": "allpaths",
"default_service": home.id,
}])
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_default, err := compute.NewRegionHealthCheck(ctx, "default", &compute.RegionHealthCheckArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("health-check"),
HttpHealthCheck: &compute.RegionHealthCheckHttpHealthCheckArgs{
Port: pulumi.Int(80),
},
})
if err != nil {
return err
}
home, err := compute.NewRegionBackendService(ctx, "home", &compute.RegionBackendServiceArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("home"),
PortName: pulumi.String("http"),
Protocol: pulumi.String("HTTP"),
TimeoutSec: pulumi.Int(10),
LoadBalancingScheme: pulumi.String("INTERNAL_MANAGED"),
HealthChecks: _default.ID(),
})
if err != nil {
return err
}
mirror, err := compute.NewRegionBackendService(ctx, "mirror", &compute.RegionBackendServiceArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("mirror"),
PortName: pulumi.String("http"),
Protocol: pulumi.String("HTTP"),
TimeoutSec: pulumi.Int(10),
LoadBalancingScheme: pulumi.String("INTERNAL_MANAGED"),
HealthChecks: _default.ID(),
})
if err != nil {
return err
}
_, err = compute.NewRegionUrlMap(ctx, "regionurlmap", &compute.RegionUrlMapArgs{
Region: pulumi.String("us-central1"),
Name: pulumi.String("regionurlmap"),
Description: pulumi.String("Test for default route action mirror percent"),
DefaultService: home.ID(),
DefaultRouteAction: &compute.RegionUrlMapDefaultRouteActionArgs{
RequestMirrorPolicy: &compute.RegionUrlMapDefaultRouteActionRequestMirrorPolicyArgs{
BackendService: mirror.ID(),
MirrorPercent: pulumi.Float64(50),
},
},
HostRules: compute.RegionUrlMapHostRuleArray{
&compute.RegionUrlMapHostRuleArgs{
Hosts: pulumi.StringArray{
pulumi.String("mysite.com"),
},
PathMatcher: pulumi.String("allpaths"),
},
},
PathMatchers: compute.RegionUrlMapPathMatcherArray{
&compute.RegionUrlMapPathMatcherArgs{
Name: pulumi.String("allpaths"),
DefaultService: home.ID(),
},
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var @default = new Gcp.Compute.RegionHealthCheck("default", new()
{
Region = "us-central1",
Name = "health-check",
HttpHealthCheck = new Gcp.Compute.Inputs.RegionHealthCheckHttpHealthCheckArgs
{
Port = 80,
},
});
var home = new Gcp.Compute.RegionBackendService("home", new()
{
Region = "us-central1",
Name = "home",
PortName = "http",
Protocol = "HTTP",
TimeoutSec = 10,
LoadBalancingScheme = "INTERNAL_MANAGED",
HealthChecks = @default.Id,
});
var mirror = new Gcp.Compute.RegionBackendService("mirror", new()
{
Region = "us-central1",
Name = "mirror",
PortName = "http",
Protocol = "HTTP",
TimeoutSec = 10,
LoadBalancingScheme = "INTERNAL_MANAGED",
HealthChecks = @default.Id,
});
var regionurlmap = new Gcp.Compute.RegionUrlMap("regionurlmap", new()
{
Region = "us-central1",
Name = "regionurlmap",
Description = "Test for default route action mirror percent",
DefaultService = home.Id,
DefaultRouteAction = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionArgs
{
RequestMirrorPolicy = new Gcp.Compute.Inputs.RegionUrlMapDefaultRouteActionRequestMirrorPolicyArgs
{
BackendService = mirror.Id,
MirrorPercent = 50,
},
},
HostRules = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapHostRuleArgs
{
Hosts = new[]
{
"mysite.com",
},
PathMatcher = "allpaths",
},
},
PathMatchers = new[]
{
new Gcp.Compute.Inputs.RegionUrlMapPathMatcherArgs
{
Name = "allpaths",
DefaultService = home.Id,
},
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.compute.RegionHealthCheck;
import com.pulumi.gcp.compute.RegionHealthCheckArgs;
import com.pulumi.gcp.compute.inputs.RegionHealthCheckHttpHealthCheckArgs;
import com.pulumi.gcp.compute.RegionBackendService;
import com.pulumi.gcp.compute.RegionBackendServiceArgs;
import com.pulumi.gcp.compute.RegionUrlMap;
import com.pulumi.gcp.compute.RegionUrlMapArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapDefaultRouteActionArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapDefaultRouteActionRequestMirrorPolicyArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapHostRuleArgs;
import com.pulumi.gcp.compute.inputs.RegionUrlMapPathMatcherArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var default_ = new RegionHealthCheck("default", RegionHealthCheckArgs.builder()
.region("us-central1")
.name("health-check")
.httpHealthCheck(RegionHealthCheckHttpHealthCheckArgs.builder()
.port(80)
.build())
.build());
var home = new RegionBackendService("home", RegionBackendServiceArgs.builder()
.region("us-central1")
.name("home")
.portName("http")
.protocol("HTTP")
.timeoutSec(10)
.loadBalancingScheme("INTERNAL_MANAGED")
.healthChecks(default_.id())
.build());
var mirror = new RegionBackendService("mirror", RegionBackendServiceArgs.builder()
.region("us-central1")
.name("mirror")
.portName("http")
.protocol("HTTP")
.timeoutSec(10)
.loadBalancingScheme("INTERNAL_MANAGED")
.healthChecks(default_.id())
.build());
var regionurlmap = new RegionUrlMap("regionurlmap", RegionUrlMapArgs.builder()
.region("us-central1")
.name("regionurlmap")
.description("Test for default route action mirror percent")
.defaultService(home.id())
.defaultRouteAction(RegionUrlMapDefaultRouteActionArgs.builder()
.requestMirrorPolicy(RegionUrlMapDefaultRouteActionRequestMirrorPolicyArgs.builder()
.backendService(mirror.id())
.mirrorPercent(50.0)
.build())
.build())
.hostRules(RegionUrlMapHostRuleArgs.builder()
.hosts("mysite.com")
.pathMatcher("allpaths")
.build())
.pathMatchers(RegionUrlMapPathMatcherArgs.builder()
.name("allpaths")
.defaultService(home.id())
.build())
.build());
}
}
resources:
regionurlmap:
type: gcp:compute:RegionUrlMap
properties:
region: us-central1
name: regionurlmap
description: Test for default route action mirror percent
defaultService: ${home.id}
defaultRouteAction:
requestMirrorPolicy:
backendService: ${mirror.id}
mirrorPercent: 50
hostRules:
- hosts:
- mysite.com
pathMatcher: allpaths
pathMatchers:
- name: allpaths
defaultService: ${home.id}
home:
type: gcp:compute:RegionBackendService
properties:
region: us-central1
name: home
portName: http
protocol: HTTP
timeoutSec: 10
loadBalancingScheme: INTERNAL_MANAGED
healthChecks: ${default.id}
mirror:
type: gcp:compute:RegionBackendService
properties:
region: us-central1
name: mirror
portName: http
protocol: HTTP
timeoutSec: 10
loadBalancingScheme: INTERNAL_MANAGED
healthChecks: ${default.id}
default:
type: gcp:compute:RegionHealthCheck
properties:
region: us-central1
name: health-check
httpHealthCheck:
port: 80
The requestMirrorPolicy sends copies of requests to a mirror backend service. The mirrorPercent property controls what percentage of traffic gets mirrored (0-100). Mirrored requests don’t affect the response sent to clients; they’re fire-and-forget copies used for testing and validation.
Beyond these examples
These snippets focus on specific URL map features: host and path-based routing, traffic management policies (retries, CORS, fault injection), advanced matching and URL rewriting, and traffic mirroring and splitting. They’re intentionally minimal rather than full load balancer deployments.
The examples reference pre-existing infrastructure such as RegionBackendService resources with health checks, and VPC networks and subnets for INTERNAL_MANAGED load balancers. They focus on configuring the URL map rather than provisioning the complete load balancing stack.
To keep things focused, common URL map patterns are omitted, including:
- URL redirects without backend services (defaultUrlRedirect)
- Header-based routing without path rules
- Test configurations (tests property for validation)
- Integration with target proxies and forwarding rules
These omissions are intentional: the goal is to illustrate how each URL map feature is wired, not provide drop-in load balancer modules. See the RegionUrlMap resource reference for all available configuration options.
Let's configure GCP Regional URL Maps
Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.
Try Pulumi Cloud for FREEFrequently Asked Questions
Routing Configuration
defaultService (routes to a single backend), defaultRouteAction (advanced routing with traffic splitting, retries, etc.), or defaultUrlRedirect (redirects to a different URL). Only one can be set.defaultService is specified, defaultRouteAction cannot contain weightedBackendServices. Conversely, if you use weightedBackendServices, you cannot specify defaultService.hostRules to match hosts, then pathMatchers with pathRules to route based on paths. Each pathRule specifies an array of paths and a backend service.Path & Host Matching
pathRules provide simple path-based routing with a paths array and service. routeRules offer advanced routing with priority, matchRules (supporting header/query matching), and routeAction for traffic splitting, retries, and more.pathTemplateMatch in matchRules with variables like {username=*} or {cartid=**}, then reference them in pathTemplateRewrite within urlRewrite.Advanced Traffic Management
weightedBackendServices in routeAction or defaultRouteAction, specifying a weight for each backend. Higher weights receive proportionally more traffic.retryPolicy in routeAction or defaultRouteAction, specifying numRetries, perTryTimeout, and retryConditions like 5xx or gateway-error.requestMirrorPolicy with backendService and optionally mirrorPercent to control the percentage of mirrored traffic (0-100).Header & URL Manipulation
headerAction with requestHeadersToAdds, requestHeadersToRemoves, responseHeadersToAdds, and responseHeadersToRemoves. Each add operation specifies headerName, headerValue, and replace.urlRewrite in routeAction or defaultRouteAction with hostRewrite and pathPrefixRewrite (or pathTemplateRewrite for template-based rewrites).urlRedirect in routeRules or defaultUrlRedirect, specifying hostRedirect, pathRedirect, redirectResponseCode, httpsRedirect, and stripQuery.Limitations & Constraints
headerAction is not supported for load balancers with loadBalancingScheme set to EXTERNAL. Use INTERNAL_MANAGED if you need header manipulation.defaultRouteAction has no effect when the URL map is bound to a target gRPC proxy with validateForProxyless set to true.urlRewrite action within defaultRouteAction. Other advanced routing features require different load balancer types.name must be 1-63 characters long and match the regex a-z? (lowercase letter, followed by lowercase letters, digits, or dashes, not ending with a dash). The name is immutable after creation.Using a different cloud?
Explore networking guides for other cloud providers: