AWS RDS:java.sql.SQLException:用户访问被拒绝
AWS RDS: java.sql.SQLException: Access denied for user
我知道这个问题已经被提出过几次,但提出的建议对我不起作用。所以这里有一些关于我正在尝试做的事情的背景信息。
我有一个 RDS MySQL 数据库,我正尝试使用来自 EMR 集群的 IAM 角色以编程方式访问该数据库。我能够以 root 用户身份登录数据库,没有任何问题,post 我做了以下操作
以管理员身份登录数据库,然后创建用户
create user my_user identified with AWSAuthenticationPlugin as 'RDS'
.
grant usage on db_name.* to 'my_user'@'%'require ssl;
附加到 EMR 实例的 IAM 角色具有以下属性,
具有 AWS 托管策略“AmazonRDSDataFullAccess”
内联策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
"arn:aws:rds-db:<region>:<account_id>:dbuser:<db_resource_id>/my_user"
]
}
]
}
- 数据库附加的安全组允许从 EMR 集群安全组
访问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
权限。
您可以尝试以下操作:
- 尝试重新创建数据库用户并再次授予它
- 尝试使用客户托管策略而不是内联策略,直到连接问题得到解决
- 内联策略中资源 ARN 后面有一个逗号,也将其删除。
我正在将策略附加到 EMR 角色,我必须将其附加到 EMR 集群的 EC2 实例配置文件
我知道这个问题已经被提出过几次,但提出的建议对我不起作用。所以这里有一些关于我正在尝试做的事情的背景信息。
我有一个 RDS MySQL 数据库,我正尝试使用来自 EMR 集群的 IAM 角色以编程方式访问该数据库。我能够以 root 用户身份登录数据库,没有任何问题,post 我做了以下操作
以管理员身份登录数据库,然后创建用户
create user my_user identified with AWSAuthenticationPlugin as 'RDS'
.grant usage on db_name.* to 'my_user'@'%'require ssl;
附加到 EMR 实例的 IAM 角色具有以下属性,
具有 AWS 托管策略“AmazonRDSDataFullAccess”
内联策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "rds-db:connect" ], "Resource": [ "arn:aws:rds-db:<region>:<account_id>:dbuser:<db_resource_id>/my_user" ] } ]
}
- 数据库附加的安全组允许从 EMR 集群安全组 访问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
权限。
您可以尝试以下操作:
- 尝试重新创建数据库用户并再次授予它
- 尝试使用客户托管策略而不是内联策略,直到连接问题得到解决
- 内联策略中资源 ARN 后面有一个逗号,也将其删除。
我正在将策略附加到 EMR 角色,我必须将其附加到 EMR 集群的 EC2 实例配置文件