我在马路边捡到一分钱

目录

花了将近 1 小时,省下了每月不到 1 块钱的云服务费用。值吗?不值。但搞清楚这件事的过程,值。


先说那一分钱从哪来

GCP 流量计费

我在 Google Cloud Run 上跑了一个小服务。某天翻 GCP 账单,看到一笔流量费——数据传出到中国大陆(不含香港)的单价是 $0.23/GiB,而且没有免费额度。

GCP 的流量出口按目的地定价:

目的地 单价(美元/GiB)
中国大陆(不含香港) $0.23
其他亚太地区 $0.12
北美/欧洲 $0.08

服务的用户基本都在国内,流量全往中国大陆走,每个 GiB 都按最贵的标准计费。用量不大,但看着那个单价就来气。


想到的解法:Cloudflare 套一层

我的域名 DNS 已经托管在 Cloudflare。CF 有橙云代理模式,开启后流量先经过 CF 节点再到源站。

关键点:GCP 看到的流量出口不再是用户的 IP,而是 Cloudflare 的节点 IP。 CF 的节点遍布全球,不会被 GCP 认定为中国大陆方向的流量,自然就不按 $0.23/GiB 计费了。

而且 Cloudflare 免费,还顺带白嫖了 CDN 缓存和 DDoS 防护。


折腾过程

第一步:在 GCP 绑定自定义域名

Cloud Run 不支持直接 CNAME 到 xxx.run.app,必须先在 GCP 侧做域名映射。

Cloud Run 控制台 → 选择你的服务 → 管理自定义域名 → 添加映射,输入子域名(如 api.yourdomain.com)。

GCP 会给你一个 CNAME 目标:ghs.googlehosted.com。

第二步:关掉默认 HTTPS 端点

这里有个坑:Cloud Run 服务默认开启了「默认 HTTPS 端点网址」,会导致 GCP 无法完成自定义域名的证书认证。

需要在 Cloud Run 服务设置里,把默认 HTTPS 端点关掉,否则证书一直卡在 Waiting for certificate provisioning。

第三步:Cloudflare 添加 CNAME,先用灰云

类型: CNAME
名称: api
目标: ghs.googlehosted.com
代理状态: 灰云(DNS Only)← 必须先关闭代理

必须先用灰云——GCP 签发 SSL 证书时需要直接访问你的域名做 ACME 验证,Cloudflare 橙云代理会拦截这个过程,导致证书永远签不下来。

Cloudflare DNS 配置

第四步:等证书签发

GCP 控制台显示 Waiting for certificate provisioning,等就行了,通常 15 分钟到 1 小时。

用国内 DNS 确认解析是否生效:

dig CNAME api.yourdomain.com +short @114.114.114.114

返回 ghs.googlehosted.com.,IP 是 Google 地址段(142.250.x.x)说明 DNS 正常。

证书好了之后测试一下:

curl -v --resolve api.yourdomain.com:443:142.250.198.83 https://api.yourdomain.com

看到 SSL certificate verify ok 和 HTTP/2 200 就完成了。

第五步:切回橙云,SSL 设为 Full

Cloudflare DNS → 把灰云切换为橙云(Proxied)。

SSL/TLS → Overview → 模式改为 Full。

注意:

  • Flexible 必定触发 ERR_TOO_MANY_REDIRECTS,CF 到 GCP 用 HTTP,GCP 强制跳 HTTPS,无限循环
  • Full Strict 有时候也会出问题
  • Full 是正确选项

总结

整个流程卡了将近 1 小时,两个主要坑:

  1. 没关默认 HTTPS 端点 —— 导致证书一直 Waiting
  2. SSL 模式设成了 Flexible —— 切橙云后立刻 ERR_TOO_MANY_REDIRECTS

一句话总结:关掉默认端点 → 先灰云等证书 → 橙云 + Full SSL。

捡到了,虽然只有一分钱。


2026.03.28