我在马路边捡到一分钱
目录
花了将近 1 小时,省下了每月不到 1 块钱的云服务费用。值吗?不值。但搞清楚这件事的过程,值。
先说那一分钱从哪来

我在 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 橙云代理会拦截这个过程,导致证书永远签不下来。

第四步:等证书签发
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 小时,两个主要坑:
- 没关默认 HTTPS 端点 —— 导致证书一直 Waiting
- SSL 模式设成了 Flexible —— 切橙云后立刻
ERR_TOO_MANY_REDIRECTS
一句话总结:关掉默认端点 → 先灰云等证书 → 橙云 + Full SSL。
捡到了,虽然只有一分钱。
2026.03.28