RedShift未通过Python脚本连接到主机
问题描述
我目前在S3存储桶中有一个.csv文件,我想使用Python脚本将其附加到RedShift数据库中的表中。我有一个单独的文件解析器并上传到S3,工作正常。我拥有的用于连接/复制到表中的代码如下所示。我收到以下错误消息:
OperationalError:(ological copg2.OperationalError)无法连接到服务器:连接超时(0x0000274C/10060) 服务器是否在主机"redshift_cluster_name.unique_here.region.redshift.amazonaws.com"(18.221.51.45)上运行并接受 端口5439上的TCP/IP连接?
我可以确认以下几点:
端口为5439
未加密
群集名称/数据库名称/用户名/密码均正确
可公开访问设置为"是"
我还查看了堆栈溢出和ServerFault,但这些似乎要么是针对MySQL的RedShift,要么是解决方案(如链接的ServerFaultCIDR解决方案)不起作用。
感谢您的帮助!
DATABASE = "db"
USER = "user"
PASSWORD = "password"
HOST = "redshift_cluster_name.unique_here.region.redshift.amazonaws.com"
PORT = "5439"
SCHEMA = "public"
S3_FULL_PATH = 's3://bucket/file.csv'
#ARN_CREDENTIALS = 'arn:aws:iam::aws_id:role/myRedshiftRole'
REGION = 'region'
############ CONNECTING AND CREATING SESSIONS ############
connection_string = f"redshift+psycopg2://{USER}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}"
engine = sa.create_engine(connection_string)
session = sessionmaker()
session.configure(bind=engine)
s = session()
SetPath = f"SET search_path TO {SCHEMA}"
s.execute(SetPath)
###########################################################
############ RUNNING COPY ############
copy_command = f
'''
copy category from '{S3_FULL_PATH}'
credentials 'aws_iam_role={ARN_CREDENTIALS}'
delimiter ',' region '{REGION}';
'''
s.execute(copy_command)
s.commit()
######################################
#################CLOSE SESSION################
s.close()
##############################################
解决方案
通过Python程序连接需要与从SQL客户端连接相同的连接。
我创建了一个新群集,以便可以为您记录该过程。
以下是我采取的步骤:
- 创建了CIDR为
10.0.0.0/16
的私有网络。我并不需要再创建一个私有网络,但是我希望避免之前的配置出现问题。 - 在私有网络中创建了CIDR为
10.0.0.0/24
的子网。 - 创建网关并附加到私有网络。
- 已编辑默认路由表以将
0.0.0.0/0
流量发送到Internet网关。(我只创建公有子网,私有子网不需要路由表。) - 使用我创建的单个子网创建了红移群集子网组。
- 将单节点红移群集启动到群集子网组。
Publicly accessible = Yes
,默认安全组。 - 返回私有网络控制台编辑默认安全组。添加了从任何位置进行红移的入站规则。
- 等待群集准备就绪。
- 然后我使用DbVisualizer登录到数据库。成功!
以上步骤创建了一个公开可用的RedShift群集,我已从Internet上的计算机连接到该群集。
相关文章