VPC 内 Lambda 的 SQS 超时

Ken*_*ell 5 amazon-sqs amazon-web-services node.js amazon-vpc aws-lambda

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

之后,我将 Lambda、RDS 实例和 DocumentDb 集群附加到 VPC。然而从那时起,我就无法使用 NodeJS aws-sdk 从 lambda 中与我的 SQS 队列进行对话。

我想补充一点,我已阅读并实施了以下内容中的一些要点:AWS Lambda:无法通过具有 VPC 访问权限的 Lambda 函数访问 SQS 队列,但我仍然无法连接。

这是我所拥有的:

  1. 专有网络:

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

    • 我尝试根据上面链接的文章为 SQS 创建一个服务端点,这就是我所拥有的: 端点配置
    • 我将在 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();
        
        
        
        
        Run Code Online (Sandbox Code Playgroud)

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

谢谢!

** 编辑 **

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

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

感谢所有的回复,这给了我很大的帮助,让我找到了解决办法。我想说的是,对于其他发现这篇文章的人来说,首先要观看的是:

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

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

再次感谢!

Chr*_*hey 1

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

我想到的三件事:

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

祝你好运!