【问题标题】:AWS Lambda times out connecting to RedShiftAWS Lambda 连接到 RedShift 超时
【发布时间】: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!!!”。

到目前为止,我已经采取了一些措施来实现这一点:

那么,有人对我应该检查的内容有什么建议吗?

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

【问题讨论】:

  • 据我所知,你做的一切都很好。我有非常相似的设置,不同之处在于我们的 redshift 集群具有公共 ip,原因与 lambda 处理不同,并且后来从私有更改为公共。我也使用python,但应该不重要。如果您的计划中有 AWS 支持,我会使用它。如果您不想或不想解决这个问题,请在与您的 redshift 和 lambda 相同的 vpc 中设置一台小型 ec2 机器,看看是否可以从那里连接。如果可以,问题可能出在您的 lambda 上,如果不能,则问题可能出在您的 vpc/RS 上。
  • 感谢您的评论,但我使用了公共主机名,而我应该使用私有 IP(请参阅接受的答案)
  • 啊废话,对不起,这个标签从昨天开始就在我的浏览器中,没有看到答案:)
  • 不用担心。你很友善地尝试提供帮助......

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


【解决方案1】:

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

根据您的集群是否可公开访问,有几点需要牢记。

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

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

    • DNS 解析
    • DNS 主机名

验证/更改这些设置的步骤在here 中给出。

如果您不将这些参数设置为 true来自 VPC 内的连接将解析为 EIP 而不是私有 IP,并且您的 lambda 将无法在没有 Internet 访问权限的情况下进行连接 (需要一个 NAT 网关或一个 NAT 实例)。

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

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

【讨论】:

  • 哦不!我正在使用公共主机名进行连接!非常感谢。这样就解决了。
  • 对于它的价值,我遇到了类似的问题。我的问题是我将 lambda 设置为只能访问我的公共子网。我的公共子网将所有出站流量路由到 Internet 网关,而我的私有子网通过 NAT 网关路由出站流量。但是根据文档“您不能使用连接到您的 VPC 的 Internet 网关,因为这需要 ENI 具有公共 IP 地址。”将 lambda 切换到私有子网(因此使用 NAT 网关)解决了这个问题。
【解决方案2】:

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

【讨论】:

  • 请提供更多详细信息,以便其他人获得您提出的解决方案。
【解决方案3】:

我遇到了同样的问题并按照上述步骤操作,我发现在我的情况下,问题在于 lambda 位于没有通往 NAT 网关的路由的子网中。所以我将 lambda 移动到一个子网中,路由到 NAT 网关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 2018-09-14
    • 2018-07-23
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多