Используя PyMySQL, я не могу подключиться к RDS

Используя PyMySQL, я получаю pymysql.err.OperationalError: (1045, u"Access denied for user 'my_user'@'<MY_IP_ADDRESS>' (using password: YES)"), однако я могу войти в систему из командной строки или MySQL Workbench, используя те же учетные данные на этом компьютере. И я могу подключиться к localhost с помощью PyMySQL. Вот мой пример тестового кода:

import pymysql
prod_conn = pymysql.connect(
  host='correct-host-name.us-west-2.rds.amazonaws.com',
  user='my_user',
  password='correct_password',
  port=3306,
  database='my_db')

Однако, используя mysql -hcorrect-host-name.us-west-2.rds.amazonaws.com -umy_user -pcorrect_password -P3306 -Dmy_db из командной строки на той же машине, я прекрасно вхожу.

Погуглив, я попытался проверить гранты для пользователя и полагаю, что пользователь настроен правильно. SHOW GRANTS FOR CURRENT_USER() возвращается

Grants for my_user@%
'GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO \'my_user\'@\'%\' WITH GRANT OPTION'

Я попытался проверить SELECT USER(), CURRENT_USER(); и вернуться

USER()                      CURRENT_USER()
'my_user@<MY_IP_ADDRESS>'   'my_user@%'

Итак, похоже, что пользователь настроен правильно, что я и подозревал, поскольку я могу подключиться через другие параметры. Я также попробовал оба предложения с https://forums.aws.amazon.com/thread.jspa?messageID=707103 (в частности, используя другую группу параметров с log_bin_trust_function_creators == 1 и используя пароль без знаков препинания) безрезультатно.

Я хочу использовать это в лямбда-функции, поэтому я действительно хочу использовать PyMySQL, чтобы сохранить это решение только для python, а не пытаться использовать MySQLDB или другую библиотеку.

Я не думаю, что есть какие-либо анонимные пользователи после просмотра SELECT user,host FROM mysql.user;

user        host
'my_user'   '%'
'mysql.sys' 'localhost'
'rdsadmin'  'localhost'

Ценю любые другие мысли, которые может иметь это сообщество о том, как действовать...


person jcasner    schedule 06.10.2017    source источник
comment
Можете попробовать запустить SHOW GRANTS FOR USER() и сообщить?   -  person Brian Driscoll    schedule 06.10.2017
comment
Возможно ли, что вместо password='correct_password' вам нужно использовать 'passwd=correct_password'?   -  person olegsv    schedule 06.10.2017
comment
@BrianDriscoll SHOW GRANTS FOR USER(); является недопустимым утверждением (согласно MySQL Workbench). SHOW GRANTS FOR my_user; дает тот же ответ, что и SHOW GRANTS FOR CURRENT_USER();   -  person jcasner    schedule 06.10.2017
comment
@olegsv это kwarg, поэтому должно быть таким, как указано в вопросе. См. github.com/PyMySQL/PyMySQL/blob/master/example.py. #L6 для примера   -  person jcasner    schedule 06.10.2017
comment
@jcasner в примере это «passwd», в вашем коде — «пароль».   -  person olegsv    schedule 06.10.2017
comment
@olegsv либо работает (или должен работать) — см. github.com /PyMySQL/PyMySQL/blob/master/pymysql/. Кроме того, сообщение об ошибке указывает, что используется пароль ((using password: YES)). Если я не включу ни passwd, ни password, ошибка будет (using password: NO).   -  person jcasner    schedule 06.10.2017


Ответы (1)


Я решил это, создав нового пользователя. Мне нужны были только права на чтение для этого пользователя, так что это лучший подход, чем использование пользователя по умолчанию с такими высокими разрешениями. Я до сих пор не уверен, почему оригинальный не работал, но вот что в итоге заработало:

# Grants for my_new_user@%
'GRANT SELECT ON *.* TO \'my_new_user\'@\'%\''
person jcasner    schedule 07.10.2017