对 Cloud Storage 存储桶设置全球外部应用负载均衡器

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

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

如果您是传统版应用负载均衡器的现有用户,则在规划使用全球外部应用负载均衡器的新部署时,请确保查看规划向全球外部应用负载均衡器的迁移

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

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

在下图中,负载均衡器将路径为 /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 元数据设置的较小内容的缓存。

准备工作

确保您的设置符合以下前提条件。如果您使用的是 gcloud storage 实用程序,则可以按照使用 gcloud 工具发现对象存储空间中的说明进行安装。

设置默认项目

控制台

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

gcloud

gcloud 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

gcloud storage buckets create gs://BUCKET_1_NAME --project=PROJECT_ID --default-storage-class=standard --location=europe-north1 --uniform-bucket-level-access
gcloud storage buckets create gs://BUCKET_2_NAME --project=PROJECT_ID --default-storage-class=standard --location=us-east1 --uniform-bucket-level-access

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

  1. 点击 激活 Cloud Shell

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

gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET_1_NAME/never-fetch/
gcloud storage 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 = "gcloud storage cp 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 = "gcloud storage cp 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

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

gcloud storage buckets add-iam-policy-binding gs://BUCKET_1_NAME --member=allUsers --role=roles/storage.objectViewer
gcloud storage buckets add-iam-policy-binding gs://BUCKET_2_NAME --member=allUsers --role=roles/storage.objectViewer

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 控制台中,转到外部 IP 地址页面。

    转到“外部 IP 地址”

  2. 点击保留静态地址

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

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

  5. IP 版本设置为 IPv4

  6. 类型设置为全局

  7. 点击预留

gcloud

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 或 HTTPS 负载均衡器。如需创建 HTTPS 负载均衡器,您必须向该负载均衡器的前端添加 SSL 证书资源。如需了解详情,请参阅 SSL 证书概览

控制台

开始配置

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击创建负载均衡器
  3. 负载均衡器的类型字段中,选择应用负载均衡器 (HTTP/HTTPS),然后点击下一步
  4. 公共或内部字段中,选择公共(外部),然后点击下一步
  5. 全球或单个区域部署字段中,选择最适合全球性工作负载,然后点击下一步
  6. 负载均衡器世代字段中,选择全球外部应用负载均衡器,然后点击下一步
  7. 点击配置

基本配置

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

配置后端

  1. 点击后端配置

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

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

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

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

  6. 点击创建

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

  8. 点击确定

配置路由规则

路由规则决定了流量的定向方式。如需配置路由,您需要设置主机规则和路径匹配器,即外部应用负载均衡器网址映射的配置组件。如需为此示例设置规则,请执行以下操作:

  1. 点击路由规则
  2. 对于 dogs,在主机字段中输入 *,在路径字段中输入 /love-to-fetch/*

配置前端

  1. 点击前端配置

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

    属性 值(按照说明输入值或选择选项)
    协议 HTTP
    网络服务层级 高级
    IP 版本 IPv4
    IP 地址 example-ip
    端口 80
    可选:HTTP keepalive 超时 输入 5 到 1200 秒的超时值。默认值为 610 秒。

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

    属性 值(按照说明输入值或选择选项)
    协议 HTTP(S)
    网络服务层级 优质
    IP 版本 IPv4
    IP 地址 example-ip
    端口 443
    可选:HTTP keepalive 超时 输入 5 到 1200 秒的超时值。默认值为 610 秒。
    证书 选择您在设置 SSL 证书资源部分创建的 www-ssl-cert 证书,或创建新证书。
    可选:启用从 HTTP 到 HTTPS 的重定向 使用此复选框可启用重定向。

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

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

  3. 点击完成

检查配置

  1. 点击检查并最终确定

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

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

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

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

gcloud

配置后端

gcloud compute backend-buckets create cats \
  --gcs-bucket-name=BUCKET_1_NAME
gcloud compute backend-buckets create dogs \
  --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 \
  --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
  --url-map=http-lb

HTTP_KEEP_ALIVE_TIMEOUT_SEC 替换为 5 到 1,200 秒之间的客户端 HTTP keepalive 超时值。默认值为 610 秒。此字段是可选字段。

配置转发规则

gcloud compute forwarding-rules create http-lb-forwarding-rule \
  --load-balancing-scheme=EXTERNAL_MANAGED \
  --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
}

注意:如需将模式更改为传统版应用负载均衡器,请将 load_balancing_scheme 属性设置为 "EXTERNAL",而不是 "EXTERNAL_MANAGED"

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

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

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

控制台

不支持 Google Cloud 控制台。

gcloud

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

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

其他配置

本部分对配置示例进行了扩展,以提供一些额外的替代配置选项。所有任务均为可选任务。您可以按任意顺序执行这些任务。

更新客户端 HTTP keepalive 超时

前面步骤中创建的负载均衡器已配置客户端 HTTP keepalive 超时的默认值。如需更新客户端 HTTP keepalive 超时,请按照以下说明操作。

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击要修改的负载均衡器的名称。
  3. 点击修改
  4. 点击前端配置
  5. 展开高级功能。对于 HTTP keepalive 超时,请输入 5 到 1,200 秒的超时值。
  6. 点击更新
  7. 如需查看更改,请点击查看并最终确定,然后点击更新

gcloud

对于 HTTP 负载均衡器,请使用 gcloud compute target-http-proxies update 命令更新目标 HTTP 代理:

    gcloud compute target-http-proxies update TARGET_HTTP_PROXY_NAME \
        --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
        --global
    

对于 HTTPS 负载均衡器,请使用 gcloud compute target-https-proxies update 命令更新目标 HTTPS 代理:

    gcloud compute target-https-proxies update TARGET_HTTPS_PROXY_NAME \
        --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
        --global
    

请替换以下内容:

  • TARGET_HTTP_PROXY_NAME:目标 HTTP 代理的名称。
  • TARGET_HTTPS_PROXY_NAME:目标 HTTPS 代理的名称。
  • HTTP_KEEP_ALIVE_TIMEOUT_SEC:HTTP keepalive 超时值(5 到 1200 秒)。

限制

  • 只有全球外部应用负载均衡器和传统版应用负载均衡器支持后端存储桶。区域级外部应用负载均衡器或任何其他负载均衡器类型不支持后端存储桶。
  • Identity-Aware Proxy 不支持后端存储桶。
  • 全局外部应用负载均衡器不支持上传到 Cloud Storage 存储桶。

后续步骤