#mysql #amazon-web-services #amazon-rds #amazon-iam
#mysql #amazon-веб-сервисы #amazon-rds #amazon-iam
Вопрос:
Я знаю, что этот вопрос поднимался пару раз, но предложенные предложения не работают для меня. Итак, вот немного контекста того, что я пытаюсь сделать.
У меня есть база данных MySQL RDS, к которой я пытаюсь получить программный доступ, используя роль IAM из кластера EMR. Я могу войти в базу данных как пользователь root без каких-либо проблем, после чего я сделал следующее
-
Вошел в БД как администратор, а затем создал пользователя
create user my_user identified with AWSAuthenticationPlugin as 'RDS'
. -
grant usage on db_name.* to 'my_user'@'%'require ssl;
-
Роль IAM, прикрепленная к экземпляру EMR, имеет следующие свойства,
-
Имеет управляемую 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" ] } ]
}
- Группа безопасности, подключенная к БД, разрешает доступ к MySQL / Aurora из группы безопасности кластера EMR
Я обращаюсь к БД программно аналогично тому, как указано в разделе «Подключение к БД» .
Трассировка стека, которую я получаю,:
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)
Я много пытался отладить, что может быть возможной причиной ошибки, но я не могу найти какую-либо причину, признателен, если кто-нибудь может мне помочь в этом. Я более чем готов подробно остановиться на любом шаге здесь (будучи моим первым сообщением, я, возможно, написал его неправильно). Заранее спасибо
UPD 1: я также попытался получить доступ к пользователю с помощью командной строки mysql с помощью следующей команды.
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: я подозреваю, что может быть ошибка в том, как я создаю пользователя в БД, поскольку ошибка все еще сохраняется даже после изменения ресурса на *
. Может ли кто-нибудь взглянуть на это поближе.
Комментарии:
1. Является ли база данных безсерверной базой данных Aurora или просто обычной базой данных RDS MySQL или Aurora? Вы включили проверку подлинности IAM для подключений к БД в настройках сервера RDS?
2. Это база данных MySQL, и я включил аутентификацию IAM в настройках сервера RDS
Ответ №1:
AmazonRDSDataFullAccess
Политика предназначена для взаимодействия с бессерверным API данных RDS. Он не предоставляет соответствующих разрешений для выполнения стандартного подключения к БД с проверкой подлинности IAM. Вам необходимо следовать приведенному здесь руководству, чтобы создать соответствующую политику. В частности, вам необходимо предоставить разрешение профилю экземпляра EC2 rds-db:connect
.
Комментарии:
1. У меня была такая же политика, привязанная к роли. Вы заметили какие-либо другие вещи, которые выглядят неправильно. Заранее спасибо.
2. Что произойдет, если вы измените ресурс во встроенной политике на just
*
? Этот тест устранит все возможные ошибки, которые у вас есть в ARN ресурса.3. Та же ошибка по-прежнему сохраняется « { «Версия»: «2012-10-17», «Заявление»: [ { «Эффект»: «Разрешить», «Действие»: [ «rds-db: подключение» ], «Ресурс»: «*» } ] } « Это политика, которую я использовал
Ответ №2:
Вы можете попробовать следующее:
- Попробуйте воссоздать пользователя БД и снова предоставить ему гранты
- Вместо встроенной политики попробуйте использовать политику, управляемую клиентом, пока проблема с подключением не будет решена
- Во встроенной политике после ARN ресурса стоит запятая, удалите и ее.
Комментарии:
1. 1. Я попытался воссоздать базу данных, но увидел ту же ошибку. 2. Я изменил это, но ошибка все еще сохраняется. 3. Это была ошибка, допущенная при вставке ее сюда, я отредактировал вопрос.
2. Вы получаете что-нибудь от =>
TOKEN="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 3306 --region us-east-1 --username my_user)"
?3. Да, токен генерируется
4. Попробуйте это: добавить
--enable-cleartext-plugin
before--user
при подключении к mysql из CLI5. Я попробовал это, и я получил сообщение об ошибке
mysql: unknown option '--enable-cleartext-plugin'
Ответ №3:
Я прикреплял политики к роли EMR, мне пришлось прикрепить ее к профилю экземпляра EC2 кластера EMR