如何在EMR上无需AWS凭证实现Python与Redshift的连接
EMR环境Python免硬编码凭证连接Redshift方案
核心原理
依托EMR集群默认绑定的EC2实例IAM角色,自动获取AWS临时凭证调用Redshift接口生成数据库临时登录信息,全程不需要手动写入AK/SK,完全使用AWS原生服务,无第三方依赖。
前置配置
- 找到EMR集群对应的EC2实例配置文件角色(默认角色名为
EMR_EC2_DefaultRole,自定义角色请替换为实际使用的角色),为其附加如下权限:- 允许执行
redshift:GetClusterCredentials操作,资源范围限制为目标Redshift集群ARN - 若配置
AutoCreate=True自动创建数据库用户,还需要附加对应数据库用户、用户组的相关权限
- 允许执行
- 网络配置:确保EMR集群安全组允许出站到Redshift的默认端口5439,Redshift集群安全组允许EMR集群安全组的IP段入站访问5439端口
环境依赖安装
EMR环境中默认预装boto3,仅需要安装Redshift连接驱动即可,执行如下命令:pip install psycopg2-binary
如果使用Redshift官方驱动,也可以安装redshift-connector
连接代码示例
import boto3 import psycopg2 from psycopg2 import OperationalError # 替换为实际业务参数 REDSHIFT_CLUSTER_ID = "your-redshift-cluster-id" REDSHIFT_DB_NAME = "your-database-name" REDSHIFT_ENDPOINT = "your-redshift-cluster-endpoint" REDSHIFT_PORT = 5439 DB_USER = "your-db-username" AWS_REGION = "your-aws-region" # 自动从EMR实例元数据获取IAM角色凭证,无需手动配置密钥 redshift_client = boto3.client("redshift", region_name=AWS_REGION) # 获取Redshift数据库临时登录凭证 credential_resp = redshift_client.get_cluster_credentials( ClusterIdentifier=REDSHIFT_CLUSTER_ID, DbUser=DB_USER, DbName=REDSHIFT_DB_NAME, AutoCreate=False, DurationSeconds=3600 ) # 建立数据库连接 try: conn = psycopg2.connect( host=REDSHIFT_ENDPOINT, port=REDSHIFT_PORT, dbname=REDSHIFT_DB_NAME, user=credential_resp["DbUser"], password=credential_resp["DbPassword"] ) print("Redshift连接成功") # 下方写入业务SQL逻辑 # cur = conn.cursor() # cur.execute("SELECT version()") # print(cur.fetchone()) except OperationalError as e: print(f"连接失败:{str(e)}") finally: if "conn" in locals() and not conn.closed: conn.close() print("连接已释放")
注意事项
- 临时凭证默认有效期最短15分钟、最长36000秒,长时间运行的任务可以在凭证过期前重新调用
get_cluster_credentials获取新凭证重连 - IAM角色权限请遵循最小权限原则,不要授予跨集群、跨账号的访问权限
- 如果Redshift启用了SSL连接,只需要在
psycopg2.connect参数中添加sslmode='require'即可
内容的提问来源于stack exchange,提问作者Dhilip Surya
相关产品推荐
相关产品推荐

