Description
Terraform Version
v1.4.5
Affected Resource(s)
postgresql_grant
Terraform Configuration Files
provider "postgresql" {
alias = "postgres_user"
host = var.db.forwarded_host
port = var.db.forwarded_port
username = 'postgres'
password = var.db.master_password
sslmode = "require"
superuser = false
}
resource "postgresql_database" "db_api" {
provider = postgresql.postgres_user
name = "api"
owner = postgresql_role.db_role_api.name
template = "template1"
}
resource "postgresql_role" "db_role_api" {
provider = postgresql.postgres_user
name = "api"
password = aws_secretsmanager_secret_version.db_password.secret_string
login = true
}
resource "postgresql_grant" "db_role_api_all_schema_access" {
provider = postgresql.postgres_user
database = postgresql_database.db_api.name
role = "api"
schema = "public"
object_type = "schema"
privileges = ["CREATE", "USAGE"]
}
Expected Behavior
Role 'api' should be granted CREATE and USAGE permissions for the 'public' schema in the 'api' database.
Actual Behavior
When terraform reaches the resource postgresql_grant.db_role_api_all_schema_access, it fails with the error below. Note that Postgres added a new role called pg_database_owner and this appears to be the role that is responsible for creating the postgresql_grant resource.
module.api.postgresql_grant.db_role_api_all_schema_access: Creating...
Error: Error granting role pg_database_owner to postgres: pq: role "pg_database_owner" cannot have explicit members
with module.api.postgresql_grant.db_role_api_all_schema_access,
on api/main.tf line 95, in resource "postgresql_grant" "db_role_api_all_schema_access":
Steps to Reproduce
terraform apply
Important Factoids
Attempting to grant permissions to the 'public' role also fails with the same issue above.
In PostgresSQL 14+, the default privileges of the "public" schema for newly created databases were modified to just "UPDATE". With PostgresSQL 13-, the 'public' schema was granted both "UPDATE' and "CREATE" privileges by default.
In PostgreSQL 14+, a new role called pg_database_owner was introduced and this appears to be the role that is responsible for executing the postgresql_role resource above.