【发布时间】:2017-10-22 01:37:41
【问题描述】:
我的 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.00 秒后超时。我在日志中看到“Connecting...”,但从未看到“CONNECTED!!!”。
到目前为止,我已经采取了一些措施来实现这一点:
- 根据Connect Lambda to Redshift in Different Availability Zones,我在同一个 VPC 中有 Redshift 集群和 Lamba 功能
- Redshift 集群和 Lamba 函数也在同一子网
- Redshift 集群和 Lamba 函数共享同一个安全组
- 根据此处的建议 (https://github.com/awslabs/aws-lambda-redshift-loader/issues/86) 在 Redshift 集群的安全组中添加了入站规则
- 与 Lamba 函数关联的 IAM 角色具有以下策略:AmazonDMSRedshiftS3Role、AmazonRedshiftFullAccess、AWSLambdaBasicExecutionRole、AWSLambdaVPCAccessExecutionRole、AWSLambdaENIManagementAccess 来自此来源:http://docs.aws.amazon.com/lambda/latest/dg/vpc.html(I意识到我在这里有一些重叠,但认为这不重要)
- 根据前面列出的问题的答案将弹性 IP 添加到安全组的入站规则中(即使我什至没有在子网中配置 NAT 网关)
- 我没有启用增强型 VPC 路由,因为我认为我不需要它。
- 甚至尝试通过在安全组中添加入站规则0.0.0.0/0 ALL types, ALL protocols, ALL ports(以下问题:Accessing Redshift from Lambda - Avoiding the 0.0.0.0/0 Security Group)。 但同样的问题!
那么,有人对我应该检查的内容有什么建议吗?
*我应该补充一点,我不是网络专家,所以也许我在某个地方犯了错误。
【问题讨论】:
-
据我所知,你做的一切都很好。我有非常相似的设置,不同之处在于我们的 redshift 集群具有公共 ip,原因与 lambda 处理不同,并且后来从私有更改为公共。我也使用python,但应该不重要。如果您的计划中有 AWS 支持,我会使用它。如果您不想或不想解决这个问题,请在与您的 redshift 和 lambda 相同的 vpc 中设置一台小型 ec2 机器,看看是否可以从那里连接。如果可以,问题可能出在您的 lambda 上,如果不能,则问题可能出在您的 vpc/RS 上。
-
感谢您的评论,但我使用了公共主机名,而我应该使用私有 IP(请参阅接受的答案)
-
啊废话,对不起,这个标签从昨天开始就在我的浏览器中,没有看到答案:)
-
不用担心。你很友善地尝试提供帮助......
标签: aws-lambda amazon-redshift amazon-vpc