我有一个连接到 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 获取他们的用户名/密码?
答案1
RDS 实例由 Amazon 管理。因此,为了防止您破坏复制等功能,您的用户(甚至是您在创建实例时设置的根用户)将不具有完全的超级用户权限。
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html
当您创建数据库实例时,您创建的主用户系统账户将分配给 rds_superuser 角色。rds_superuser 角色是一个预定义的 Amazon RDS 角色,类似于 PostgreSQL 超级用户角色(在本地实例中通常命名为 postgres),但有一些限制。与 PostgreSQL 超级用户角色一样,rds_superuser 角色对您的数据库实例拥有最多的权限,除非用户需要对数据库实例拥有最多的访问权限,否则您不应将此角色分配给用户。
答案2
\du+
如果你使用或列出你当前的权限\dg+
,你会注意到你不是超级用户,而只是允许权限创建角色,创建数据库。因此,您不能为自己分配高于当前权限的权限。
通常,在任何托管环境中,您都不会获得 root 或超级用户权限。我建议您启动自定义 EC2 实例并在本地安装 PostgreSQL 以实现完全控制。
答案3
我能想到的最接近的解决方法是执行以下操作:
GRANT "masteruser" TO "MyUser";
它并不是很好,它不是一个超级用户,但它会为你提供亚马逊允许你拥有的最大权限。