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

上次更新时间:2019 年 7 月 1 日

我的 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 控制台,然后选择存储新密钥

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

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

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

4    在选择此密钥将会访问的 RDS 数据库中,选择您的 Amazon RDS MySQL 数据库,然后选择下一步

5.    输入密钥名称描述,然后选择下一步

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

7.    在新 AWS Lambda 函数名称中,输入一个名称,选择下一步,然后选择存储

自定义 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.    选择保存

手动轮换密钥

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.    在轮换配置中,选择立即轮换密钥,然后选择轮换

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

按照验证您的初始密钥第 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