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"]
}