如何为需要 SSL 连接的数据库用户轮换 AWS Secrets Manager 密钥?

上次更新时间:2020 年 10 月 15 日

我的 AWS Secrets Manager 轮换函数无法使用 SSL 连接到一个 Amazon Relational Database Service (Amazon RDS) 实例。我收到了与以下类似的错误消息:

“: 设置密钥:无法登录到使用以前、当前或待处理密钥的密钥的数据库”

解决方法

修改数据库用户的 Lambda 轮换函数,从而为需要 SSL 连接的数据库用户轮换密钥。此示例使用一个 Amazon RDS MySQL 数据库单用户实例来修改 RDS MySQL 单用户模板。要使用除 RDS MySQL 数据库以外的其他 RDS 数据库,请参阅可用于创建 Lambda 轮换函数的 AWS 模板

重要提示:

创建密钥并启用自动轮换

1.    打开 Secrets Manager 控制台,然后选择 Store a new secret(存储新密钥)

注意:请确保您已登录到与您的 Amazon RDS MySQL 数据库相同的区域。

2.    在选择密钥类型中,选择 RDS 数据库凭证

3.    输入与您的数据库用户相同的用户名密码

4.    在 Select which RDS database this secret will access(选择此密钥将会访问的 RDS 数据库)中,选择您的 Amazon RDS MySQL 数据库,然后选择 Next(下一步)

5.    输入 Secret name(密钥名称)Description(描述),然后选择 Next(下一步)

6.    在配置自动轮换中,选择启用自动轮换

7.    在 New AWS Lambda function name(新 AWS Lambda 函数名称)中,输入一个名称,选择 Next(下一步),然后选择 Store(存储)

自定义 Lambda 轮换函数以连接到使用 SSL 连接的数据库

1.    打开 AWS Lambda 控制台,然后选择函数

2.    在函数名称中,选择您的 RDS MySQL 函数。

3.    在页面顶部,选择 ARN 旁边的复制图标 。

4.    在使用 SSL 加密与数据库实例的连接下载 rds-combined-ca-bundle.pem 证书捆绑包。

注意:保持文件名为 rds-combined-ca-bundle.pem 并且不得将该文件放入目录中。

5.    将 rds-combined-ca-bundle.pem 文件添加到 Lambda。有关说明,请参阅使用 AWS Lambda 控制台编辑器创建函数

6.    在 Lambda_function.py 中,将包含“pymysql.connect”的代码行更改为以下代码行:

conn = pymysql.connect(secret_dict['host'], user=secret_dict['username'], passwd=secret_dict['password'], port=port, db=dbname, connect_timeout=5, ssl={'ca': './rds-combined-ca-bundle.pem'})

7.    选择 Save(保存)

手动轮换密钥

1.    运行以下命令以列出密钥的版本 ID:

注意:请将 EXAMPLESECRETNAME 替换为您的密钥的变量。

aws secretsmanager list-secret-version-ids --secret-id EXAMPLESECRETNAME

2.    从输出中找到 VersionStages 值为 AWSPENDING 的版本 ID。然后运行以下命令移除暂存标签:

aws secretsmanager update-secret-version-stage --secret-id EXAMPLESECRETNAME --remove-from-version-id EXAMPLEVERSIONID --version-stage AWSPENDING

3.    打开 Secrets Manager 控制台,然后选择您的密钥。

4.    在 Rotation Configuration(轮换配置)中,选择 Rotate secret immediately(立即轮换密钥),然后选择 Rotate(轮换)

验证数据库用户与数据库的连接

按照教程:为 AWS 数据库轮换密钥中的第 1-5 步的说明临时安装 MySQL 客户端并检索密钥。

注意:将第 3 步替换为以下命令:

mysql -h $endpoint --ssl-ca=EXAMPLEPATH/rds-combined-ca-bundle.pem --ssl-verify-server-cert -u $user -P $port -p$password