将 AWS Lambda 连接到 Redshift - 60 秒后超时

Posted

技术标签:

【中文标题】将 AWS Lambda 连接到 Redshift - 60 秒后超时【英文标题】:Conecting AWS Lambda to Redshift - Times out after 60 seconds 【发布时间】:2015-03-31 15:33:30 【问题描述】:

我创建了一个 AWS Lambda 函数:

通过 JDBC URL 登录 Redshift 运行查询

在本地,使用Node,我可以通过JDBC成功连接到Redshift实例,并执行查询。

var conString = "postgresql://USER_NAME:PASSWORD@JDBC_URL”;
var client = new pg.Client(conString);
client.connect(function(err)    
  if(err) 
            
      console.log('could not connect to redshift', err);
          
    
          
// omitted due to above error

但是,当我在 AWS Lambda 上执行该函数时(它包含在 async#waterfall 块中),AWS Cloudwatch 日志告诉我 AWS Lambda 函数在 60 秒后超时。

关于为什么我的函数无法连接的任何想法?

【问题讨论】:

【参考方案1】:

我发现要么您将 Redshift 安全组公开给所有来源,要么不公开。因为 Lambda 函数不在固定地址甚至固定范围的 IP 地址上运行,这对用户完全透明(AKA 无服务器)。

我刚刚看到亚马逊昨天宣布了支持 VPC 的新 Lambda 功能。我想如果我们可以在 VPC 中运行 Redshift 集群,这可以解决问题。

【讨论】:

这不是连接问题,而是长时间查询时超时 @MartijnScheffer 一个数据库连接问题通常会导致超时。不难在数据库端验证是否有任何查询实际运行 是的,但这不是这里的主题,他在谈论 AWS lambda 超时,这就是我的理解,但是,它可能是连接失败,或者是长查询达到 lambda 的超时,它很容易找到,运行一个非常短的查询(select count(*) ....)如果可行,那就是 lambda 是的,它的连接,我错了,可能是 IAM 问题,角色,访问权限?【参考方案2】:

如果你使用 serverless-framework v1.5.0,你应该添加:

iamRoleStatements: - Effect: Allow Action: - ec2:CreateNetworkInterface Resource: '*' - Effect: Allow Action: - ec2:DeleteNetworkInterface - ec2:DescribeNetworkInterfaces Resource: 'arn:aws:ec2:$self:provider.region:*:network-interface/*'

还应将所有 securityGroupIds 添加到入站规则中,如下所示:

更多信息:https://serverless.com/framework/docs/providers/aws/guide/functions/#vpc-configuration

【讨论】:

再说一次,这与访问权限无关,而是由于一分钟超时

以上是关于将 AWS Lambda 连接到 Redshift - 60 秒后超时的主要内容,如果未能解决你的问题,请参考以下文章

从没有 VPC 的 Lambda 连接到公共 Redshift 数据库

无法从 AWS lambda 连接 AWS redshift

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

Google Data Studio 目前可以连接到 AWS RDS 或 Redshift 吗?

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

无法连接到 aws redshift