无法从 lambda 中的 python 连接到 aws redshift

Posted

技术标签:

【中文标题】无法从 lambda 中的 python 连接到 aws redshift【英文标题】:Unable to connect to aws redshift from python within lambda 【发布时间】:2020-10-12 13:45:33 【问题描述】:

我正在尝试通过 lambda 使用 python 连接到 redshift。目的是对redshift数据库进行查询。

我已经通过获取临时 aws 凭据并连接到 psycopg2 来尝试 this,但没有任何错误消息就无法成功。 (即:lambda 刚刚超时)

rs_host = "mytest-cluster.fooooooobaaarrrr.region111111.redshift.amazonaws.com"
rs_port = 5439
rs_dbname = "dev"
db_user = "barrr_user"

def lambda_handler(events, contx):
    # The cluster_creds is able to be obtained successfully. No issses here
    cluster_creds = client.get_cluster_credentials(DbUser=db_user,
                                                   DbName=rs_dbname,
                                                   ClusterIdentifier="mytest-cluster",
                                                   AutoCreate=False)

    try:
        # It is this psycopg2 connection that cant work... 
        conn = psycopg2.connect(host=rs_host,
                                port=rs_port,
                                user=cluster_creds['DbUser'],
                                password=cluster_creds['DbPassword'],
                                database=rs_dbname
    )
        return conn

    except Exception as e:
        print(e)

此外,lambda 执行角色本身具有以下策略:

我不知道为什么我仍然无法通过 python 连接到 redshift 来执行查询。

我也尝试过使用 sqlalchemy 库,但没有运气。

【问题讨论】:

可能是网络问题。您的 Redshift 安全组是否对运行 Lambda 函数的位置开放? 嗨,乔纳森,对不起,你这是什么意思?您是在询问 redshift 集群权限是否附加了 IAM 角色? 不,我是问你是否从网络角度打开了集群:docs.aws.amazon.com/redshift/latest/mgmt/… 是的,你是对的。我的 VPC 附加到的安全组...我使用的是默认值,默认情况下,所有内容都被阻止。谢谢! 【参考方案1】:

正如上面提到的乔纳森雅各布森。是安全组和网络权限导致了我的问题。

【讨论】:

【参考方案2】:

您可以查看Create AWS Lambda Function to Connect Amazon Redshift with C-Sharp in Visual Studio 的文档

由于您已经在 Python 中编写了代码,因此您可以专注于教程的网络部分

在启动 AWS Lambda 函数时,可以选择 VPC 和子网,无服务器 Lambda 函数服务器将在其中启动

您可以选择完全相同的 VPC 和您在其中创建 Amazon Redshift 集群的子网

另外,修改您附加到 AWS Lambda 函数的 IAM 角色。它还需要 AWSLambdaVPCAccessExecutionRole 策略

这将解决来自不同 VPC 的连接之间的问题 同样,即使您已在与 Redshift 集群相同的 VPC 和子网中启动了 lambda 函数,最好检查集群的安全组,以便它接受连接

希望它有效,

【讨论】:

以上是关于无法从 lambda 中的 python 连接到 aws redshift的主要内容,如果未能解决你的问题,请参考以下文章

如何从 AWS Lambda Python 连接到 Informix DB

AWS Lambda 无法连接到 RDS 实例,但我可以在本地连接?

无法从 AWS Lambda 连接到 AWS RDS MySql DB。 ClassNotFoundException:com.mysql.jdbc

Lambda 函数无法连接到 Redshift:名称解析暂时失败

使用 AWS Lambda 连接到 Oracle RDS 时出现错误 (DPI-1047)

如何将 Cloud9 (python) 连接到 VPC 中的 Redshift?