对 Cloud Storage 存储桶设置全球外部 HTTP(S) 负载均衡器(经典版)

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本文档介绍如何创建外部 HTTP(S) 负载均衡器,以将针对静态内容的请求路由到 Cloud Storage 存储桶。使用后端存储桶配置负载均衡器后,对以 /love-to-fetch 开头的网址路径的请求会发送到 us-east1 Cloud Storage 存储桶,所有其他请求会发送到 europe-north1 Cloud Storage 存储桶(无论用户的区域如何)。

如果您的后端通过 HTTP(S) 提供动态内容,请考虑使用后端服务而不是后端存储桶。


如需在 Google Cloud 控制台中直接遵循有关此任务的分步指导,请点击操作演示

操作演示


将 Cloud Storage 存储桶用作负载均衡器后端

外部 HTTP(S) 负载均衡器使用网址映射将来自指定网址路径的流量定向到您的后端。

在下图中,负载均衡器将路径为 /love-to-fetch/ 的流量发送到 us-east1 区域的 Cloud Storage 存储桶。所有其他请求都会转到 europe-north1 区域的 Cloud Storage 存储桶。

负载均衡器将流量发送到 Cloud Storage 后端。
将流量分配到 Cloud Storage

默认情况下,Cloud Storage 使用 Cloud CDN 使用的同一缓存。如果您在后端存储桶上启用 Cloud CDN,则可以对内容使用 Cloud CDN 控件。Cloud CDN 控件包括缓存模式、签名网址和失效操作等。Cloud CDN 还允许您缓存大型内容(大于 10 MB)。如果您未在后端存储桶上启用 Cloud CDN,则只能使用源 Cache-Control 标头来控制由 Cloud Storage 元数据设置的较小内容的缓存。

准备工作

确保您的设置符合以下前提条件。如果您要使用 gcloudgsutil 实用程序,可以按照《快速入门:使用 gsutil 工具》文档中的说明安装这两个实用程序。

设置默认项目

控制台

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能

  4. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  5. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能

gcloud/gsutil

gcloud config set project PROJECT_ID

gsutil config set project PROJECT_ID

PROJECT_ID 替换为您在本指南中使用的项目。

Terraform

export GOOGLE_CLOUD_PROJECT=PROJECT_ID

权限

要按照本指南操作,您需要在项目中创建 Cloud Storage 存储桶和负载均衡器。您应该是项目的 Owner 或 Editor,或者应具有下列 Compute Engine IAM 角色

任务 所需角色
创建负载均衡器组件 Network Admin
创建 Cloud Storage 存储桶 Storage Object Admin

如需了解详情,请参阅以下指南:

设置 SSL 证书资源

对于 HTTPS 负载均衡器,按照以下文档中的说明创建 SSL 证书资源:

我们建议您使用 Google 管理的证书。

此示例假设您已有一个名为 www-ssl-cert 的 SSL 证书资源。

准备 Cloud Storage 存储桶和内容

准备 Cloud Storage 存储桶的过程如下所示:

  • 创建存储桶。

  • 将内容复制到存储桶。

  • 提供对存储桶的公开访问权限。

创建 Cloud Storage 存储桶

在此示例中,您将创建两个 Cloud Storage 存储桶以供负载均衡器访问。对于生产部署,我们建议您选择一个多区域存储桶,该存储桶会自动跨多个 Google Cloud 区域复制对象。这可以提高内容的可用性,并提高应用的故障容忍度。

记下您创建的 Cloud Storage 存储桶的名称,因为它们稍后会用到。在本指南中,它们被称为 BUCKET_1_NAMEBUCKET_2_NAME

控制台

  1. 在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。

    转到“Cloud Storage 存储桶”

  2. 点击创建存储桶

  3. 为存储桶命名框中,输入遵循命名准则的全局唯一名称。

  4. 点击选择数据存储位置

  5. 位置类型设置为区域

  6. 位置设置为 europe-north1。这是本指南中的 BUCKET_1_NAME

  7. 点击创建

  8. 点击存储桶以返回“Cloud Storage 存储桶”页面。按照上述说明创建第二个存储桶,但将位置设置为 us-east1。这是本指南中的 BUCKET_2_NAME

gcloud/gsutil

gsutil mb -p PROJECT_ID -c standard -l europe-north1 -b on gs://BUCKET_1_NAME
gsutil mb -p PROJECT_ID -c standard -l us-east1 -b on gs://BUCKET_2_NAME

BUCKET_1_NAMEBUCKET_2_NAME 替换为您要创建的存储桶的名称。

Terraform

如需创建存储桶,请使用 google_storage_bucket 资源

# Create Cloud Storage buckets
resource "random_id" "bucket_prefix" {
  byte_length = 8
}

resource "google_storage_bucket" "bucket_1" {
  name                        = "${random_id.bucket_prefix.hex}-bucket-1"
  location                    = "us-east1"
  uniform_bucket_level_access = true
  storage_class               = "STANDARD"
  // delete bucket and contents on destroy.
  force_destroy = true
}

resource "google_storage_bucket" "bucket_2" {
  name                        = "${random_id.bucket_prefix.hex}-bucket-2"
  location                    = "us-east1"
  uniform_bucket_level_access = true
  storage_class               = "STANDARD"
  // delete bucket and contents on destroy.
  force_destroy = true
}

如需了解如何应用或移除 Terraform 配置,请参阅使用 Terraform 配置

将内容转移到 Cloud Storage 存储桶

为了方便稍后测试设置,请将以下映像从公共 Cloud Storage 存储桶复制到您自己的 Cloud Storage 存储桶。

gcloud/gsutil

  1. 点击 激活 Cloud Shell

  2. 在 Cloud Shell 中运行以下命令,将存储桶名称变量替换为您的 Cloud Storage 存储桶名称:

gsutil cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET_1_NAME/never-fetch/
gsutil cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://BUCKET_2_NAME/love-to-fetch/

Terraform

如需将数据项复制到存储桶,您可以使用 google_storage_bucket_object 资源

resource "google_storage_bucket_object" "cat_image" {
  name         = "never-fetch/three-cats.jpg"
  source       = "images/three-cats.jpg"
  content_type = "image/jpeg"

  bucket = google_storage_bucket.bucket_1.name
}

resource "google_storage_bucket_object" "dog_image" {
  name         = "love-to-fetch/two-dogs.jpg"
  source       = "images/two-dogs.jpg"
  content_type = "image/jpeg"

  bucket = google_storage_bucket.bucket_2.name
}

或者,您也可以使用 null_resource 资源

resource "null_resource" "upload_cat_image" {
  provisioner "local-exec" {
    command = "gsutil cp -r gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://${google_storage_bucket.bucket_1.name}/never-fetch/"
  }
}

resource "null_resource" "upload_dog_image" {
  provisioner "local-exec" {
    command = "gsutil cp -r gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://${google_storage_bucket.bucket_2.name}/love-to-fetch/"
  }
}

在 Google Cloud 控制台中,点击每个存储桶的详情页面上的刷新,以验证文件是否已成功复制。

将 Cloud Storage 存储桶设为可公开读取

当您将 Cloud Storage 存储桶设为可公开读取时,互联网上的任何人都可以列出和查看其对象,并查看其元数据(不包括 ACL)。请勿在您的公共存储桶中包含敏感信息。

为了降低意外泄露敏感信息的可能性,不要将公开对象和敏感数据存储在同一个存储桶中。如需了解详情,请参阅建议的存储桶架构

控制台

要授予所有用户查看存储桶中对象的权限,请对每个存储桶重复执行以下过程:

  1. 在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。

    转到“Cloud Storage 存储桶”

  2. 点击相应存储桶名称,然后点击权限标签页。

  3. 点击添加

  4. 新的主帐号框中,输入 allUsers

  5. 选择角色框中,选择 Cloud Storage > Storage Object Viewer

  6. 点击保存

  7. 点击允许公开访问

gcloud/gsutil

要授予所有用户查看存储桶中对象的权限,请运行以下命令:

gsutil iam ch allUsers:objectViewer gs://BUCKET_1_NAME
gsutil iam ch allUsers:objectViewer gs://BUCKET_2_NAME

Terraform

如需授予所有用户查看存储桶中对象的权限,请使用 google_storage_bucket_iam_member 资源并指定 allUsers 成员。

# Make buckets public
resource "google_storage_bucket_iam_member" "bucket_1" {
  bucket = google_storage_bucket.bucket_1.name
  role   = "roles/storage.objectViewer"
  member = "allUsers"
}

resource "google_storage_bucket_iam_member" "bucket_2" {
  bucket = google_storage_bucket.bucket_2.name
  role   = "roles/storage.objectViewer"
  member = "allUsers"
}

保留外部 IP 地址

设置 Cloud Storage 存储桶后,您可以预留全球静态外部 IP 地址,以供受众群体用来访问您的负载均衡器。

此步骤是可选的,但建议执行,因为静态外部 IP 地址会提供单个地址以指向您的网域。

控制台

  1. 转到 Google Cloud Console 中的外部 IP 地址页面。

    转到“外部 IP 地址”

  2. 点击保留静态地址

  3. 名称框中,输入 example-ip

  4. 网络服务层级设置为优质

  5. IP 版本设置为 IPv4

  6. 类型设置为全局

  7. 点击预留

gcloud/gsutil

gcloud compute addresses create example-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

请记下预留的 IPv4 地址:

gcloud compute addresses describe example-ip \
    --format="get(address)" \
    --global

Terraform

如需预留外部 IP 地址,请使用 google_compute_global_address 资源

# Reserve IP address
resource "google_compute_global_address" "default" {
  name = "example-ip"
}

创建使用后端存储桶的外部 HTTP(S) 负载均衡器

以下说明介绍了如何创建 HTTP 或 HTTPS 负载均衡器。如需创建 HTTPS 负载均衡器,您必须向该负载均衡器的前端添加 SSL 证书资源。如需了解详情,请参阅 SSL 证书概览

控制台

开始配置

  1. 转到 Google Cloud Console 中的“负载均衡”页面。

    转到“负载均衡”

  2. 点击创建负载均衡器
  3. HTTP(S) 负载均衡卡片中,点击开始配置
  4. 面向互联网或仅限内部下,选择从互联网到我的虚拟机或无服务器服务
  5. 全球性或区域级下,选择全球 HTTP(S) 负载均衡器(传统版)
  6. 点击继续

配置后端

  1. 名称框中,输入 http-lb

  2. 点击后端配置

  3. 点击后端服务和后端存储桶框,然后点击创建后端存储桶

  4. 后端存储桶名称框中,输入 cats

  5. Cloud Storage 存储桶框中,点击浏览

  6. 选择 BUCKET_1_NAME,然后点击选择。如果先创建 cats 后端存储桶,该存储桶将成为默认存储桶,所有不匹配的流量请求都将定向到此处。您无法在负载均衡器中更改默认后端存储桶的重定向规则。

  7. 点击创建

  8. 使用相同的过程创建名为 dogs 的后端存储桶,然后选择 BUCKET_2_NAME

  9. 点击确定

配置主机和路径规则

主机规则和路径匹配器是外部 HTTP(S) 负载均衡器网址映射的配置组件。如需为此示例设置规则,请执行以下操作:

  1. 点击主机和路径规则

  2. 对于 dogs,在主机字段中输入 *,在路径字段中输入 /love-to-fetch/*

配置前端

  1. 点击前端配置

  2. 验证以下选项配置了这些值:

    属性 值(按照说明输入值或选择选项)
    协议 HTTP
    网络服务层级 优质
    IP 版本 IPv4
    IP 地址 example-ip
    端口 80

    如果您希望创建 HTTPS 负载均衡器而不是 HTTP 负载均衡器,则必须拥有 SSL 证书 (gcloud compute ssl-certificates list),并且必须按如下所示填写相关字段。

    属性 值(按照说明输入值或选择选项)
    协议 HTTP(S)
    网络服务层 优质
    IP 版本 IPv4
    IP 地址 example-ip
    端口 443
    选择证书或创建新证书
    (可选)启用从 HTTP 到 HTTPS 的重定向 使用此复选框可启用从端口 80 到端口 443 的重定向。

    启用此复选框会创建一个额外的部分 HTTP 负载均衡器,它使用与 HTTPS 负载均衡器相同的 IP 地址,并将 HTTP 请求重定向到负载均衡器的 HTTPS 前端。

    只有在选择 HTTPS 协议并使用预留的 IP 地址时,才能选中此复选框。

  3. 点击完成

检查配置

  1. 点击检查并最终确定

  2. 检查前端主机和路径规则以及后端存储桶

  3. 点击创建,然后等待负载均衡器完成创建。

  4. 点击负载均衡器的名称 (http-lb)。

  5. 请记下负载均衡器的 IP 地址,以备在下一个任务中使用。在本指南中,它称为 IP_ADDRESS

gcloud/gsutil

配置后端

gcloud compute backend-buckets create dogs \
    --gcs-bucket-name=BUCKET_1_NAME
gcloud compute backend-buckets create cats \
    --gcs-bucket-name=BUCKET_2_NAME

配置网址映射

gcloud compute url-maps create http-lb \
    --default-backend-bucket=cats
gcloud compute url-maps add-path-matcher http-lb \
    --path-matcher-name=path-matcher-2 \
    --new-hosts=* \
    --backend-bucket-path-rules="/love-to-fetch/*=dogs" \
    --default-backend-bucket=cats

配置目标代理

gcloud compute target-http-proxies create http-lb-proxy \
    --url-map=http-lb

配置转发规则

gcloud compute forwarding-rules create http-lb-forwarding-rule \
    --load-balancing-scheme=EXTERNAL \
    --network-tier=PREMIUM \
    --address=example-ip \
    --global \
    --target-http-proxy=http-lb-proxy \
    --ports=80

Terraform

如需创建负载均衡器,请使用以下 Terraform 资源。

配置后端

如需创建后端,请使用 google_compute_backend_bucket 资源

# Create LB backend buckets
resource "google_compute_backend_bucket" "bucket_1" {
  name        = "cats"
  description = "Contains cat image"
  bucket_name = google_storage_bucket.bucket_1.name
}

resource "google_compute_backend_bucket" "bucket_2" {
  name        = "dogs"
  description = "Contains dog image"
  bucket_name = google_storage_bucket.bucket_2.name
}

配置网址映射

如需创建网址映射,请使用 google_compute_url_map 资源

# Create url map
resource "google_compute_url_map" "default" {
  name = "http-lb"

  default_service = google_compute_backend_bucket.bucket_1.id

  host_rule {
    hosts        = ["*"]
    path_matcher = "path-matcher-2"
  }
  path_matcher {
    name            = "path-matcher-2"
    default_service = google_compute_backend_bucket.bucket_1.id

    path_rule {
      paths   = ["/love-to-fetch/*"]
      service = google_compute_backend_bucket.bucket_2.id
    }
  }
}

配置目标代理

如需创建目标 HTTP 代理,请使用 google_compute_target_http_proxy 资源

# Create HTTP target proxy
resource "google_compute_target_http_proxy" "default" {
  name    = "http-lb-proxy"
  url_map = google_compute_url_map.default.id
}

配置转发规则

如需创建转发规则,请使用 google_compute_global_forwarding_rule 资源

# Create forwarding rule
resource "google_compute_global_forwarding_rule" "default" {
  name                  = "http-lb-forwarding-rule"
  ip_protocol           = "TCP"
  load_balancing_scheme = "EXTERNAL_MANAGED"
  port_range            = "80"
  target                = google_compute_target_http_proxy.default.id
  ip_address            = google_compute_global_address.default.id
}

注意:如需将模式更改为全球外部 HTTP(S) 负载均衡器(经典版),请将 load_balancing_scheme 特性设置为 "EXTERNAL"(而不是 "EXTERNAL_MANAGED")。

如需了解如何应用或移除 Terraform 配置,请参阅使用 Terraform 配置

将流量发送到您的负载均衡器

配置负载均衡器的几分钟后,即可开始将流量发送到负载均衡器的 IP 地址。

控制台

在网络浏览器中,转到以下地址以测试负载均衡器,并将 IP_ADDRESS 替换为负载均衡器的 IP 地址

  • http://IP_ADDRESS/love-to-fetch/two-dogs.jpg

  • http://IP_ADDRESS/never-fetch/three-cats.jpg

如果您已设置 HTTP 负载均衡器,请确保您的浏览器不会自动重定向到 HTTPS。

gcloud/gsutil

使用 curl 命令测试以下网址的响应。将 IP_ADDRESS 替换为负载均衡器的 IPv4 地址

curl http://IP_ADDRESS/love-to-fetch/two-dogs.jpg
curl http://IP_ADDRESS/never-fetch/three-cats.jpg

限制