如何使用IAM凭证通过psql客户端访问AWS Redshift
用IAM身份通过psql访问AWS Redshift实操方案
前置前提
- 你本地/运行环境已经配置好AWS CLI,且已经完成对应IAM用户/角色的身份认证:本地可通过
~/.aws/credentials、环境变量注入身份,在EC2/ECS/Lambda等AWS服务内运行可直接给资源绑定符合权限的IAM角色,无需手动配置AKSK - 你使用的IAM身份已经绑定了包含
redshift:GetClusterCredentials权限的策略,权限覆盖对应Redshift集群、数据库用户、数据库资源 - Redshift集群已开启IAM身份访问权限,你要使用的数据库用户已存在,或者你给IAM身份开通了
redshift:CreateClusterUser权限支持自动创建用户
实现逻辑
psql本身不直接支持AWS IAM认证,你只需要先通过AWS CLI调用接口生成临时数据库凭证,再把临时凭证作为密码传入原有psql命令即可,不需要修改原有命令的核心结构。
具体操作步骤
步骤1:给IAM身份配置访问权限
参考示例策略配置,替换尖括号内的占位符为你实际的资源信息即可:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "redshift:GetClusterCredentials", "redshift:CreateClusterUser" ], "Resource": [ "arn:aws:redshift:<集群所在区域>:<你的AWS账号ID>:dbuser:<Redshift集群标识>/<数据库用户名>", "arn:aws:redshift:<集群所在区域>:<你的AWS账号ID>:dbname:<Redshift集群标识>/<数据库名>" ] } ] }
不需要自动创建用户的话可以去掉redshift:CreateClusterUser权限项。
步骤2:生成临时数据库凭证
通过AWS CLI命令生成临时密码,默认有效期15分钟,最长可设置为3600秒:
# 替换尖括号内的占位符为你实际的参数 credential=$(aws redshift get-cluster-credentials \ --cluster-identifier <你的Redshift集群名> \ --db-user <你的数据库用户名> \ --db-name <你的数据库名> \ --duration-seconds 3600 \ --query "join(' ', [DbUser, DbPassword])" \ --output text) # 拆分出可用的用户名和临时密码 db_user=$(echo $credential | awk '{print $1}') db_pass=$(echo $credential | awk '{print $2}')
步骤3:替换原有psql命令的密码参数
把你原有命令里的固定密码替换为上面生成的临时密码即可,完整执行示例:
redshift_query_output=$(PGPASSWORD=${db_pass} psql --no-align --quiet --field-separator=' ' -h ${host} -U ${db_user} -d $database_name -p $port_number <<< $run_redshift_query | sed -e '1d' | head -n -1)
常见问题排查
- 认证失败先执行
aws sts get-caller-identity确认当前使用的IAM身份和预期一致,且权限配置无错误 - 确认Redshift集群的安全组已经放行了运行环境的IP对集群端口的访问权限
- 确认权限策略里的集群标识、用户名、数据库名、区域等参数和实际调用参数完全匹配,该配置大小写敏感
内容的提问来源于stack exchange,提问作者GrandPa
相关产品推荐
相关产品推荐

