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

我创build了一个AWS Lambda函数:

  • 通过JDBC URLlogin到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上执行该function(包装在asynchronous#瀑布块中)时,AWS Cloudwatch日志告诉我,AWS Lambdafunction在60秒后超时。

任何想法,为什么我的function无法连接?

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

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

如果您使用的是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添加到入站规则,如下所示: 截图2017-01-09 23 02 33

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

退一步,我会build议使用Kinesis [1] firehose为了连接lambda和redshift。 如文献[2]所build议的那样,这是更好的方法。

Kinesis可以使用s3作为中间存储来自动使用复制命令将数据推送到红移。

“COPY命令是加载表的最有效的方法,也可以使用INSERT命令将数据添加到表中,尽pipe它比使用COPY”

脚注:[1] http://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html

[2] http://docs.aws.amazon.com/redshift/latest/dg/t_Loading_data.html