我的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 !!! ”。
到目前为止,我已经采取了步骤来实现这一目标:
那么,有没有人对我应该检查什么有任何建议?
*我应该补充一点,我不是网络专家,所以也许我在某个地方犯了错误。
答案 0 :(得分:7)
超时可能是因为您的VPC中的lambda无法访问Internet以连接到您的群集(您似乎使用公共主机名进行连接)。您的连接选项取决于群集配置。由于您的lambda函数和集群都在同一个VPC中,您应该使用集群的私有IP 来连接它。在您的情况下,我认为简单地使用私有IP应该可以解决您的问题。
根据您的群集是否可公开访问,请注意以下几点。
如果您的群集配置为 NOT 可公开访问,则可以使用私有IP连接到群集中的来自运行在VPC中的lambda它应该工作。
如果您在VPC中拥有可公开访问的群集,并且您希望如此 通过使用VPC内的私有IP地址连接到它,确保以下VPC参数为true / yes :
验证/更改这些设置的步骤为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网关路由的子网中。