AWS RDS:java.sql.SQLException:用户访问被拒绝

AWS RDS: java.sql.SQLException: Access denied for user

我知道这个问题已经被提出过几次,但提出的建议对我不起作用。所以这里有一些关于我正在尝试做的事情的背景信息。

我有一个 RDS MySQL 数据库,我正尝试使用来自 EMR 集群的 IAM 角色以编程方式访问该数据库。我能够以 root 用户身份登录数据库,没有任何问题,post 我做了以下操作

  1. 以管理员身份登录数据库,然后创建用户

    create user my_user identified with AWSAuthenticationPlugin as 'RDS'.

  2. grant usage on db_name.* to 'my_user'@'%'require ssl;

  3. 附加到 EMR 实例的 IAM 角色具有以下属性,

  1. 数据库附加的安全组允许从 EMR 集群安全组
  2. 访问MySQL/Aurora

我以与 Connecting to DB 部分中所述类似的方式以编程方式访问数据库。

我得到的堆栈跟踪是:

User class threw exception: java.sql.SQLException: Access denied for user 'my_user'@'host' (using password: YES)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:963)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3966)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3902)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:875)
    at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1712)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1228)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2253)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2284)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2083)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:806)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:410)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:328)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:208)

我已经尝试了很多调试错误的可能原因,但我找不到任何原因,如果有人可以帮助我解决这个问题,我将不胜感激。我非常愿意详细说明这里的任何步骤(作为我的第一个 post 我可能没有写好)。提前致谢

UPD 1:我还尝试通过以下命令在 mysql CLI 的帮助下访问用户。

TOKEN="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 3306 --region us-east-1 --username my_user)" 
mysql --host=$RDSHOST --port=3306 --ssl-ca=rds-ca-2019-root.pem --user=my_user --password=$TOKEN

这也给出了类似的信息ERROR 1045 (28000): Access denied for user 'my_user'@'localhost' (using password: YES)

UPD 2:我怀疑我在数据库中创建用户的方式可能有误,因为即使将资源更改为 *,错误仍然存​​在。谁能仔细看看这里。

AmazonRDSDataFullAccess 策略用于与无服务器 RDS 数据交互 API。它不提供使用 IAM 身份验证执行标准数据库连接的适当权限。您需要按照指南 here 创建适当的策略。特别是您需要为 EC2 实例配置文件授予 rds-db:connect 权限。

您可以尝试以下操作:

  1. 尝试重新创建数据库用户并再次授予它
  2. 尝试使用客户托管策略而不是内联策略,直到连接问题得到解决
  3. 内联策略中资源 ARN 后面有一个逗号,也将其删除。

我正在将策略附加到 EMR 角色,我必须将其附加到 EMR 集群的 EC2 实例配置文件