概述
Secrets Manager 的轮换由 Lambda 分四步完成:创建新版本、在数据库上设置新密码、测试新密码、把 AWSCURRENT 标签移到新版本。应用必须在运行时读取密钥,并在认证失败时重建连接池。若启动时只读一次,轮换成功反而会造成故障。
步骤
- 使用轮换 Lambda 和 30 天周期启用轮换:
aws secretsmanager rotate-secret \
--secret-id prod/appdb/credentials \
--rotation-lambda-arn arn:aws:lambda:us-east-1:123456789012:function:SecretsManagerRotation \
--rotation-rules AutomaticallyAfterDays=30
- 用
describe-secret确认RotationEnabled为 true、周期为 30 天,并观察 AWSPENDING 与 AWSCURRENT 版本阶段。 - 应用侧缓存密钥 5 分钟,遇到
28P01认证失败时立即丢弃连接池、重新获取 AWSCURRENT 并重建池:
pool.on('error', async (err) => {
if (err.code === '28P01') {
await cache.del('db-creds');
await pool.end();
pool = createPool(await currentCredentials());
}
});
- 手动触发一次轮换,并用旧密码尝试连接,确认被拒绝。
验证
预期 rotate-secret 调用成功,旧密码返回 password authentication failed,应用无需重启即可使用新凭据恢复。检查 CloudWatch Logs 中轮换函数无报错,版本阶段只剩一个 AWSCURRENT;若 AWSPENDING 停留超过一小时,说明 Lambda 中途失败。
注意事项
- 轮换 Lambda 需能访问私有子网中的数据库,VPC 路由与安全组要提前放通。
- 已有连接在池回收前仍然有效,轮换不会立即终止会话。
- 多个服务共享同一凭据时,必须全部先支持运行时刷新,再开启自动轮换。
- 保留手动应急流程:Lambda 故障时仍需能重置密码并更新密钥。