для проекта с AWS я пытаюсь установить микроблог, созданный с помощью flask, на ec2. Архитектура на данный момент состоит из
Все элементы находятся в одном VPC.
Группы безопасности
Я получил доступ к бастиону по ssh и из бастиона получил доступ к ec2 частной подсети, установил необходимые пакеты для приложения. Я создал .env с данными доступа к RDS (DATABASE_URL=mysql+pymysql://db-user:db-password@db-host:db-port/db-
базу данных) и попытался запустить flask db upgrade, но получил ошибки, указанные ниже.
Есть ли что-то, что я пропустил или что-то не так настроено? Я новичок в AWS.
Спасибо!!!
[2024-02-21 16:35:56,754] INFO in __init__: Microblog startup
Traceback (most recent call last):
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 145, in __init__
self._dbapi_connection = engine.raw_connection()
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 3282, in raw_connection
return self.pool.connect()
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/base.py", line 449, in connect
return _ConnectionFairy._checkout(self)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/base.py", line 1263, in _checkout
fairy = _ConnectionRecord.checkout(pool)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/base.py", line 712, in checkout
rec = pool._do_get()
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/impl.py", line 282, in _do_get
return self._create_connection()
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/base.py", line 390, in _create_connection
return _ConnectionRecord(self)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/base.py", line 674, in __init__
self.__connect()
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/base.py", line 901, in __connect
pool.logger.debug("Error on connect(): %s", e)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/base.py", line 896, in __connect
self.dbapi_connection = connection = pool._invoke_creator(self)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/engine/create.py", line 643, in connect
return dialect.connect(*cargs, **cparams)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/engine/default.py", line 616, in connect
return self.loaded_dbapi.connect(*cargs, **cparams)
File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 358, in __init__
self.connect()
File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 664, in connect
self._request_authentication()
File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 954, in _request_authentication
auth_packet = self._read_packet()
File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 772, in _read_packet
packet.raise_for_error()
File "/usr/local/lib/python3.9/site-packages/pymysql/protocol.py", line 221, in raise_for_error
err.raise_mysql_exception(self._data)
File "/usr/local/lib/python3.9/site-packages/pymysql/err.py", line 143, in raise_mysql_exception
raise errorclass(errno, errval)
pymysql.err.OperationalError: (1049, "Unknown database 'db-final-database'")
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/local/bin/flask", line 8, in <module>
sys.exit(main())
File "/usr/local/lib/python3.9/site-packages/flask/cli.py", line 1050, in main
cli.main()
File "/usr/local/lib/python3.9/site-packages/click/core.py", line 1078, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python3.9/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/local/lib/python3.9/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/local/lib/python3.9/site-packages/click/core.py", line 1434, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/lib/python3.9/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
File "/usr/local/lib/python3.9/site-packages/click/decorators.py", line 33, in new_func
return f(get_current_context(), *args, **kwargs)
File "/usr/local/lib/python3.9/site-packages/flask/cli.py", line 357, in decorator
return __ctx.invoke(f, *args, **kwargs)
File "/usr/local/lib/python3.9/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
File "/usr/local/lib/python3.9/site-packages/flask_migrate/cli.py", line 150, in upgrade
_upgrade(directory, revision, sql, tag, x_arg)
File "/usr/local/lib/python3.9/site-packages/flask_migrate/__init__.py", line 111, in wrapped
f(*args, **kwargs)
File "/usr/local/lib/python3.9/site-packages/flask_migrate/__init__.py", line 200, in upgrade
command.upgrade(config, revision, sql=sql, tag=tag)
File "/usr/local/lib/python3.9/site-packages/alembic/command.py", line 403, in upgrade
script.run_env()
File "/usr/local/lib/python3.9/site-packages/alembic/script/base.py", line 583, in run_env
util.load_python_file(self.dir, "env.py")
File "/usr/local/lib/python3.9/site-packages/alembic/util/pyfiles.py", line 95, in load_python_file
module = load_module_py(module_id, path)
File "/usr/local/lib/python3.9/site-packages/alembic/util/pyfiles.py", line 113, in load_module_py
spec.loader.exec_module(module) # type: ignore
File "<frozen importlib._bootstrap_external>", line 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "migrations/env.py", line 94, in <module>
run_migrations_online()
File "migrations/env.py", line 76, in run_migrations_online
connection = engine.connect()
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 3258, in connect
return self._connection_cls(self)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 147, in __init__
Connection._handle_dbapi_exception_noconnection(
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 2422, in _handle_dbapi_exception_noconnection
raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 145, in __init__
self._dbapi_connection = engine.raw_connection()
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 3282, in raw_connection
return self.pool.connect()
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/base.py", line 449, in connect
return _ConnectionFairy._checkout(self)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/base.py", line 1263, in _checkout
fairy = _ConnectionRecord.checkout(pool)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/base.py", line 712, in checkout
rec = pool._do_get()
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/impl.py", line 282, in _do_get
return self._create_connection()
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/base.py", line 390, in _create_connection
return _ConnectionRecord(self)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/base.py", line 674, in __init__
self.__connect()
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/base.py", line 901, in __connect
pool.logger.debug("Error on connect(): %s", e)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/pool/base.py", line 896, in __connect
self.dbapi_connection = connection = pool._invoke_creator(self)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/engine/create.py", line 643, in connect
return dialect.connect(*cargs, **cparams)
File "/usr/local/lib64/python3.9/site-packages/sqlalchemy/engine/default.py", line 616, in connect
return self.loaded_dbapi.connect(*cargs, **cparams)
File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 358, in __init__
self.connect()
File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 664, in connect
self._request_authentication()
File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 954, in _request_authentication
auth_packet = self._read_packet()
File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 772, in _read_packet
packet.raise_for_error()
File "/usr/local/lib/python3.9/site-packages/pymysql/protocol.py", line 221, in raise_for_error
err.raise_mysql_exception(self._data)
File "/usr/local/lib/python3.9/site-packages/pymysql/err.py", line 143, in raise_mysql_exception
raise errorclass(errno, errval)
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1049, "Unknown database 'db-final-database'")
(Background on this error at: https://sqlalche.me/e/20/e3q8)
Я попробовал это, и кажется, что он подключается, но не передает данные
$ nc -vz db-final-database.csfitfdo13cc.us-east-1.rds.amazonaws.com 3306
Ncat: Version 7.93 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.0.68:3306.
Ncat: 0 bytes sent, 0 bytes received in 0.04 seconds.
Да, база данных существует. Спасибо за информацию по группе безопасности, сначала у меня ее не было, но с тестами оставил так. Есть мысли по этому поводу?
Сообщение об ошибке убедительно свидетельствует о том, что такой базы данных нет. На самом деле проблема с подключением не приведет к такому результату (это будет тайм-аут или что-то более важное). Обратите внимание, что имя базы данных не обязательно совпадает с именем RDS.
Вы получили доступ к экземпляру RDS с хоста-бастиона? Или с помощью команды mysql из частного экземпляра EC2? Вам необходимо подключиться к RDS MySQL с одного из этих серверов, запустить команду SHOW DATABASES; и убедиться, что БД с именем db-final-database действительно существует. В сообщении об ошибке говорится, что это не так. Как упоминал jarmod, то, что имя сервера RDS — db-final-database, не означает, что на этом сервере создана схема базы данных MySQL с именем db-final-database.
Внутри RDS я нажимаю «Создать базу данных», «Создание стандарта», выбираю движок MySQL и свободный уровень для развертывания на t2.micro. В идентификаторе экземпляра базы данных я помещаю имя. Я так понимаю, это имя базы данных или это экземпляр RDS? Затем я указываю пользователя и пароль, выбираю опцию «Не подключаться к вычислительному ресурсу EC2», выбираю тот же VPC и группу подсети, которую создаю. Публичный доступ «НЕТ». Я выбираю группу безопасности и аутентификацию по паролю. Правильно ли, что после развертывания конечной точкой является RDS, а выбранное мной имя — база данных?
Вы создали экземпляр базы данных RDS с MySQL. Вы не создали базу данных. Для этого вы подключаете клиент MySQL к экземпляру базы данных RDS, а затем используете SQL (или другой) для создания одной или нескольких баз данных. Терминология здесь, надо сказать, запутанная и противоречивая.
О боже, теперь все это имеет смысл. Большое спасибо за ваше внимание





Проблема здесь заключается в различном использовании термина «база данных». Им свойственно путаться.
Вы создали экземпляр базы данных RDS с MySQL. Это ресурс AWS. Это не база данных MySQL.
Вам действительно нужно создать базу данных MySQL. Для этого вы подключаете клиент MySQL к экземпляру базы данных RDS, а затем используете SQL (или другой) для создания одной или нескольких баз данных.
Существует ли на самом деле база данных с именем
db-final-database? Кстати, вам не нужно разрешать «правило для входящего трафика Mysql/Aurora(3306) из RDS» в группе безопасности EC2, поскольку группы безопасности имеют состояние, а RDS не устанавливает никаких подключений к EC2 (наоборот).