This document shows you how to create a regional internal Application Load Balancer to route requests for static content to Cloud Storage buckets.
Before you begin
Make sure that your setup meets the following prerequisites.
Install the Google Cloud CLI
Some of the instructions in this guide can only be carried out using the gcloud CLI. To install it, see Install the Google Cloud CLI.
You can find commands related to load balancing in the API and gcloud CLI references document.
Required roles
If you are the project creator, you are granted the
Owner role
(roles/owner). By default, the Owner role (roles/owner) or the
Editor role (roles/editor) includes the permissions necessary to follow this
document.
If you aren't the project creator, required permissions must be granted on the project to the appropriate principal. For example, a principal can be a Google Account (for end users) or a service account.
To get the permissions that you need to create Cloud Storage buckets and network resources, ask your administrator to grant you the following IAM roles on your project:
-
Create networks, subnets, and load balancer components:
Compute Network Admin (
roles/compute.networkAdmin) -
Add and remove firewall rules:
Compute Security Admin (
roles/compute.securityAdmin) -
Create Cloud Storage buckets:
Storage Object Admin (
roles/storage.objectAdmin)
For more information about granting roles, see Manage access to projects, folders, and organizations.
You might also be able to get the required permissions through custom roles or other predefined roles.
For more information about roles and permissions for Cloud Load Balancing, see Roles and permissions. For more information about defining IAM policies with conditional grants, see IAM Conditions for forwarding rules.
Set up an SSL certificate resource
For a regional internal Application Load Balancer that uses HTTPS as the request-and-response protocol, create an SSL certificate resource using Certificate Manager as described in one of the following documents:
- Deploy a regional Google-managed certificate issued by your CA Service instance
- Deploy a regional Google-managed certificate with DNS authorization
- Deploy a regional self-managed certificate
We recommend using a Google-managed certificate.
Limitations
The following limitations apply to Cloud Storage buckets when serving as backends to a regional internal Application Load Balancer:
Private bucket access isn't supported, so the backend bucket must be publicly accessible over the internet.
Signed URLs aren't supported.
Cloud CDN integration isn't available when creating backend buckets for a regional internal Application Load Balancer.
When using a regional internal Application Load Balancer to access backend buckets, only the HTTP
GETmethod is supported. You can download content from the bucket, but uploading content to the bucket through the regional internal Application Load Balancer isn't available.For a regional internal Application Load Balancer, Cloud Storage buckets are supported only in the region where the load balancer is configured. Dual-region or multi-region buckets aren't supported.
Setup overview
You can configure a regional internal Application Load Balancer in a region as shown in the following architecture diagram:
As shown in the architecture diagram, this example creates a
regional internal Application Load Balancer in a
Virtual Private Cloud (VPC) network with two backend buckets, where each backend
bucket references a Cloud Storage bucket. The Cloud Storage
buckets are located in the us-east1 region and you can balance the load of the
traffic between each bucket.
Configure the network and subnets
Within the VPC network, configure a subnet in the region,
us-east1 where the forwarding rule of your load balancers is to be configured.
In addition, configure a proxy-only subnet in the region, us-east1 in which
you want to configure the load balancer.
This example uses the following VPC network, region, and subnets:
Network. The network is a custom mode VPC network named
lb-network.Subnet for the load balancer. A subnet named
subnet-usin theus-east1region uses10.1.2.0/24for its primary IP range.Subnet for the Envoy proxy. A subnet named
proxy-only-subnet-usin theus-east1region that uses10.129.0.0/23for its primary IP range.
Configure the subnets for the load balancer's forwarding rule
Create a subnet in the same region where the forwarding rule of your load balancers is to be configured.
Console
In the Google Cloud console, go to the VPC networks page.
Click Create VPC network.
For Name, enter
lb-network.In the Subnets section, set the Subnet creation mode to Custom.
In the New subnet section, enter the following information:
- Name:
subnet-us - Select a Region:
us-east1 - IP address range:
10.1.2.0/24 - Click Done.
- Name:
Click Create.
gcloud
Create a custom VPC network, named
lb-network, with thegcloud compute networks createcommand.gcloud compute networks create lb-network --subnet-mode=custom
Create a subnet in the
lb-networkVPC network in theus-east1region with thegcloud compute networks subnets createcommand.gcloud compute networks subnets create subnet-us \ --network=lb-network \ --range=10.1.2.0/24 \ --region=us-east1
Configure the proxy-only subnets
A proxy-only subnet provides a set of IP addresses that Google Cloud uses to run Envoy proxies on your behalf. The proxies end connections from the client and create connections to the backends.
This proxy-only subnet is used by all Envoy-based regional load balancers in the
same region as the VPC network. There can only be one active
proxy-only subnet for a given purpose, per region, per network.
In this example, we create a proxy-only subnet in the us-east1 region.
Console
In the Google Cloud console, go to the VPC networks page.
Click the name of the VPC network that you created.
On the Subnet tab, click Add subnet.
Enter the following information:
- For Name, enter
proxy-only-subnet-us. - For Region, enter
us-east1. - For Purpose, select Regional Managed Proxy.
- For IP address range, enter
10.129.0.0/23.
- For Name, enter
Click Add.
gcloud
Create a proxy-only subnet in the
us-east1region with thegcloud compute networks subnets createcommand.gcloud compute networks subnets create proxy-only-subnet-us \ --purpose=REGIONAL_MANAGED_PROXY \ --role=ACTIVE \ --region=us-east1 \ --network=lb-network \ --range=10.129.0.0/23
Configure a firewall rule
This example uses an ingress firewall rule, fw-allow-ssh that allows SSH
access on port 22 to the client VM.
Console
In the Google Cloud console, go to the Firewall policies page.
Click Create firewall rule to create the rule to allow incoming SSH connections on the client VM:
In the Create a firewall rule page, enter the following information:
- Name:
fw-allow-ssh - Network:
lb-network - Direction of traffic: Ingress
- Action on match: Allow
- Targets: Specified target tags
- Target tags:
allow-ssh - Source filter: IPv4 ranges
- Source IPv4 ranges:
0.0.0.0/0 - Protocols and ports:
- Choose Specified protocols and ports.
- Select the TCP checkbox, and then enter
22for the port number.
- Name:
Click Create.
gcloud
Create the
fw-allow-sshfirewall rule to allow SSH connectivity to VMs with the network tagallow-ssh. When you omit--source-ranges, Google Cloud interprets the rule to mean any source.gcloud compute firewall-rules create fw-allow-ssh \ --network=lb-network \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --rules=tcp:22
Configure your Cloud Storage buckets
The process for configuring your Cloud Storage buckets is as follows:
- Create the buckets.
- Copy content to the buckets.
- Make the buckets publicly readable.
Create Cloud Storage buckets
In this example, you create two Cloud Storage buckets in the
us-east1 region.
Console
- In the Google Cloud console, go to the Cloud Storage Buckets page.
Click Create.
In the Get started section, enter a globally unique name that follows the naming guidelines.
Click Choose where to store your data.
Set Location type to Region.
From the list of regions, select us-east1.
Click Create.
Click Buckets to return to the Cloud Storage Buckets page. Use the preceding instructions to create a second bucket, in the same region, us-east1.
gcloud
Create the buckets in the
us-east1region with thegcloud storage buckets createcommand.gcloud storage buckets create gs://BUCKET1_NAME \ --default-storage-class=standard \ --location=us-east1 \ --uniform-bucket-level-accessgcloud storage buckets create gs://BUCKET2_NAME \ --default-storage-class=standard \ --location=us-east1 \ --uniform-bucket-level-accessReplace
BUCKET1_NAMEandBUCKET2_NAMEwith your Cloud Storage bucket names.
Copy graphic files to your Cloud Storage buckets
To enable you to test the setup, copy a graphic file from a public Cloud Storage bucket to your own Cloud Storage buckets.
gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET1_NAME/love-to-purr/
gcloud storage cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://BUCKET2_NAME/love-to-fetch/
Make your Cloud Storage buckets publicly readable
To make all objects in a bucket readable to everyone on the public internet,
grant the principal allUsers the Storage Object Viewer role
(roles/storage.objectViewer).
Console
To grant all users access to view objects in your buckets, repeat the following procedure for each bucket:
- In the Google Cloud console, go to the Cloud Storage Buckets page.
In the list of buckets, select the checkbox for each bucket that you want to make public.
Click the Permissions button. The Permissions dialog appears.
In the Permissions dialog, click the Add principal button. The Grant access dialog appears.
In the New principals field, enter
allUsers.In the Select a role field, enter
Storage Object Viewerin the filter box and select the Storage Object Viewer from the filtered results.Click Save.
Click Allow public access.
gcloud
To grant all users access to view objects in your buckets, run the buckets add-iam-policy-binding command.
gcloud storage buckets add-iam-policy-binding gs://BUCKET1_NAME \
--member=allUsers \
--role=roles/storage.objectViewergcloud storage buckets add-iam-policy-binding gs://BUCKET2_NAME \
--member=allUsers \
--role=roles/storage.objectViewerReserve a static internal IP address
Reserve a static internal IPv4 address for the forwarding rule of the load balancer. For more information, see Reserve a static internal IP address.
Console
In the Google Cloud console, go to the Reserve internal static IP address page.
In the Name field, enter a name for the new address.
In the IP version list, select IPv4.
In the Network list, select lb-network.
In the Subnetwork list, select subnet-us.
For Region, select us-east1.
In the Static IP address list, select Assign automatically. After you create the load balancer, this IP address is attached to the load balancer's forwarding rule.
Click Reserve to reserve the IP address.
gcloud
To reserve a static external IP address, use the
gcloud compute addresses createcommand.gcloud compute addresses create ADDRESS_NAME \ --region=us-east1 \ --subnet=subnet-usReplace
ADDRESS_NAMEwith the name for the new address.To view the information about the address, use the
gcloud compute addresses describecommand.gcloud compute addresses describe ADDRESS_NAME
Copy the returned IP address to use as
RESERVED_IP_ADDRESSin the following section.
Configure the load balancer with backend buckets
This section shows you how to create the following resources for a regional internal Application Load Balancer:
- Two backend buckets. The backend buckets serve as a wrapper to the Cloud Storage buckets that you created earlier.
- URL map
- Target proxy
- A forwarding rule with regional IP addresses. The forwarding rule is assigned an IP address from the subnet created for the load balancer's forwarding rules. If you try to assign an IP address to the forwarding rule from the proxy-only subnet, the forwarding rule creation fails.
In this example, you can use HTTP or HTTPS as the request-and-response protocol between the client and the load balancer. To create an HTTPS load balancer, you must add an SSL certificate resource to the load balancer's frontend.
To create the previously mentioned load balancing components using the gcloud CLI, follow these steps:
Create two backend buckets in the
us-east1region with thegcloud beta compute backend-buckets createcommand. The backend buckets have a load balancing scheme ofINTERNAL_MANAGED.gcloud beta compute backend-buckets create backend-bucket-cats \ --gcs-bucket-name=BUCKET1_NAME \ --load-balancing-scheme=INTERNAL_MANAGED \ --region=us-east1gcloud beta compute backend-buckets create backend-bucket-dogs \ --gcs-bucket-name=BUCKET2_NAME \ --load-balancing-scheme=INTERNAL_MANAGED \ --region=us-east1Create a URL map to route incoming requests to the backend bucket with the
gcloud beta compute url-maps createcommand.gcloud beta compute url-maps create lb-map \ --default-backend-bucket=backend-bucket-cats \ --region=us-east1Configure the host and path rules of the URL map with the
gcloud beta compute url-maps add-path-matchercommand.In this example, the default backend bucket is
backend-bucket-cats, which handles all the paths that exist within it. However, any request targetinghttp://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpguses thebackend-bucket-dogsbackend. For example, if the/love-to-fetch/folder also exists within your default backend (backend-bucket-cats), the load balancer prioritizes thebackend-bucket-dogsbackend because there is a specific path rule for/love-to-fetch/*.gcloud beta compute url-maps add-path-matcher lb-map \ --path-matcher-name=path-matcher-pets \ --new-hosts=* \ --backend-bucket-path-rules="/love-to-fetch/*=backend-bucket-dogs" \ --default-backend-bucket=backend-bucket-cats \ --region=us-east1Create a target proxy with the
gcloud compute target-http-proxies createcommand.For HTTP traffic, create a target HTTP proxy to route requests to the URL map:
gcloud compute target-http-proxies create http-proxy \ --url-map=lb-map \ --region=us-east1For HTTPS traffic, create a target HTTPS proxy to route requests to the URL map. The proxy is the part of the load balancer that holds the SSL certificate for an HTTPS load balancer. After you create the certificate, you can attach the certificate to the HTTPS target proxy.
gcloud compute target-https-proxies create https-proxy \ --url-map=lb-map \ --certificate-manager-certificates=CERTIFICATE_NAME \ --region=us-east1Replace
CERTIFICATE_NAMEwith the name of the SSL certificate you created using Certificate Manager.Create a forwarding rule with an IP address in the
us-east1region with thegcloud compute forwarding-rules createcommand.Reserving an IP address is optional for an HTTP forwarding rule; however, you need to reserve an IP address for an HTTPS forwarding rule.
In this example, an ephemeral IP address is associated with your load balancer's HTTP forwarding rule. An ephemeral IP address remains constant while the forwarding rule exists. If you need to delete the forwarding rule and recreate it, the forwarding rule might receive a new IP address.
For HTTP traffic, create the forwarding rules to route incoming requests to the HTTP target proxy:
gcloud compute forwarding-rules create http-fw-rule-1 \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=lb-network \ --subnet=subnet-us \ --subnet-region=us-east1 \ --ports=80 \ --target-http-proxy=http-proxy \ --target-http-proxy-region=us-east1 \ --region=us-east1For HTTPS traffic, create the global forwarding rules to route incoming requests to the HTTPS target proxy:
gcloud compute forwarding-rules create https-fw-rule-1 \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=lb-network \ --subnet=subnet-us \ --subnet-region=us-east1 \ --address=RESERVED_IP_ADDRESS \ --ports=443 \ --target-https-proxy=https-proxy \ --target-http-proxy-region=us-east1 \ --region=us-east1Replace
RESERVED_IP_ADDRESSwith the name of the address you copied in the Reserve a static internal IP address section.
Send an HTTP request to the load balancer
Send a request from an internal client VM to the forwarding rule of the load balancer.
Get the IP address of the load balancer's forwarding rule
Get the IP address of the load balancer's forwarding rule (http-fw-rule-1)
in the us-east1 region to make an HTTP request to the virtual IP address (VIP)
in the region using curl.
gcloud compute forwarding-rules describe http-fw-rule-1 \
--region=us-east1
Copy the returned IP address to use as
FORWARDING_RULE_IP_ADDRESS in the next step.
Create a client VM to test connectivity
Create a client VM and send an HTTP request to the VIPs in the VPC network. The client VM can be in any zone in the same region as the load balancer, and it can use any subnet in the same VPC network. In this example, you create the client VM in the same subnet as the load balancer's forwarding rule.
Create a client VM in the
us-east1region.gcloud compute instances create client-a \ --image-family=debian-12 \ --image-project=debian-cloud \ --network=lb-network \ --subnet=subnet-us \ --zone=us-east1-c \ --tags=allow-sshEstablish an SSH connection to the client VM.
gcloud compute ssh client-a --zone=us-east1-c
In this example, the regional internal Application Load Balancer has a frontend VIP in the
us-east1region in the VPC network. Make an HTTP request to the VIP in that region by using curl.curl http://FORWARDING_RULE_IP_ADDRESS/love-to-purr/three-cats.jpg --output three-cats.jpg
curl http://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpg --output two-dogs.jpg
Replace
FORWARDING_RULE_IP_ADDRESSwith the IP address you copied in the Get the IP address of the load balancer's forwarding rule section.
What's next
- Internal Application Load Balancer overview
- Proxy-only subnets for Envoy-based load balancers
- Manage certificates
- Clean up a load balancing setup