简体中文
事后分析:错误网关
2024-01-11 的 Logto 服务中断事件报告,原因是域名续订失败。
总结
在 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 团队前唤醒团队处理事件。