AWS Lambda超时连接到RedShift

Dan*_*aan 4 amazon-vpc amazon-redshift aws-lambda

我的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!!!');

    });

};
Run Code Online (Sandbox Code Playgroud)

不幸的是,我一直在60.00秒后任务超时.我在日志" 连接... "中看到,但从未" 连接!!! ".

我到目前为止采取的步骤是为了让它发挥作用:

  • 根据Connect Lambda到不同可用区域中的Redshift,我在同一个VPC中有Redshift集群和Lamba函数
  • Redshift群集和Lamba功能也在同一子网上
  • Redshift群集和Lamba函数共享相同的安全组
  • 根据此处的建议在Redshift群集的安全组中添加了入站规则(https://github.com/awslabs/aws-lambda-redshift-loader/issues/86)
  • 与Lamba函数关联的IAM角色具有以下策略:AmazonDMSRedshiftS3Role,AmazonRedshiftFullAccess,AWSLambdaBasicExecutionRole,AWSLambdaVPCAccessExecutionRole,AWSLambdaENIManagementAccess从此源加密:http://docs.aws.amazon.com/lambda/latest/dg/vpc.html(我意识到我在这里有一些重叠,但认为它应该没关系)
  • 根据之前列出的问题的答案,将弹性IP添加到安全组的入站规则中(即使我甚至没有在子网中配置NAT网关)
  • 已经增强VPC路由启用,因为我想我并不需要它.
  • 甚至通过在安全组中添加入站规则0.0.0.0/0 ALL类型,所有协议,所有端口来尝试它(遵循以下问题:从Lambda访问Redshift - 避免使用0.0.0.0/0安全组).但同样的问题!

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

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

use*_*510 7

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

根据您的群集是否可公开访问,需要记住一些要点.

  • 如果您的群集配置为不可公开访问,则可以使用专用IP从运行在VPC中的lambda 连接到群集,它应该可以正常工作.

  • 如果VPC中有可公开访问的群集,并且您希望使用VPC内的专用IP地址连接到该群集,请确保以下VPC参数为true/yes:

    • DNS解析
    • DNS主机名

此处给出验证/更改这些设置的步骤.

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

此外,这里的文档中的一个重要说明.

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

  • 就其价值而言,我也遇到了类似的问题。我的问题是我已将 lambda 设置为只能访问我的公共子网。我的公共子网将所有出站流量路由到互联网网关,而我的私有子网则通过 NAT 网关路由出站流量。但根据文档“您不能使用连接到 VPC 的 Internet 网关,因为这需要 ENI 具有公共 IP 地址。” 将 lambda 切换到私有子网(因此使用 NAT 网关)解决了该问题。 (2认同)