将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添加到入站规则,如下所示:
更多信息: 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 。