AWS Lambda超时连接到RedShift

时间:2017-05-22 11:49:24

标签: aws-lambda amazon-redshift amazon-vpc

我的Redshift群集位于私人VPC中。我在Node.js中写了以下AWS Lamba,它应该连接到Redshift(为这个问题打扮):

'use strict';
console.log('Loading function');

const pg = require('pg');

exports.handler = (event, context, callback) => {
var client = new pg.Client({
    user: 'myuser',
    database: 'mydatabase',
    password: 'mypassword',
    port: 5439,
    host: 'myhost.eu-west-1.redshift.amazonaws.com'
});


    // connect to our database
    console.log('Connecting...');
    client.connect(function (err) {
        if (err) throw err;

        console.log('CONNECTED!!!');

    });

};

不幸的是,我继续<60> 60.00秒后任务超时。我在日志中看到“正在连接...... ”,但绝不会“ CONNECTED !!! ”。

到目前为止,我已经采取了步骤来实现这一目标:

那么,有没有人对我应该检查什么有任何建议?

*我应该补充一点,我不是网络专家,所以也许我在某个地方犯了错误。

3 个答案:

答案 0 :(得分:7)

超时可能是因为您的VPC中的lambda无法访问Internet以连接到您的群集(您似乎使用公共主机名进行连接)。您的连接选项取决于群集配置。由于您的lambda函数和集群都在同一个VPC中,您应该使用集群的私有IP 来连接它。在您的情况下,我认为简单地使用私有IP应该可以解决您的问题。

根据您的群集是否可公开访问,请注意以下几点。

  • 如果您的群集配置为 NOT 可公开访问,则可以使用私有IP连接到群集中的来自运行在VPC中的lambda它应该工作。

  • 如果您在VPC中拥有可公开访问的群集,并且您希望如此 通过使用VPC内的私有IP地址连接到它,确保以下VPC参数为true / yes

    • DNS解析
    • DNS主机名

验证/更改这些设置的步骤为here

如果您未将这些参数设置为true,则来自VPC内的连接将解析为EIP而不是私有IP,并且您的lambda将无法连接而无法访问(需要NAT网关或NAT实例)。

此外,文档here中的重要注释

  

如果您在VPC中有现有的可公开访问的群集,   VPC内的连接将继续使用EIP   即使您调整了这些参数,也会连接到群集,直到您调整大小   集群。任何新的群集都将遵循新的使用行为   连接到公共可访问时的私有IP地址   来自同一个VPC的集群。

答案 1 :(得分:0)

将VPC的CIDR范围添加到Redshift入站规则后,我的问题得到解决。

答案 2 :(得分:-1)

我遇到了同样的问题,并按照上述步骤操作,发现对于我而言,问题是lambda位于没有通往NAT网关路由的子网中。因此,我将lambda移到了具有到NAT网关路由的子网中。