← 中文资源

简体中文版本

为数据库密钥设置自动轮换

启用 Secrets Manager 30 天轮换计划,让应用运行时刷新凭据,并验证旧密码确实失效。

阅读英文原文

概述

Secrets Manager 的轮换由 Lambda 分四步完成:创建新版本、在数据库上设置新密码、测试新密码、把 AWSCURRENT 标签移到新版本。应用必须在运行时读取密钥,并在认证失败时重建连接池。若启动时只读一次,轮换成功反而会造成故障。

步骤

  1. 使用轮换 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
  1. 用 describe-secret 确认 RotationEnabled 为 true、周期为 30 天,并观察 AWSPENDING 与 AWSCURRENT 版本阶段。
  2. 应用侧缓存密钥 5 分钟,遇到 28P01 认证失败时立即丢弃连接池、重新获取 AWSCURRENT 并重建池:
pool.on('error', async (err) => {
  if (err.code === '28P01') {
    await cache.del('db-creds');
    await pool.end();
    pool = createPool(await currentCredentials());
  }
});
  1. 手动触发一次轮换,并用旧密码尝试连接,确认被拒绝。

验证

预期 rotate-secret 调用成功,旧密码返回 password authentication failed,应用无需重启即可使用新凭据恢复。检查 CloudWatch Logs 中轮换函数无报错,版本阶段只剩一个 AWSCURRENT;若 AWSPENDING 停留超过一小时,说明 Lambda 中途失败。

注意事项

  • 轮换 Lambda 需能访问私有子网中的数据库,VPC 路由与安全组要提前放通。
  • 已有连接在池回收前仍然有效,轮换不会立即终止会话。
  • 多个服务共享同一凭据时,必须全部先支持运行时刷新,再开启自动轮换。
  • 保留手动应急流程:Lambda 故障时仍需能重置密码并更新密钥。