Django migrate не будет работать из-за ошибки Postgres InsufficientPrivilege, обеспечиваемой terraform и helm

Мы столкнулись с проблемой в нашем приложении Django и не можем найти основную проблему.

Наше приложение Django работает на Kubernetes и управляется Helm. Когда мы обновляем приложение, запускается задание обновления Helm, которое обеспечивает запуск manage.py migrate. Задание migrate запускается с правами администратора базы данных, а не с ролью клиента postgres.

Ошибка, которую мы получаем: InsufficientPrivilege: permission denied for table RouteInstance

Эта ошибка должна иметь какое-то отношение к созданию ссылки из новой таблицы на существующую таблицу, но мы не можем ее найти. Возможно, это в конфигурации ресурсов Terraform, или грантов недостаточно. Мы не используем никаких дополнительных грантов, поскольку учетная запись администратора должна быть настоящим администратором (Digitalocean doadmin)

Любая помощь была бы потрясающей, мы застряли на данный момент.

Некоторый контекст по развертыванию нашего приложения:

Шаблон Helm развертывается с помощью Terraform, развертывание приложения состоит из:

  • Создайте запись поддомена
  • Создайте пространство имен
  • Создайте S3 buckets и аккаунт
  • Разверните таблицу Helm (helm_release), здесь мы используем список значений с файлом шаблона. Между этими значениями находятся переменные:
    • postgres_user_username (используется для запуска приложения)
    • postgres_user_password
    • postgres_admin_username (используется для выполнения задания обновления штурвала, содержащего migrate)
    • .
    • postgres_admin_password
  • Создайте роль postgresql_ для клиента (их приложение работает под ролью postgres клиента)
  • Создайте базу данных postgresql_ для приложения
  • Установите postgresql_default_privileges (table, sequence), см. конфигурацию ниже

Конфигурации ресурсов Терраформы:

resource "postgresql_default_privileges" "postgres_privileges_database" {
  role = postgresql_role.postgres_role.name
  database = postgresql_database.app_database.name
  schema = "public"

  owner = postgresql_role.postgres_role.name
  object_type = "table"
  privileges = ["SELECT", "INSERT", "UPDATE", "DELETE"]
}

resource "postgresql_default_privileges" "postgres_privileges_sequence" {
  role = postgresql_role.postgres_role.name
  database = postgresql_database.app_database.name
  schema = "public"

  owner = postgresql_role.postgres_role.name
  object_type = "sequence"
  privileges  = ["USAGE", "SELECT"]
}

  resource "postgresql_grant" "postgres_grant_database" {
  database = postgresql_database.app_database.name
  role = postgresql_role.postgres_role.name
  object_type = "database"
  privileges = ["CONNECT"]
}

resource "postgresql_grant" "postgres_grant_tables" {
  database = postgresql_database.app_database.name
  role = postgresql_role.postgres_role.name
  schema = "public"
  object_type = "table"
  privileges = ["SELECT", "INSERT", "UPDATE", "DELETE"]
}

resource "postgresql_grant" "postgres_grant_sequences" {
  database    = postgresql_database.app_database.name
  role        = postgresql_role.postgres_role.name
  schema      = "public"
  object_type = "sequence"
  privileges  = ["USAGE", "SELECT", "UPDATE"]
}
Вернуться на верх