Cloud Run 与 ALB:逐层验收和排障
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
返回 ALB 实验或 Cloud Run 实验。按请求路径逐层检查,避免把所有 403 都归为 IAM、所有 404 都归为应用。HTTP 状态码只是线索,需要结合日志确定是谁返回的。
验收前记录目标#
确认当前项目、服务 Region、服务名、ALB 类型和域名。下列命令在配置了 gcloud 的本机终端运行;读取配置不改变服务。
source lab.env
gcloud config get-value project
gcloud run services describe lab-hello \
--project="$PROJECT_ID" --region="$REGION" --format=yaml
gcloud run services get-iam-policy lab-hello \
--project="$PROJECT_ID" --region="$REGION"
gcloud run revisions list --service=lab-hello \
--project="$PROJECT_ID" --region="$REGION"检查 Ready 状态、容器镜像/端口、当前承接流量的 Revision、ingress、runtime Service Account 及调用者授权。最新创建或 Ready 的 Revision 不一定正在承接正式流量;候选版本可能为 0%。
按请求路径逐层检查#
| 层次 | 检查内容 | 通过标准 |
|---|---|---|
| DNS | 域名的 A/AAAA 是否指向当前 ALB;是否有旧记录 | 请求进入预期前端 |
| TLS | 域名、证书覆盖范围、证书状态、绑定的 HTTPS proxy | 客户端证书校验通过 |
| Frontend | IP、端口、HTTP/HTTPS、forwarding rule 的范围 | 监听的是客户端访问的入口 |
| URL map | 请求 Host、路径和默认后端 | 匹配预期 Backend service |
| Backend / NEG | NEG 类型、项目、Region、服务名;如用 mask,提取出的服务是否存在 | 引用正确且配置已传播 |
| Cloud Run 入口 | ingress 是否允许外部 ALB,而非纯 Internal | 该来源有资格到达服务 |
| 调用身份 | Invoker 检查、IAM、ID token audience、IAP 配置 | 当前调用身份被授权 |
| Revision / 应用 | Ready、流量分配、监听端口、路由、日志和下游依赖 | 应用正常响应 |
Serverless NEG 不使用普通 VM health check。 Cloud Run 后端没有这种检查是正常情况;应核对 NEG 引用、服务状态、ingress、IAM 和应用日志。排障说明
常见错误从哪里查#
| 现象 | 可能原因与下一步 |
|---|---|
| 401 / 403 | ID token 缺失、过期、audience 不符、Invoker 权限、IAP 或 Cloud Armor 拒绝;先看拒绝发生在哪层 |
| 404 | URL map / URL mask 指向错误、应用路径不存在、Cloud Run ingress 或默认 URL 限制;不能仅凭状态码认定应用收到请求 |
| 502 | LB 到后端通信异常、连接提前关闭或后端响应问题;查看 LB 的 statusDetails 与容器日志 |
| 503 | 实例启动失败、资源或容量不足、应用主动返回错误等;检查 Revision、实例与扩容状态 |
| 429 | 实例/并发容量、平台限制或限流策略;检查 Cloud Armor 与 Cloud Run 指标 |
| 超时 / 504 | 客户端、ALB、应用或依赖超时;逐层比对耗时,避免只调大一个 timeout |
| 证书一直 PROVISIONING | DNS、证书授权记录、域名与所绑定前端不匹配;检查对应证书签发方式 |
如何看日志#
控制台的 Cloud Run → 服务 → Logs查看请求和容器日志;Logging → Logs Explorer 可同时查询 LB 与 Cloud Run。请求日志描述访问结果,容器 stdout/stderr 通常包含代码异常、端口或数据库连接错误。运行身份缺少数据库或 Secret 权限,可能表现为应用 5xx,而不是用户调用 IAM 的 403。
Cloud Run 查询示例,在 Logs Explorer 中填写:
resource.type="cloud_run_revision"
resource.labels.service_name="lab-hello"全局 ALB 查询示例:
resource.type="http_load_balancer"
resource.labels.backend_service_name="lab-backend"区域型 ALB 使用 resource.type="http_external_regional_lb_rule",按实际日志标签筛选本例资源。先扩大到该资源类型及测试时间窗口,避免标签条件错误把所有日志过滤掉。
CLI 创建的全局实验后端可显式开启请求日志:
gcloud compute backend-services update lab-backend \
--global --enable-logging --logging-sample-rate=1查看同一时间、Host、请求路径和 trace(若传播)对应的日志。没有日志可能是采样、日志未启用、时间窗口或请求尚未到达该层,不能单独证明网络被阻止。ALB 日志
正向和反向验证#
| 阶段 | 正向测试 | 反向测试 |
|---|---|---|
| IAM 保护的 Cloud Run 入门 | 有权限的 ID token 调用返回 hello | 匿名调用被拒绝 |
| 公开 hello + ALB | ALB 地址返回 hello | 普通公网客户端直连 run.app 被 ingress 拒绝 |
| 自有域名 HTTPS | 域名访问成功且证书验证通过 | 错误主机名不应被当作有效 TLS 身份 |
| IAP 员工应用 | 已授权员工登录成功 | 未授权身份被拒绝 |
Cloud Run ingress 设置为 internal-and-cloud-load-balancing 后,从本机直接访问 run.app 失败是预期结果,即使你带有有效 token。需要测试服务本身时,选择已授权且符合 ingress 的路径;不要为了排障直接把所有控制都关闭。
清理怎么确认#
Cloud Run 和 ALB 独立清理:只删一方不会回收另一方。具体顺序见 全局清理或 区域型清理。
清理后核对 Cloud Run、Load balancing、IP addresses、证书与 Proxy-only subnet;共享代理 subnet 在其他依赖解除前保留。