关于AWS Secrets Manager交替用户密码轮换策略提升系统可用性的技术疑问
嘿,我来帮你拆解这个交替用户密码轮换策略的门道,以及它到底是怎么保障系统高可用性的——
首先先确认下你已经理解的流程完全正确:
- 初始状态:Secret中存储一组主用户的凭据,应用依赖这组凭据连接数据库/服务
- 第一次轮换:轮换函数会克隆主用户,生成第二个带新密码的用户,此时Secret中同时存在两组有效凭据
- 后续轮换:每次轮换都会交替更新其中一个用户的密码,不会同时修改两组凭据
关于它如何提升可用性的核心逻辑
这个策略的优势对比单用户轮换就非常明显:
在单用户轮换流程里,会先更新数据库密码,再把新密码同步回Secret。这个过程中会有一个尴尬的窗口期:旧密码已经失效,但新密码可能还没同步到数据库集群的所有节点——这时候应用不管拿到旧密码还是新密码,都有可能出现连接失败的情况,直接影响系统可用性。
但交替用户策略从根源上避开了这个风险:
- 每次轮换只更新其中一个用户的密码,另一个用户的凭据全程都是有效的。也就是说,轮换的整个过程中,Secret里始终有两组能正常连接数据库的凭据
- 应用不管在轮换的哪个时间点去拉取Secret,拿到的都是有效的凭据(要么是未被更新的旧用户,要么是刚更新完成的新用户),根本不会遇到“凭据无效”的连接失败
- 针对数据库集群密码同步慢的问题,这个策略还留足了缓冲期:比如这次更新了用户A的密码,在下次轮换(更新用户B)之前,有足够的时间让用户A的新密码同步到所有集群节点,等到下次轮换时,用户A的凭据已经完全可用,再去更新用户B的密码就不会有同步延迟导致的连接问题
关于应用是否需要刻意配置使用克隆用户
完全不需要!你不用特意让应用分配一部分连接用克隆用户,只要保证应用每次建立新连接时都从Secrets Manager拉取最新的凭据就行。因为轮换过程中两组凭据都是有效的,不管应用拿到哪一组,都能正常连接数据库,不会出现所谓的“50%用户遇到连接中断”的情况。甚至可以说,这个策略的设计初衷就是让应用完全不用关心轮换细节,只需要正常拉取凭据就能保障高可用。
官方文档里也明确说明了这个策略的适用场景和核心优势:
轮换策略: 交替用户
此策略在一个Secret中更新两个用户的凭据。你创建第一个用户,在第一次轮换时,轮换函数会克隆它以创建第二个用户。每次Secret轮换时,轮换函数会交替更新哪个用户的密码。由于大多数用户没有克隆自己的权限,你必须在另一个Secret中提供超级用户的凭据。如果数据库中的克隆用户与原始用户(通常称为临时或交互式用户)的权限不同,我们建议使用单用户轮换策略。
此策略适用于权限模型为一个角色拥有数据库表,另一个角色有权访问数据库表的数据库。它也适用于需要高可用性的应用程序。如果应用程序在轮换期间检索Secret,应用程序仍然会获得一组有效的凭据。轮换后,用户和user_clone的凭据都是有效的。与单用户轮换相比,这种类型的轮换导致应用程序被拒绝的可能性更小。
如果数据库托管在密码更改需要时间才能传播到所有服务器的服务器群中,存在数据库拒绝使用新凭据的调用的风险。你可以通过适当的重试策略来缓解此风险。
备注:内容来源于stack exchange,提问作者AfterWorkGuinness

