为什么我无法在AWS的Postgresql实例中创建超级用户?

我有一个连接到RDS实例(Postgresql)的AWS EC2实例。当我创建RDS实例时,我告诉它数据库根用户的用户名是:my_user1,密码是password1。现在我正在尝试创建一个角色和超级用户,但是失败了。
$ createuser -P -d -s -e my_user2 --host myhost.com -U my_user1
Enter password for new role: XXXYYYZZZ
Enter it again: XXXYYYZZZ
Password: password1
CREATE ROLE my_user2 PASSWORD 'md5999999c0101a1d64afd57575e06f999c' SUPERUSER CREATEDB  CREATEROLE INHERIT LOGIN;
createuser: creation of new role failed: ERROR:  must be superuser to create superusers
$
当我不带上-s标志重复这个命令时,它可以正常工作。
$ createuser -P -d -e my_user2 --host myhost.com  -U my_user1
Enter password for new role:
Enter it again:
Password:
CREATE ROLE my_user2 PASSWORD 'md5999999c0101a1d64afd57575e06f888c' NOSUPERUSER CREATEDB NOCREATEROLE INHERIT LOGIN;
$
显然,my_user1没有权限创建超级用户。但这是我告诉RDS的管理员用户!如果my_user1没有权限创建超级用户,那么谁有权限呢?我该如何从AWS获取他们的用户名/密码?

pg_hba.conf文件是否指定了本地用户的身份验证方案为peer? - drookie
Drookie,这个文件是在RDS实例本身上吗?我甚至还没有通过SSH登录到那台机器上。 - Saqib Ali
@SaqibAli 你无法通过SSH连接到RDS实例。 - ceejayoz
3个回答

RDS实例由亚马逊管理。因此,为了防止您破坏诸如复制等功能,即使是您在创建实例时设置的根用户,也不会拥有完全的超级用户权限。

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html

创建数据库实例时,您所创建的主用户系统帐户将被分配给rds_superuser角色。rds_superuser角色是一个预定义的Amazon RDS角色,类似于PostgreSQL超级用户角色(在本地实例中通常命名为postgres),但有一些限制。与PostgreSQL超级用户角色一样,rds_superuser角色在您的数据库实例上拥有最高权限,除非用户需要对数据库实例进行最大程度的访问,否则不应将此角色分配给他们。

8我无法使用pg_dump备份我的数据库,因为没有超级用户标志。在AWS的RDS上有没有解决办法? - chovy
@chovy,尝试将数据库所有者角色授予您的用户。 - Spike

如果您使用\du+\dg+列出当前权限,您会注意到您不是超级用户,只允许有创建角色、创建数据库的权限。因此,您无法给自己分配比当前权限更高的权限。 通常在任何托管环境中,您都不会被授予root或超级用户权限。我建议您启动一个自定义的EC2实例,并在本地安装PostgreSQL以获得完全控制权。

2就没有其他的方法可以使用pg_dump备份Amazon RDS数据库吗? - chovy
@chovy 用户可以使用 "postgres" 来备份数据库。 - RonJohn

我能想到的最接近的解决办法是执行以下操作:
GRANT "masteruser" TO "MyUser";
这不是很好,也不是超级用户,但它将为您获取亚马逊允许的最多权限。