问题描述
我有一个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中的一些要点,但是我仍然无法连接。
这就是我所拥有的:
-
VPC:
- VPC具有公共和专用子网以及IG网关。我使用向导来创建它。我不太了解这里的基础。
- VPC Config(对不起,这是一个链接,它还不允许我嵌入。)
- CIDR's-向导创建了除最后一个块以外的所有块。我不确定我是否正确执行此操作,甚至不确定是否有意义,因为向导使我至少创建了一个,而我这样做是为了避免IP重叠。
- 由于这是一个开发/原型项目,因此附加到VPC的安全组是“完全开放的”。允许所有入站和出站。
- 让我知道要显示什么其他VPC配置,因为我不确定什么有用
-
服务端点:
- 我尝试根据上面链接的文章为SQS创建服务端点,这是我的职责:endpoint config
- 我将在Lambda部分中详细介绍如何使用它。
- 端点已连接到VPC
-
Lambda:
- 我将Lambda连接到了VPC as shown here。
- 这使我可以与公开的第三方API和受保护的资源进行交流。我希望拥有一个开放的SG仍然可以让我的lambda与SQS进行交流,但是它会保持超时。
- 我不确定which url是否在Lambda中用于端点。这里的示例:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-sending-messages-from-vpc.html看起来仍然使用区域端点。
-
代码
-
这是我的代码中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或返回的途中(都需要逐跳进行思考)。
想到的三件事:
- 路由:确保子网和路由表具有适当的路由,以将数据包从SQS终结点所在的网络返回到专用子网。
- 安全组-仔细查看所涉及的每个SG。例如,SQS可能位于限制访问它的SG中。
- 网络ACL-它们是无状态的,因此您需要确保双方都是开放的,并且请记住,在大多数情况下,会涉及随机的端口号,并返回到请求者。
祝你好运!