如何使用Python Jupyter Notebook连接AWS Redshift提取数据并解决连接超时错误
错误原因与解决方案
这个报错属于网络层连通性故障,你无法和Redshift集群建立TCP连接,按以下顺序排查即可解决:
1. 优先确认端口配置
- Redshift默认服务端口为5439,你当前代码中填写的端口为8200,先登录AWS Redshift控制台进入集群详情页,确认集群实际监听的端口,将代码中
port参数修改为对应值。如果确实是你自定义了8200端口再继续往下排查。
2. 检查集群公开访问权限
- 如果你的Jupyter Notebook运行在本地设备,需要确认Redshift集群的可公开访问开关已经开启;如果Jupyter运行在和Redshift同AWS VPC的服务中,不需要开启公网访问,但要保证两者属于同一VPC或者VPC对等连接已配置。
3. 调整安全组入站规则
- 找到Redshift集群绑定的安全组,添加TCP入站规则:允许你本地设备的公网IP(或者Jupyter部署环境的出口IP)访问集群对应的端口(默认5439/你自定义的8200)。
4. 排查本地/部署环境网络限制
- 检查本地防火墙、公司代理/出口策略是否禁止了对应端口的对外访问,你可以用以下命令先测试网络连通性:
telnet db_name-3d15f6e600bd37dbd0c9a.cutowxhzbeso.ap-south-1.redshift.amazonaws.com 8200
如果telnet也超时,说明问题出在网络链路拦截,和代码无关。
5. 优化后代码参考(网络排查完成后使用)
!pip install pandas psycopg2-binary sqlalchemy import pandas as pd from sqlalchemy import create_engine, text # 替换为确认后的正确参数 redshift_endpoint = 'db_name-3d15f6e600bd37dbd0c9a.cutowxhzbeso.ap-south-1.redshift.amazonaws.com' redshift_user = 'username' redshift_password = 'password' port = 5439 # 替换为实际集群端口 db_name = 'db_name' engine_string = f"postgresql+psycopg2://{redshift_user}:{redshift_password}@{redshift_endpoint}:{port}/{db_name}" engine = create_engine(engine_string) df = pd.read_sql(text("SELECT * FROM table_name LIMIT 10"), engine) print(df.head())
内容的提问来源于stack exchange,提问作者HIMANSHU KUMAR
相关产品推荐
相关产品推荐

