当前位置:首页 > 问答 > 正文

MySQL报错ER_KEYRING_AWS恢复失败,远程帮忙修复思路分享

最近在处理一个客户的数据库问题时,遇到了一个比较棘手的错误:ER_KEYRING_AWS_UDF_ERROR,这个错误简单来说,就是MySQL服务器无法连接到亚马逊AWS的密钥管理服务KMS了,导致数据库启动失败或者一些加密操作(比如对加密的表空间进行解密)完全没法进行,客户当时非常着急,因为数据库直接起不来了,应用全部中断,经过一番折腾,最后总算解决了问题,下面我就把当时排查和解决的思路分享一下,希望能给遇到类似情况的朋友一点参考。

我们需要明白这个错误是干什么的,根据MySQL的官方文档说明,MySQL有一个叫做“Keyring”的组件,你可以把它理解成数据库自带的一个“保险柜”,用来安全地存放数据库的各种密钥,而“Keyring_AWS”是一个插件,它允许MySQL把这个“保险柜”建在云上,具体来说就是建在AWS的KMS服务里,这样做的好处是密钥由AWS这种专业的云服务商来管理,更安全也更方便,当MySQL需要用到密钥时,它就会通过这个插件去联系AWS KMS,ER_KEYRING_AWS_UDF_ERROR这个报错,说白了就是“去AWS KMS那里取钥匙的路上出了岔子”,连接建立不起来或者请求被拒绝了。

MySQL报错ER_KEYRING_AWS恢复失败,远程帮忙修复思路分享

知道了问题的本质,我们的排查思路就很清晰了:问题肯定出在MySQL服务器和AWS KMS服务之间的通信链路上,我们需要像侦探一样,一步步检查这条链路上的每个环节,我当时是按照从简到繁的顺序来查的。

第一步,最直观的,先看网络通不通,MySQL服务器部署在AWS的EC2虚拟机里,它需要能访问KMS的服务端点,我让客户先确认了一下EC2实例所在的虚拟私有云VPC是否配置了能够访问互联网的网关,或者是否配置了指向KMS的VPC端点,因为如果服务器本身被关在一个没有出网权限的私密网络里,它自然没办法联系到外面的KMS服务,客户检查后确认,网络路由是通的,EC2可以正常访问外网,这一步排除了最基础的网络问题。

MySQL报错ER_KEYRING_AWS恢复失败,远程帮忙修复思路分享

第二步,检查权限问题,这是AWS服务访问中最常见的问题,Keyring_AWS插件需要凭据来向AWS证明“我是谁,我有权访问这个KMS密钥”,这个凭据通常是通过EC2实例的IAM角色来分配的,我让客户重点检查了以下几点:

  1. EC2实例是否正确关联了IAM角色?客户确认角色是关联着的。
  2. 这个IAM角色是否被授予了访问KMS的必要权限?客户查看了角色的策略文档,发现里面确实包含了针对那个特定KMS密钥的kms:Decryptkms:Encrypt等操作权限,从策略文本上看,权限是足够的。

这就有点奇怪了,网络和权限这两大常见原因似乎都没问题,于是我们进行了第三步,查看更详细的日志,光有MySQL的错误代码不够,我们需要知道连接失败的具体原因,我让客户打开了MySQL的错误日志,同时因为Keyring_AWS插件本质上是调用AWS的SDK,所以我也建议他查看一下AWS SDK是否有更详细的调试日志,通过修改MySQL的配置文件,增加了Keyring相关的日志级别后,我们终于看到了更有价值的报错信息,大意是“请求的签名过期”。

MySQL报错ER_KEYRING_AWS恢复失败,远程帮忙修复思路分享

“签名过期”?这个提示一下子把方向指向了服务器的时间设置,第四步,我立刻让客户检查了EC2实例的系统时间,果不其然,发现服务器的时间比标准时间慢了好几分钟!这是因为AWS的API请求都有严格的时间戳校验,如果客户端(也就是我们的MySQL服务器)的系统时间和AWS服务器的时间相差太大,AWS会认为这个请求是过期的或者是未来的请求,出于安全考虑会直接拒绝,这就是导致ER_KEYRING_AWS_UDF_ERROR的根本原因。

问题根源找到了,解决起来就简单了,第五步,修复时间同步,我们为EC2实例安装了chrony时间同步服务,并配置其使用AWS提供的时间服务器,确保实例的时间始终与标准时间保持同步,命令大致如下:

sudo yum install -y chrony  # 对于Amazon Linux 2
sudo systemctl enable chronyd
sudo systemctl start chronyd
sudo chronyc sources        # 检查时间同步状态

在确认时间同步正常后,重启了MySQL服务,这次启动非常顺利,ER_KEYRING_AWS_UDF_ERROR错误消失了,数据库恢复了正常。

总结一下这次的修复思路,其实就是一条清晰的排查路径:

  1. 基础网络连通性:服务器能不到访问KMS端点?
  2. 云服务访问权限:关联的IAM角色是否有足够的KMS权限?
  3. 详细日志分析:开启详细日志,寻找更具体的错误描述。
  4. 系统环境检查:特别是系统时间是否准确,这是非常关键却容易被忽略的一点。
  5. 修复与验证:根据找到的根本原因进行修复(如同步时间),然后重启服务验证。

这次经历也提醒我们,在云环境下使用这些与云服务深度集成的功能时,不仅要关注配置本身,还要留意服务器的基础运行环境,一个看似不相关的时间偏差就可能引发严重故障。