Cloud CDN:回源、缓存与失效
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
通过支持的 ALB 后端缓存内容;访问地址就是 ALB 域名 / IP + 对象路径。
推荐做法#
- 只缓存明确可共享的内容;静态资源用 hash 文件名长缓存,HTML 配置较短 TTL。
- Bucket 可保持私有,用 Private bucket access 授权回源;受限访客再考虑 signed URL/cookie。
- 用请求日志的 cacheHit 和缓存头确认命中,用新对象验证真正回源。
常用操作#
替换为实际资源;本段不依赖 lab.env。
PROJECT_ID='REPLACE_PROJECT_ID'
URL_MAP='REPLACE_URL_MAP'
CACHE_PATH='REPLACE_CACHE_PATH'
gcloud compute url-maps describe "$URL_MAP" --project="$PROJECT_ID" --global
# 需要更新缓存时执行;CACHE_PATH 使用 /asset.txt 等路径。
gcloud compute url-maps invalidate-cdn-cache "$URL_MAP" \
--project="$PROJECT_ID" --path="$CACHE_PATH"容易踩的坑#
私有 Bucket 不等于 CDN 访客必须登录。 Private bucket access 解决回源授权;需要限制访客时,另配 signed URL/cookie 等访问控制。
- 不要对订单、账号数据盲用 FORCE_CACHE_ALL;删除 Cloud Run / Bucket 不会回收整套 ALB。
配置说明与完整示例(按需展开)
对应 CloudFront 的部分用途。Cloud CDN 基于负载均衡器的后端缓存;DNS 不负责缓存内容。前置:环境篇,Compute LB 与 Storage 管理权限。
公共静态桶与入口#
本节 public Bucket 只放合成公开内容,不复用订单归档桶。不允许公开 Bucket 时使用下文 Private bucket access;signed URL 则用于访客授权。
source lab.env
gcloud services enable compute.googleapis.com storage.googleapis.com
export CDN_BUCKET="${PROJECT_ID}-cdn-lab"
gcloud storage buckets create "gs://$CDN_BUCKET" --location="$REGION" --uniform-bucket-level-access
gcloud storage buckets add-iam-policy-binding "gs://$CDN_BUCKET" --member=allUsers --role=roles/storage.objectViewer
printf 'asset version 1\n' > asset.txt
gcloud storage cp asset.txt "gs://$CDN_BUCKET/asset.txt"
gcloud storage objects update "gs://$CDN_BUCKET/asset.txt" --cache-control='public,max-age=300'
gcloud compute backend-buckets create lab-cdn-backend --gcs-bucket-name="$CDN_BUCKET" --enable-cdn --global
gcloud compute url-maps create lab-cdn-map --default-backend-bucket=lab-cdn-backend --global
gcloud compute target-http-proxies create lab-cdn-http --url-map=lab-cdn-map --global
gcloud compute addresses create lab-cdn-ip --global
gcloud compute forwarding-rules create lab-cdn-rule --global --load-balancing-scheme=EXTERNAL_MANAGED --address=lab-cdn-ip --target-http-proxy=lab-cdn-http --ports=80
export CDN_IP=$(gcloud compute addresses describe lab-cdn-ip --global --format='value(address)')
curl -i "http://$CDN_IP/asset.txt"
curl -i "http://$CDN_IP/asset.txt"验收:返回 v1;观察 Age,并在 LB 请求日志查看 httpRequest.cacheHit。不要只凭第二次更快就认定命中。HTTP 仅用于公开文本实验,正式域名使用 HTTPS。后端桶与 CDN
访问 URL 与 Private bucket access#
本例文件地址是 http://$CDN_IP/asset.txt,路径是 Bucket 中的 object name,URL 中不加 Bucket 名。域名入口需要 DNS 指向 ALB,并为 HTTPS 配置有效证书。Cloud CDN 没有另外一条独立于 ALB 的访问域名。
Private bucket access 可以保留 Cloud Storage Bucket 私有,并允许 ALB/Cloud CDN 回源,无须为这种回源方式强制使用 signed URL。先创建 Backend bucket,取得其所属 Project 的数字编号,然后在源 Bucket 授权:
export PROJECT_NUMBER=$(gcloud projects describe "$PROJECT_ID" --format='value(projectNumber)')
gcloud storage buckets add-iam-policy-binding "gs://$CDN_BUCKET" \
--member="serviceAccount:service-$PROJECT_NUMBER@https-lb.iam.gserviceaccount.com" \
--role=roles/storage.objectViewer该 service identity 在 Project 首次创建 Backend bucket 后才可用。选择私有回源时,不执行上面的 allUsers 授权;若从本篇 public 实验切换,需移除原 allUsers binding,并验证匿名直连 Bucket 被拒绝、ALB 访问可用。缓存命中可能掩盖回源错误,用新上传的对象验证,并按需求配置 cache mode / TTL。
Bucket 私有不等于 CDN URL 要求访客登录。会员或受限内容另设计 signed URLs / signed cookies。不要把这里的 https-lb service identity 与 signed URL 方案中的 cloud-cdn-fill service account 混用。Private bucket access、Bucket 权限与缓存配置
修改、失效与版本化#
printf 'asset version 2\n' > asset.txt
gcloud storage cp asset.txt "gs://$CDN_BUCKET/asset.txt"
gcloud storage objects update "gs://$CDN_BUCKET/asset.txt" --cache-control='public,max-age=300'
# 边缘可能仍返回旧版
gcloud compute url-maps invalidate-cdn-cache lab-cdn-map --path=/asset.txt --global
curl --fail "http://$CDN_IP/asset.txt"等待失效完成后应为 v2。生产静态资源优先 app.<hash>.js 长缓存;HTML 短缓存。订单、账号信息和带权限的数据不应放进这个公共后端桶,也不要随意对动态 API 使用 FORCE_CACHE_ALL。缓存失效
清理#
gcloud compute forwarding-rules delete lab-cdn-rule --global
gcloud compute target-http-proxies delete lab-cdn-http --global
gcloud compute url-maps delete lab-cdn-map --global
gcloud compute backend-buckets delete lab-cdn-backend --global
gcloud compute addresses delete lab-cdn-ip --global
gcloud storage rm --recursive "gs://$CDN_BUCKET"
rm asset.txtLB、缓存填充、缓存出站、存储分别核对费用。公共桶也能绕过 CDN 被直接读取;这不是私有源站保护实验。