You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为AWS用户配置RDS MySQL实例只读权限及登录故障排查

解决RDS MySQL IAM用户登录失败的分步指南

我之前也碰到过一模一样的问题——给了RDS相关的IAM权限但还是连不上数据库,核心原因是AWS的RDS IAM认证需要两层权限配置:AWS侧的IAM策略(尤其是rds-db:connect),加上MySQL内部的用户授权。下面是带截图说明的分步操作教程,你可以让管理员照着做:

步骤1:创建包含rds-db:connect的自定义IAM策略

这是最关键的一步,之前自动生成的只读策略不包含这个数据库连接权限:

  1. 登录AWS控制台,进入IAM服务,点击左侧导航栏的「策略」→「创建策略」
  2. 切换到「JSON」标签页,替换默认模板为以下内容(记得把占位符换成你们的实际信息):
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds-db:connect"
            ],
            "Resource": [
                "arn:aws:rds-db:<你的AWS区域>:<你的AWS账号ID>:dbuser:<RDS实例资源ID>/<MySQL内部要登录的用户名>"
            ]
        }
    ]
}

📸 截图说明:JSON编辑页面会展示你输入的策略,右上角点击「验证策略」可以确认格式没问题,出现绿色对勾就说明合法。

  1. 点击「下一步:标签」,可加可不加标签,直接点「下一步:审核」
  2. 给策略起个好记的名字(比如RDSMySQL-IAM-Connect-ReadOnly),写个简短描述,然后点「创建策略」

步骤2:把自定义策略附加给用户B

  1. 在IAM控制台左侧点「用户」,找到用户B进入详情页
  2. 切到「权限」标签,点击「添加权限」→「附加现有策略直接」
  3. 搜索框输入刚才创建的策略名,勾选它,然后点「添加权限」

📸 截图说明:此时用户B的权限列表里会同时显示之前的AmazonRDSFullAccess、自动生成的只读策略,以及新创建的这个连接策略。

步骤3:确认RDS实例已启用IAM数据库认证

如果实例没开这个功能,IAM用户根本连不上:

  1. 进入RDS服务控制台,找到目标MySQL实例,点名称进详情页
  2. 切到「配置」标签,看「IAM数据库认证」那栏是不是「已启用」
  3. 如果是「未启用」,点「修改」,在「数据库选项」里找到「IAM数据库认证」,勾选「启用」,然后点「继续」→「立即应用」

📸 截图说明:修改页面的「IAM数据库认证」在「连接」区域下面,勾选后会弹出确认修改的提示框,确认就行。

步骤4:在MySQL内部配置IAM关联用户

这一步需要用能正常登录的用户A的账号操作:

  1. 打开MySQL Workbench,用用户A的账号连接到RDS实例
  2. 在查询编辑器里执行下面的SQL:
    • 先创建关联IAM的用户(如果还没创建的话):
      CREATE USER '<MySQL内部用户名>' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
      
    • 给这个用户授予只读权限(按需调整范围):
      GRANT SELECT ON *.* TO '<MySQL内部用户名>';
      FLUSH PRIVILEGES;
      

📸 截图说明:执行完后会返回「Query OK, 0 rows affected」之类的成功提示,说明配置生效了。

步骤5:测试用户B的登录

用MySQL Workbench测试

  1. 打开MySQL Workbench,新建连接,连接类型选「Standard TCP/IP」(如果是通过SSH隧道就选「Standard TCP/IP over SSH」)
  2. 在「Connection Method」里选「AWS IAM Authentication」
  3. 填好RDS实例的端点、端口,输入刚才创建的MySQL内部用户名,点「Test Connection」
  4. 选择用户B的AWS凭证(如果已经配置了AWS CLI,会自动读取;如果是临时凭证,就输入Access Key和Secret Key)

📸 截图说明:测试成功的话会弹出「Connection succeeded」的绿色提示框。

用C#控制台应用测试

用AWS SDK生成认证令牌再连接,代码示例如下:

using Amazon.RDS;
using Amazon.RDS.Model;
using MySqlConnector;

// 初始化RDS客户端,用用户B的凭证
var rdsClient = new AmazonRDSClient("<用户B的Access Key>", "<用户B的Secret Key>", Amazon.RegionEndpoint.<你的AWS区域>);

// 生成认证令牌
var authTokenRequest = new GenerateAuthenticationTokenRequest
{
    DBHostname = "<RDS实例端点>",
    Port = 3306,
    DBUsername = "<MySQL内部用户名>",
    Region = "<你的AWS区域>"
};
var authToken = await rdsClient.GenerateAuthenticationTokenAsync(authTokenRequest);

// 构建连接字符串并测试连接
var connectionString = $"server=<RDS实例端点>;user id=<MySQL内部用户名>;password={authToken};port=3306;sslmode=Required;";
using var conn = new MySqlConnection(connectionString);
await conn.OpenAsync();
Console.WriteLine("连接成功!");

注意:需要先安装AWSSDK.RDSMySqlConnector这两个NuGet包。


如果做完这些还是不行,可以让管理员检查这几点:

  • 策略里的ARN是否正确:RDS实例资源ID在实例详情页的「配置」标签里找,格式是db-XXXXXXXXX
  • MySQL内部的用户名和策略里dbuser后面的名字完全一致(大小写敏感!)
  • 用户B的AWS凭证有没有rds:GenerateAuthenticationToken权限——这个在AmazonRDSFullAccess里已经包含,不过可以确认下

内容的提问来源于stack exchange,提问作者user190528

火山引擎 最新活动