Skip to content

Commit 244626a

Browse files
Added end-to-end external HTTP LB example with custom headers (#5183) (#3626)
Co-authored-by: Scott Suarez <[email protected]> Signed-off-by: Modular Magician <[email protected]> Co-authored-by: Scott Suarez <[email protected]>
1 parent 534738c commit 244626a

File tree

3 files changed

+338
-0
lines changed

3 files changed

+338
-0
lines changed

.changelog/5183.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
```release-note:none
2+
```

google-beta/resource_compute_global_forwarding_rule_generated_test.go

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,184 @@ import (
2323
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
2424
)
2525

26+
func TestAccComputeGlobalForwardingRule_externalHttpLbMigBackendCustomHeaderExample(t *testing.T) {
27+
t.Parallel()
28+
29+
context := map[string]interface{}{
30+
"random_suffix": randString(t, 10),
31+
}
32+
33+
vcrTest(t, resource.TestCase{
34+
PreCheck: func() { testAccPreCheck(t) },
35+
Providers: testAccProvidersOiCS,
36+
CheckDestroy: testAccCheckComputeGlobalForwardingRuleDestroyProducer(t),
37+
Steps: []resource.TestStep{
38+
{
39+
Config: testAccComputeGlobalForwardingRule_externalHttpLbMigBackendCustomHeaderExample(context),
40+
},
41+
{
42+
ResourceName: "google_compute_global_forwarding_rule.google_compute_global_forwarding_rule",
43+
ImportState: true,
44+
ImportStateVerify: true,
45+
ImportStateVerifyIgnore: []string{"network", "port_range", "target"},
46+
},
47+
},
48+
})
49+
}
50+
51+
func testAccComputeGlobalForwardingRule_externalHttpLbMigBackendCustomHeaderExample(context map[string]interface{}) string {
52+
return Nprintf(`
53+
# External HTTP load balancer with a CDN-enabled managed instance group backend
54+
# and custom request and response headers
55+
56+
# VPC
57+
resource "google_compute_network" "xlb_network" {
58+
name = "tf-test-l7-xlb-network%{random_suffix}"
59+
provider = google
60+
auto_create_subnetworks = false
61+
}
62+
63+
# backend subnet
64+
resource "google_compute_subnetwork" "xlb_subnet" {
65+
name = "tf-test-l7-xlb-subnet%{random_suffix}"
66+
provider = google
67+
ip_cidr_range = "10.0.1.0/24"
68+
region = "us-central1"
69+
network = google_compute_network.xlb_network.id
70+
}
71+
72+
# forwarding rule
73+
resource "google_compute_global_forwarding_rule" "google_compute_global_forwarding_rule" {
74+
name = "tf-test-l7-xlb-forwarding-rule%{random_suffix}"
75+
provider = google
76+
ip_protocol = "TCP"
77+
load_balancing_scheme = "EXTERNAL"
78+
port_range = "80"
79+
target = google_compute_target_http_proxy.default.id
80+
}
81+
82+
# http proxy
83+
resource "google_compute_target_http_proxy" "default" {
84+
name = "tf-test-l7-xlb-target-http-proxy%{random_suffix}"
85+
provider = google
86+
url_map = google_compute_url_map.default.id
87+
}
88+
89+
# url map
90+
resource "google_compute_url_map" "default" {
91+
name = "tf-test-l7-xlb-url-map%{random_suffix}"
92+
provider = google
93+
default_service = google_compute_backend_service.default.id
94+
}
95+
96+
# backend service with custom request and response headers
97+
resource "google_compute_backend_service" "default" {
98+
name = "tf-test-l7-xlb-backend-service%{random_suffix}"
99+
provider = google-beta
100+
protocol = "HTTP"
101+
port_name = "my-port"
102+
load_balancing_scheme = "EXTERNAL"
103+
timeout_sec = 10
104+
enable_cdn = true
105+
custom_request_headers = ["X-Client-Geo-Location: {client_region_subdivision}, {client_city}"]
106+
custom_response_headers = ["X-Cache-Hit: {cdn_cache_status}"]
107+
health_checks = [google_compute_health_check.default.id]
108+
backend {
109+
group = google_compute_instance_group_manager.mig.instance_group
110+
balancing_mode = "UTILIZATION"
111+
capacity_scaler = 1.0
112+
}
113+
}
114+
115+
# instance template
116+
resource "google_compute_instance_template" "instance_template" {
117+
name = "tf-test-l7-xlb-mig-template%{random_suffix}"
118+
provider = google
119+
machine_type = "e2-small"
120+
tags = ["allow-health-check"]
121+
122+
network_interface {
123+
network = google_compute_network.xlb_network.id
124+
subnetwork = google_compute_subnetwork.xlb_subnet.id
125+
access_config {
126+
# add external ip to fetch packages
127+
}
128+
}
129+
disk {
130+
source_image = "debian-cloud/debian-10"
131+
auto_delete = true
132+
boot = true
133+
}
134+
135+
# install nginx and serve a simple web page
136+
metadata = {
137+
startup-script = <<-EOF1
138+
#! /bin/bash
139+
set -euo pipefail
140+
141+
export DEBIAN_FRONTEND=noninteractive
142+
apt-get update
143+
apt-get install -y nginx-light jq
144+
145+
NAME=$(curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/hostname")
146+
IP=$(curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip")
147+
METADATA=$(curl -f -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=True" | jq 'del(.["startup-script"])')
148+
149+
cat <<EOF > /var/www/html/index.html
150+
<pre>
151+
Name: $NAME
152+
IP: $IP
153+
Metadata: $METADATA
154+
</pre>
155+
EOF
156+
EOF1
157+
}
158+
lifecycle {
159+
create_before_destroy = true
160+
}
161+
}
162+
163+
# health check
164+
resource "google_compute_health_check" "default" {
165+
name = "tf-test-l7-xlb-hc%{random_suffix}"
166+
provider = google
167+
http_health_check {
168+
port_specification = "USE_SERVING_PORT"
169+
}
170+
}
171+
172+
# MIG
173+
resource "google_compute_instance_group_manager" "mig" {
174+
name = "tf-test-l7-xlb-mig1%{random_suffix}"
175+
provider = google
176+
zone = "us-central1-c"
177+
named_port {
178+
name = "http"
179+
port = 8080
180+
}
181+
version {
182+
instance_template = google_compute_instance_template.instance_template.id
183+
name = "primary"
184+
}
185+
base_instance_name = "vm"
186+
target_size = 2
187+
}
188+
189+
# allow access from health check ranges
190+
resource "google_compute_firewall" "fw_health_check" {
191+
name = "tf-test-l7-xlb-fw-allow-hc%{random_suffix}"
192+
provider = google
193+
direction = "INGRESS"
194+
network = google_compute_network.xlb_network.id
195+
source_ranges = ["130.211.0.0/22", "35.191.0.0/16"]
196+
allow {
197+
protocol = "tcp"
198+
}
199+
target_tags = ["allow-health-check"]
200+
}
201+
`, context)
202+
}
203+
26204
func TestAccComputeGlobalForwardingRule_globalForwardingRuleHttpExample(t *testing.T) {
27205
t.Parallel()
28206

website/docs/r/compute_global_forwarding_rule.html.markdown

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,164 @@ https://cloud.google.com/compute/docs/load-balancing/http/
3232

3333

3434

35+
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
36+
<a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=external_http_lb_mig_backend_custom_header&cloudshell_image=gcr.io%2Fgraphite-cloud-shell-images%2Fterraform%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
37+
<img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
38+
</a>
39+
</div>
40+
## Example Usage - External Http Lb Mig Backend Custom Header
41+
42+
43+
```hcl
44+
# External HTTP load balancer with a CDN-enabled managed instance group backend
45+
# and custom request and response headers
46+
47+
# VPC
48+
resource "google_compute_network" "xlb_network" {
49+
name = "l7-xlb-network"
50+
provider = google
51+
auto_create_subnetworks = false
52+
}
53+
54+
# backend subnet
55+
resource "google_compute_subnetwork" "xlb_subnet" {
56+
name = "l7-xlb-subnet"
57+
provider = google
58+
ip_cidr_range = "10.0.1.0/24"
59+
region = "us-central1"
60+
network = google_compute_network.xlb_network.id
61+
}
62+
63+
# forwarding rule
64+
resource "google_compute_global_forwarding_rule" "google_compute_global_forwarding_rule" {
65+
name = "l7-xlb-forwarding-rule"
66+
provider = google
67+
ip_protocol = "TCP"
68+
load_balancing_scheme = "EXTERNAL"
69+
port_range = "80"
70+
target = google_compute_target_http_proxy.default.id
71+
}
72+
73+
# http proxy
74+
resource "google_compute_target_http_proxy" "default" {
75+
name = "l7-xlb-target-http-proxy"
76+
provider = google
77+
url_map = google_compute_url_map.default.id
78+
}
79+
80+
# url map
81+
resource "google_compute_url_map" "default" {
82+
name = "l7-xlb-url-map"
83+
provider = google
84+
default_service = google_compute_backend_service.default.id
85+
}
86+
87+
# backend service with custom request and response headers
88+
resource "google_compute_backend_service" "default" {
89+
name = "l7-xlb-backend-service"
90+
provider = google-beta
91+
protocol = "HTTP"
92+
port_name = "my-port"
93+
load_balancing_scheme = "EXTERNAL"
94+
timeout_sec = 10
95+
enable_cdn = true
96+
custom_request_headers = ["X-Client-Geo-Location: {client_region_subdivision}, {client_city}"]
97+
custom_response_headers = ["X-Cache-Hit: {cdn_cache_status}"]
98+
health_checks = [google_compute_health_check.default.id]
99+
backend {
100+
group = google_compute_instance_group_manager.mig.instance_group
101+
balancing_mode = "UTILIZATION"
102+
capacity_scaler = 1.0
103+
}
104+
}
105+
106+
# instance template
107+
resource "google_compute_instance_template" "instance_template" {
108+
name = "l7-xlb-mig-template"
109+
provider = google
110+
machine_type = "e2-small"
111+
tags = ["allow-health-check"]
112+
113+
network_interface {
114+
network = google_compute_network.xlb_network.id
115+
subnetwork = google_compute_subnetwork.xlb_subnet.id
116+
access_config {
117+
# add external ip to fetch packages
118+
}
119+
}
120+
disk {
121+
source_image = "debian-cloud/debian-10"
122+
auto_delete = true
123+
boot = true
124+
}
125+
126+
# install nginx and serve a simple web page
127+
metadata = {
128+
startup-script = <<-EOF1
129+
#! /bin/bash
130+
set -euo pipefail
131+
132+
export DEBIAN_FRONTEND=noninteractive
133+
apt-get update
134+
apt-get install -y nginx-light jq
135+
136+
NAME=$(curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/hostname")
137+
IP=$(curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip")
138+
METADATA=$(curl -f -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=True" | jq 'del(.["startup-script"])')
139+
140+
cat <<EOF > /var/www/html/index.html
141+
<pre>
142+
Name: $NAME
143+
IP: $IP
144+
Metadata: $METADATA
145+
</pre>
146+
EOF
147+
EOF1
148+
}
149+
lifecycle {
150+
create_before_destroy = true
151+
}
152+
}
153+
154+
# health check
155+
resource "google_compute_health_check" "default" {
156+
name = "l7-xlb-hc"
157+
provider = google
158+
http_health_check {
159+
port_specification = "USE_SERVING_PORT"
160+
}
161+
}
162+
163+
# MIG
164+
resource "google_compute_instance_group_manager" "mig" {
165+
name = "l7-xlb-mig1"
166+
provider = google
167+
zone = "us-central1-c"
168+
named_port {
169+
name = "http"
170+
port = 8080
171+
}
172+
version {
173+
instance_template = google_compute_instance_template.instance_template.id
174+
name = "primary"
175+
}
176+
base_instance_name = "vm"
177+
target_size = 2
178+
}
179+
180+
# allow access from health check ranges
181+
resource "google_compute_firewall" "fw_health_check" {
182+
name = "l7-xlb-fw-allow-hc"
183+
provider = google
184+
direction = "INGRESS"
185+
network = google_compute_network.xlb_network.id
186+
source_ranges = ["130.211.0.0/22", "35.191.0.0/16"]
187+
allow {
188+
protocol = "tcp"
189+
}
190+
target_tags = ["allow-health-check"]
191+
}
192+
```
35193
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
36194
<a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=global_forwarding_rule_http&cloudshell_image=gcr.io%2Fgraphite-cloud-shell-images%2Fterraform%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
37195
<img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">

0 commit comments

Comments
 (0)