VPC中来自Lambda的SQS超时 选项1:VPC端点选项2:NAT网关选项3:Lambda目的地

问题描述

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

此后,我将Lambda,RDS实例和DocumentDb群集附加到了VPC。但是从那以后,我一直无法使用NodeJS aws-sdk从我的lambda中与我的SQS队列进行对话。

我想补充一点,我已经阅读并实现了AWS Lambda: Unable to access SQS Queue from a Lambda function with VPC access中的一些要点,但是我仍然无法连接。

这就是我所拥有的:

  1. VPC:

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

    • 我尝试根据上面链接的文章为SQS创建服务端点,这是我的职责:endpoint config
    • 我将在Lambda部分中详细介绍如何使用它。
    • 端点已连接到VPC
  3. Lambda:

  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目的地。尽管这确实将消息注入到目标队列中,但它可能不会随我的用例扩展。我可以根据需要进一步详细说明,因为它与实际问题并不完全相关。

**编辑8/31/20 **

感谢所有答复,这对我有很大帮助,使我得以解决。我要说的是,发现这篇文章的任何人都应该先看一下:

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端点之间提供直接链接,而无需访问Internet。创建后,VPC将自动在VPC端点上发送SQS请求。这是一个不错的简单选择。

选项2:NAT网关

如果专用子网中有需要Internet访问的其他资源,则可以考虑将 NAT网关放置在公共子网中。专用子网将需要一个路由表条目,该条目将Internet绑定流量(0.0.0.0/0)引导到NAT网关。

需要支付额外费用。

选项3:Lambda目的地

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

,

我对此的直觉是,您的网络配置中某处缺少一条规则-数据包被丢弃到您的SQS或返回的途中(都需要逐跳进行思考)。

想到的三件事:

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

祝你好运!

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...