VPC 内 Lambda 的 SQS 超时

SQS Timeout from Lambda within VPC

我有一个 Lambda 需要在 VPC 上才能与 RDS 和 AWSDocumentDB 等受保护资源通信。它还需要能够看到外部世界以进行某些对 3rd 方 API 的调用。为此,我使用 VPC 向导创建了一个同时具有 public 和私有子网的 VPC。该向导还创建并附加了一个 Internet 网关。

在此之后,我将我的 Lambda、RDS 实例和 DocumentDb 集群附加到 VPC。然而,从那以后,我一直无法使用 NodeJS aws-sdk 从我的 lambda 中与我的 SQS 队列通信。

我想补充一点,我已经阅读并实施了一些要点: 但是我仍然无法连接。

这是我的:

  1. VPC:

    • VPC 有 public 和私有子网,以及一个 IG 网关。我使用向导来创建它。我不太了解这里的基础。
    • VPC Config(抱歉这是一个 link,它还不允许我嵌入。)
    • CIDR's- 向导创建了除最后一个块之外的所有块。我不确定我这样做是否正确,或者它是否重要,因为向导让我至少创建了一个,我这样做是为了避免 IP 重叠。
    • 由于这是一个 dev/prototype 项目,附加到 VPC 的安全组是 'wide open'。允许所有入站和出站。
    • 让我知道要显示的其他 VPC 配置,因为我不确定什么有用
  2. 服务端点:

    • 我尝试根据上面 linked 的文章为 SQS 创建服务端点,这是我所拥有的:endpoint config
    • 我将在 Lambda 部分详细讨论我是如何使用它的。
    • 端点附加到 VPC
  3. 拉姆达:

  4. 代码

    • 这是我的代码中 SQS 调用的样子:

      • const {SQS} = require('aws-sdk');
        
        // Constructor Init
        const sqs = new SQS({
           apiVersion: '2012-11-05', 
           endpoint: 'https://sqs.us-west-2.amazonaws.com', // not sure if this is 'invoking' the vpc endpoint or not
           region: 'us-west-2'
        });
        
        // Send message
        await sqs.sendMessage({
           MessageBody: 'Test body',
           QueueUrl: 'https://sqs.us-west-2.amazonaws.com/<rest of URI>',
           MessageAttributes: {...someAttrs}
        }).promise();
        
        
        
        

感谢任何帮助,请让我知道我可以提供哪些其他信息。

谢谢!

** 编辑 **

我还应该提到,为了规避这整个问题,我开始走上使用 SQS 作为 Lambda 目标的道路。虽然这确实会将消息注入目标队列,但它可能不会根据我的用例进行扩展。如果需要,我可以进一步详细说明,因为它与实际问题并不完全相关。

** 编辑 2020 年 8 月 31 日 **

感谢所有回复,这对我帮助很大,让我下定决心。我会告诉其他任何发现此 post 的人首先观看:

https://www.youtube.com/watch?v=JcRKdEP94jM

这是我希望在开始所有这一切之前找到的东西,因为虽然它专门针对提供 lambda 互联网访问权限,但它经历了将 IG 和 Nats 映射到子网的过程,而这正是我误会的地方-配置我的vpc。通过这个视频,我重新创建了我的整个 VPC,它更清晰,更容易连接各个点。 10/10 推荐。

再次感谢!

AWS Lambda 函数应附加到 VPC 中的 私有子网

Amazon SQS 存在于 Internet 上,因此 Lambda 函数需要一种访问 SQS 端点的方法。

选项 1:VPC 端点

VPC Endpoint for Amazon SQS 可以在 VPC 和 SQS 端点之间提供直接 link,无需访问互联网。创建后,VPC 将自动跨 VPC 端点发送 SQS 请求。这是一个不错的简单选项。

选项 2:NAT 网关

如果您在私有子网中有其他资源需要访问互联网,您可以考虑在 public 子网 中放置一个 NAT 网关。私有子网需要路由 Table 条目,将 Internet-bound 流量 (0.0.0.0/0) 定向到 NAT 网关。

额外收费。

选项 3:Lambda 目标

如果您的 Lambda 函数通过 Lambda 目标成功地与 SQS 通信,那么这听起来是个不错的选择!我没试过,但听起来 Lambda 服务负责将输出直接发送到 SQS,而无需遍历 VPC 或 Internet。如果这有效,那么我强烈建议继续使用它。使用此方法我没有发现任何缩放问题。但是,请注意,它仅适用于对 Lambda 的异步调用,并且不会起作用,例如,当同步调用函数或按 Test 按钮时。

我的预感是您的网络配置中某处缺少规则 - 数据包要么被丢弃到您的 SQS,要么在返回途中被丢弃(两者都需要逐个考虑)。

想到的三件事:

  1. 路由:确保子网和路由 table(s) 具有适当的路由,以便将数据包从 SQS 端点所在的子网返回到您的私有子网。
  2. 安全组 - 仔细查看涉及的每个 SG。例如,SQS 可能在限制访问它的 SG 中。
  3. 网络 ACL - 这些是无状态的,因此您需要确保双方都是开放的,并且请记住,在大多数情况下,将涉及返回请求者的随机端口号。

祝你好运!