JDBC通过IAM账号连接Amazon Redshift报用户不存在异常
异常触发原因
这个报错的核心逻辑是:使用jdbc:redshift:iam前缀的IAM认证方式连接时,驱动会先用传入的AK/SK调用AWS STS服务获取对应IAM身份的临时数据库凭证,再用该凭证登录Redshift。从报错信息看,你传入的AK/SK对应的IAM用户名为SSh,Redshift要求IAM认证对应的数据库用户名必须严格匹配IAM:<IAM用户名>的格式,而当前你的Redshift集群内不存在名为IAM:SSh的数据库用户,因此直接抛出用户不存在的致命错误。
排查步骤
- 先校验传入的AK/SK归属:到IAM控制台核对你代码里填的AccessKeyID对应的身份是否为预期的IAM用户,确认没有误用其他IAM用户(比如其他子账号、其他环境的密钥),避免因为拿错密钥导致匹配到错误的用户名。
- 用集群管理员账号(创建集群时设置的初始高权限账号)登录Redshift,执行以下SQL检查目标用户是否存在:
SELECT usename FROM pg_user WHERE usename = 'IAM:SSh';
如果查询无返回结果,即可确认是缺少对应数据库用户导致的报错。
- 如果查询显示用户已存在,检查用户名的大小写、拼写是否完全和
IAM:SSh一致,Redshift的用户名大小写敏感,任何拼写偏差、多余空格都会导致识别失败。
可行解决方案
- 手动创建对应数据库用户:用管理员账号执行以下SQL创建匹配用户,并按需分配权限,创建完成后即可重试连接:
-- 创建IAM认证专用用户,禁用密码登录 CREATE USER "IAM:SSh" PASSWORD DISABLE; -- 按需授予schema使用权限 GRANT USAGE ON SCHEMA public TO "IAM:SSh"; -- 按需授予表的读写权限 GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO "IAM:SSh"; -- 可选:配置默认权限,让该用户自动获得public schema下后续新建表的对应权限 ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO "IAM:SSh";
- 开启自动建用户能力:如果不想每次新增IAM授权用户都手动在库内创建,可以在JDBC连接串末尾添加参数开启自动创建,注意前提是该IAM用户必须拥有
redshift:CreateClusterUser的IAM权限,修改后的连接串示例:
String connectString ="jdbc:redshift:iam://redshift-cluster-vms.my_cluster.amazonaws.com:5439/dev?AccessKeyID=AKI*********DD&SecretAccessKey=tGv********************mQU&AllowDBUserOverride=1&AutoCreate=true";
风险提示:开启自动创建用户前必须做好IAM权限边界管控,避免未授权的身份通过该方式自动获得数据库访问权限。
- 补充注意:如果后续使用IAM角色而非IAM用户做认证,对应的数据库用户名格式为
IAMR:<角色名>,不要和IAM用户的命名规则混淆。
内容的提问来源于stack exchange,提问作者Sergey Shabalov
相关产品推荐
相关产品推荐

