【问题标题】:Redshift Not Connecting to Host via Python ScriptRedshift 未通过 Python 脚本连接到主机
【发布时间】:2020-02-12 10:44:35
【问题描述】:

我目前在 S3 存储桶中有一个 .csv 文件,我想使用 Python 脚本将其附加到 Redshift 数据库中的表中。我有一个单独的文件解析器并上传到 S3,它工作得很好。

我用于连接/复制到表中的代码如下。我收到以下错误消息:

OperationalError:(psycopg2.OperationalError)无法连接到服务器:连接超时(0x0000274C/10060) 服务器是否在主机“redshift_cluster_name.unique_here.region.redshift.amazonaws.com”(18.221.51.45)上运行并接受 端口 5439 上的 TCP/IP 连接?

我可以确认以下几点:

  • 端口是 5439

  • 未加密

  • 集群名称/数据库名称/用户名/密码均正确

  • 可公开访问设置为“是”

我应该修复什么以确保我可以将 S3 中的文件连接到 Redshift?感谢大家提供的任何帮助。

我还查看了 Stack Overflow 和 ServerFault,但这些似乎要么是用于 MySQL 到 Redshift,要么是解决方案(如链接的 ServerFault CIDR 解决方案)不起作用。

感谢您的帮助!

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()
##############################################

【问题讨论】:

  • Redshift集群关联的安全组的配置是什么?您是从 Internet 连接,还是从 EC2 连接? Redshift 集群是否在公共子网中?
  • @JohnRotenstein 感谢您的回复!安全组仍设置为默认值 - 我创建了集群,目前是唯一一个访问它的人。我从互联网连接到它,而不是 EC2。我已通过this tutorial 将集群公开
  • 安全组是否配置为允许端口 5439 从0.0.0.0/0 入站?超时表示客户端无法访问集群。其他需要检查的是集群是否在公共子网中。出于测试目的,您可能希望使用 DBVisualizer 之类的 SQL 客户端。您是否能够连接到同一 VPC 中的其他任何东西(例如 Amazon EC2 实例)?这将有助于排除任何网络问题。
  • 我没有设置,没有。我现在可以通过 Python 脚本进行连接(还有其他单独的问题)。不过,这似乎导致了另一个错误——通过查询编辑器时,我现在无法在 Redshift 中看到我的数据库。尝试连接时,我收到以下消息:无法执行 HTTP 请求:连接到 18.221.51.45:1130 [/18.221.51.45] 失败:连接超时。这和刚刚做出的改变有关系吗?再次感谢您的帮助。
  • 很可能。你做了什么改变?好像是在尝试使用 1130 端口,有点不正常。

标签: python amazon-web-services amazon-s3 amazon-redshift


【解决方案1】:

通过 Python 程序连接需要与从 SQL 客户端连接相同的连接。

我创建了一个新集群,以便为您记录该过程。

这是我采取的步骤:

  • 创建了一个 VPC,其 CIDR 为 10.0.0.0/16。我真的不需要创建另一个 VPC,但我想避免之前的配置出现任何问题。
  • 在 VPC 中创建了一个子网,CIDR 为 10.0.0.0/24
  • 创建了一个互联网网关并将其附加到 VPC。
  • 编辑了默认路由表,将0.0.0.0/0 流量发送到互联网网关。 (我只是创建一个公共子网,所以不需要私有子网的路由表。)
  • 使用我创建的单个子网创建了一个 Redshift Cluster Subnet Group
  • 在集群子网组中启动一个单节点 Redshift 集群Publicly accessible = Yes,默认安全组。
  • 返回 VPC 控制台编辑默认安全组。为 Redshift from Anywhere 添加了入站规则。
  • 等待集群准备就绪。
  • 然后我使用DbVisualizer 登录到数据库。 成功!

以上步骤创建了一个公开可用的 Redshift 集群,我通过互联网从我的计算机连接到它。

【讨论】:

  • 谢谢!我今晚会完成这个。
  • 更新,成功了!看起来主要的事情是专门为 Redshift 添加入站规则,而不是所有流量并指定 0.0.0.0/0。非常感谢您在过去几天的帮助。
  • 它对我有用,但我还必须创建一个新的安全组。
猜你喜欢
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
相关资源
最近更新 更多