我有一个Django应用,该应用从AWS Secret Manager提取数据库秘密。它包含所有数据库参数,例如用户名,密码,主机,端口等。当我在EC2上启动Django应用程序时,它成功地从Secret Manager中检索了机密并建立了数据库连接。
现在的问题是我设置了30天的密码轮换策略。为了测试流量,目前,我将其设置为1天。每次旋转密码时,我的Django应用都会失去数据库连接。因此,我必须手动重新启动应用程序,以允许该应用程序从Secret Manager中获取新的数据库凭据。
有没有一种方法可以自动进行秘密获取,而无需手动重新启动服务器?一种可能的方式是触发AWS CodeDeploy或类似服务,该服务将自动重启服务器。但是,如果采用这种方法,将会有一些停机时间。
可以无缝运行而无需停机的任何其他方法。
答案 0 :(得分:1)
如果旧的数据库凭证在轮换期间立即失效,那么如果没有一些停机时间,这样做可能会非常困难。一种选择是让您的应用捕获凭据错误,然后(尝试)从Secrets Manager中获取新密码,从而创建一个新的数据库连接。另一个选择是拥有两个有效的用户/密码对,而在创建新用户/密码对时保留旧的有效。我不确定自动旋转是否可以为您提供此选项。然后,您可以根据需要重新启动应用程序。要在不造成短暂中断的情况下做到这一点,可能需要负载均衡器和应用程序的多个实例运行,以便您可以在终止旧版本之前使用新的版本来升级它。
答案 1 :(得分:0)
以前在how to use new secret created by key rotation中回答过此问题。
如果您使用多用户轮换(控制台中的“使用我之前存储在AWS Secrets Manager中的密钥”选项),则可以使用Secrets Manager python caching library缓存并定期刷新密钥。
如果使用“单用户轮换”选项,则需要编写一个连接包装程序(类似于JDBC wrapper),当建立新连接时出错时,该包装程序将刷新凭据。