简体中文
  • 事后分析
  • 云服务
  • 事件

事后分析:错误网关

2024-01-11 的 Logto 服务中断事件报告,原因是域名续订失败。

Gao
Gao
Founder

总结

在 2024-01-11,Logto 服务出现了很多 502 错误网关错误,导致服务中断。

  • 开始时间: 大约在 2024-01-11 15:28 UTC
  • 解决时间: 大约在 2024-01-12 00:49 UTC
  • 持续时间: 大约 9 小时
  • 受影响的服务: Logto 认证服务,Logto 云服务
  • 影响级别: 严重
  • 根本原因: logto.app 域名过期,续订未能成功完成。

时间线

  • 2024-01-11 15:28 UTC 用户报告在访问 Logto 认证服务时出现 502 错误网关错误。
  • 2024-01-11 15:42 UTC 更多用户报告了同样的问题。
  • 2024-01-11 15:50 UTC 我们的团队成员开始调查问题,并给其他团队成员打电话。由于对一些团队成员来说已经是深夜,只是正常的电话不足以唤醒他们。
  • 2024-01-12 23:54 UTC 我们发现云服务正在向认证服务发送请求,但因为 ERR_TLS_CERT_ALTNAME_INVALID 错误导致请求失败。
  • 2024-01-12 00:36 UTC 我们清除了 DNS 缓存来看看是否有帮助。没有。
  • 2024-01-12 00:38 UTC 我们重新签发了 TLS 证书以看看是否有帮助。没有。
  • 2024-01-12 00:45 UTC 我们注意到 logto.app 域名可能已经过期。我们检查了域名注册商,发现它没有成功续订并且域名已过期。
  • 2024-01-12 00:49 UTC 域名续订完成。服务逐渐恢复正常。

事件分析

发生了什么?

我们的域名通常通过我们的域名注册商自动续订。然而,在这个实例中,由于可能的配置错误,续订过程失败了。因此,logto.app 域名过期,DNS 记录被更新指向注册商的停放页面。

目前,认证服务仍然在运行,但大多数请求无法到达它。例外的是 Logto 管理租户,它绑定到 auth.logto.io 域并不受过期影响。

除了认证服务,我们还有一个云服务,用于协调 Logto 租户并服务于 Logto 云控制台(一个前端应用)。

当用户操作云控制台时,应用不会直接调用认证服务;相反,它会调用云服务进行所有管理操作。

为了与 Logto 管理 API 对齐,我们设计了一个“管理 API 代理”端点来委托请求到认证服务。整个流程如下所示:

由于 *.logto.app 域存在证书不匹配问题,云服务(Node.js)拒绝请求并抛出错误。

通常,请求错误会被捕获以防止整个服务崩溃。然而,由于错误是从代理模块传播出来的,现有的错误处理逻辑无法捕获它,导致服务崩溃。

尽管每个 Logto 服务至少有三个副本,但所有副本都因几乎每个来自云控制台的请求都有错误而容易崩溃。自动恢复机制需要时间启动,导致服务暂时不可用。

这就是用户看到 502 错误网关错误(所有副本崩溃)的原因。一旦云服务启动,新的和重试的云控制台请求进入,崩溃循环继续。

当云服务宕机时,它也影响认证服务的某些端点,主要是 /api/.well-known/sign-in-exp。这个端点用于获取登录体验配置,其中包括需要从云服务中获取的连接器信息。

解决方案

  • 手动续订域名。

经验教训

  • 始终为域名到期设置监控或购买更长时间的使用期。
  • 注意时区差异可能导致事件响应延迟。
  • 确保监控涵盖所有域名。
  • 在与可抛出模块交互时要小心,确保错误能够被捕获和妥善处理。

纠正和预防措施

  • ✅ 添加域名到期的每月监控,不论是否启用自动续订。
  • ✅ 为 logto.app 添加监控。
  • ✅ 更新云服务错误处理逻辑,以正确捕获和处理代理错误。
  • ✅ 实施更强的警报,以便在拥有全天时区覆盖的 SRE 团队前唤醒团队处理事件。