如何为需要 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 模板。

重要提示:

开始之前,请确保您已安装并配置 AWS 命令行界面 (AWS CLI)。 如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新版本的 AWS CLI。 创建密钥并启用自动轮换

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, user=secret_dict, passwd=secret_dict, 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