Экземпляр AWS Postgresql RDS «не существует» с docker-compose и Django

#django #postgresql #amazon-web-services #docker-compose #amazon-rds

Вопрос:

Мой RDS и веб — контейнер не подключены.

Но я выполнил все настройки, связанные с базой данных, в настройках Django , и я также AWS RDS правильно настроился.

Что я должен делать больше?

Это DATABASES файл настроек Django .

 DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": env("SQL_DATABASE"),
        "USER": env("SQL_USER"),
        "PASSWORD": env("SQL_PASSWORD"),
        "HOST": env("SQL_HOST"),
        "PORT": env("SQL_PORT"),
    }
}

 

Я пропустил docker-compose.yml операцию «с nginx-proxy или TLS «.

Когда я тестировал в локальной среде, я создавал и монтировал контейнеры БД docker-compose , но в prod средах я не создавал контейнеры БД, потому что я использую AWS RDS . Будет ли это проблемой?

Пожалуйста, помогите мне.

(ps.Все PROJECT_NAME они заменили фактическое название проекта.)

Это мой docker-compose.yml

 version: '3.8'

services:

  web:
    build:
      context: .
      dockerfile: prod.Dockerfile
    image: project:web
    command: gunicorn PROJECT_NAME.wsgi:application --bind 0.0.0.0:8000
    env_file:
      - envs/.env.prod
    volumes:
      - static_volume:/home/app/web/static
      - media_volume:/home/app/web/media
    expose:
      - 8000
    entrypoint:
      - sh
      - config/docker/entrypoint.prod.sh

volumes:
  static_volume:
  media_volume:


 

Это то, из-за чего я получил ошибку docker

 Waiting for postgres...
PostgreSQL started

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 200, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection
    connection = Database.connect(**conn_params)
  File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL:  database "db-PROJECT_NAME-ec2" does not exist


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 330, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 371, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 85, in wrapped
    res = handle_func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/migrate.py", line 92, in handle
    executor = MigrationExecutor(connection, self.migration_progress_callback)
  File "/usr/local/lib/python3.8/site-packages/django/db/migrations/executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 53, in __init__
    self.build_graph()
  File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 216, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 77, in applied_migrations
    if self.has_table():
  File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 55, in has_table
    with self.connection.cursor() as cursor:
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 259, in cursor
    return self._cursor()
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 235, in _cursor
    self.ensure_connection()
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 200, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection
    connection = Database.connect(**conn_params)
  File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
django.db.utils.OperationalError: FATAL:  database "db-PROJECT_NAME-ec2" does not exist

[2021-09-18 15:09:21  0000] [1] [INFO] Starting gunicorn 20.0.4
[2021-09-18 15:09:21  0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
[2021-09-18 15:09:21  0000] [1] [INFO] Using worker: sync
[2021-09-18 15:09:21  0000] [12] [INFO] Booting worker with pid: 12
 

Комментарии:

1. Когда вы подключаетесь к кластеру баз данных RDS, например, с помощью клиента myself, видите ли вы, что он содержит базу данных db-PROJECT_NAME-ec2?

2. Почему докер говорит»В ожидании postgres… Запущен PostgreSQL» если вы не настраиваете базу данных в docker?

3. отредактируйте файл конфигурации с паролем, чтобы в нем был неверный пароль. Это должно прояснить, действительно ли вы используете файл конфигурации, о котором вы думаете, и если да, то новое сообщение об ошибке может дать еще несколько подсказок.

4. @LRutten Вы имеете в виду, вы спрашиваете, есть ли db-ИМЯ_ПРОЕКТА-ec2 в идентификаторе базы данных AWS RDS? Тогда да.

5. @LRutten Большое вам спасибо за ваши ответы. Я решил эту проблему. Когда я создал новую базу данных в RDS, это было решено. Как вы уже сказали, похоже, что настройка создания БД была неправильно настроена при создании экземпляра в RDS. И имя экземпляра БД было db-ИМЯ_ПРОЕКТА-ec2, но имя БД имело отдельную настройку.

Ответ №1:

Наиболее вероятная причина заключается в том, что AWS RDS имя экземпляра БД отличается от имени БД PostgreSQL.

В соответствии с руководством AWS RDS

Для баз данных выберите имя нового экземпляра БД.

На консоли RDS отображаются сведения о новом экземпляре БД. Экземпляр БД находится в состоянии создания до тех пор, пока экземпляр БД не будет создан и готов к использованию. Когда состояние изменится на доступно, вы сможете подключиться к экземпляру БД. В зависимости от класса экземпляра БД и выделенного хранилища, доступ к новому экземпляру может занять несколько минут.

Согласно PostgreSQL: Документация

dbname

Указывает имя создаваемой базы данных. Имя должно быть уникальным среди всех баз данных PostgreSQL в этом кластере. По умолчанию создается база данных с тем же именем, что и у текущего системного пользователя.

Значение по умолчанию dbname равно postgres

Таким образом, вы можете попробовать postgres вместо db-PROJECT_NAME-ec2 этого использовать имя базы данных.

Комментарии:

1. Хотя я уже решил эту проблему, спасибо вам за ваш ответ. Имя пользователя БД по умолчанию-postgres, но имя БД по умолчанию не было postgres, когда я создавал экземпляр RDS.