Развертывание Flask Microblog в частном ec2 с частным RDS

для проекта с AWS я пытаюсь установить микроблог, созданный с помощью flask, на ec2. Архитектура на данный момент состоит из

  1. Хост-бастион, развернутый в общедоступной подсети с IP-адресом.
  2. ec2 развернут в частной подсети без IP.
  3. RDS (Mysql), развернутый в частной подсети без общего доступа.
  4. EFS, установленная в ec2 частной подсети.

Все элементы находятся в одном VPC.

Группы безопасности

  1. Bastion Host – правило для входящего трафика SSH(22) с моего IP
  2. EC2 — правило для входящего трафика SSH(22) от хоста-бастиона и правило для входящего трафика Mysql/Aurora(3306) из RDS
  3. RDS — правило для входящего трафика Mysql/Aurora(3306) из частного EC2
  4. EFS – правило для входящего трафика NFS (2049) из частного EC2.

Я получил доступ к бастиону по 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.

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

jarmod 21.02.2024 17:59

Да, база данных существует. Спасибо за информацию по группе безопасности, сначала у меня ее не было, но с тестами оставил так. Есть мысли по этому поводу?

srnatan 21.02.2024 18:03

Сообщение об ошибке убедительно свидетельствует о том, что такой базы данных нет. На самом деле проблема с подключением не приведет к такому результату (это будет тайм-аут или что-то более важное). Обратите внимание, что имя базы данных не обязательно совпадает с именем RDS.

jarmod 21.02.2024 18:04

Вы получили доступ к экземпляру RDS с хоста-бастиона? Или с помощью команды mysql из частного экземпляра EC2? Вам необходимо подключиться к RDS MySQL с одного из этих серверов, запустить команду SHOW DATABASES; и убедиться, что БД с именем db-final-database действительно существует. В сообщении об ошибке говорится, что это не так. Как упоминал jarmod, то, что имя сервера RDS — db-final-database, не означает, что на этом сервере создана схема базы данных MySQL с именем db-final-database.

Mark B 21.02.2024 18:14

Внутри RDS я нажимаю «Создать базу данных», «Создание стандарта», выбираю движок MySQL и свободный уровень для развертывания на t2.micro. В идентификаторе экземпляра базы данных я помещаю имя. Я так понимаю, это имя базы данных или это экземпляр RDS? Затем я указываю пользователя и пароль, выбираю опцию «Не подключаться к вычислительному ресурсу EC2», выбираю тот же VPC и группу подсети, которую создаю. Публичный доступ «НЕТ». Я выбираю группу безопасности и аутентификацию по паролю. Правильно ли, что после развертывания конечной точкой является RDS, а выбранное мной имя — база данных?

srnatan 21.02.2024 18:18

Вы создали экземпляр базы данных RDS с MySQL. Вы не создали базу данных. Для этого вы подключаете клиент MySQL к экземпляру базы данных RDS, а затем используете SQL (или другой) для создания одной или нескольких баз данных. Терминология здесь, надо сказать, запутанная и противоречивая.

jarmod 21.02.2024 18:49

О боже, теперь все это имеет смысл. Большое спасибо за ваше внимание

srnatan 21.02.2024 19:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема здесь заключается в различном использовании термина «база данных». Им свойственно путаться.

Вы создали экземпляр базы данных RDS с MySQL. Это ресурс AWS. Это не база данных MySQL.

Вам действительно нужно создать базу данных MySQL. Для этого вы подключаете клиент MySQL к экземпляру базы данных RDS, а затем используете SQL (или другой) для создания одной или нескольких баз данных.

Другие вопросы по теме