在私有 VPC 中使用 SQS 作为 Lambda 的事件源——我需要 SQS VPC 端点吗?

Using SQS as EventSource for Lambda in private VPC - do I need SQS VPC Endpoints?

我一直在努力阅读这方面的内容,但我得到的信息要么相互矛盾,要么我只是不太了解为什么没有冲突。

我正在使用 CDK 在 vpc 中设置 lambda,并将 SQS 队列作为事件源。 SQS 队列会订阅不同 AWS 账户中的 SNS 主题。现在我的问题就在 SQS/Lambda 互动后面。

我希望 Lambda 能够 poll/receive 来自 SQS 队列的消息而无需通过 public 互联网。起初我认为这需要 vpc/security 组设置才能访问 SQS vpc 端点。但是我读了另一个 post,其中有人说 lambda 轮询器本身不在您的 lambda 的 VPC 中 运行,因此没有 vpc 配置适用于它。如果是 - 轮询器是否仅在 AWS 的私有 'global infrastructure' 中运行?

但这只是轮询 - 我也想知道轮询是否找到消息,lambda 是否也能够读取和响应(例如,假设 lambda 抛出异常,或者我想 return部分批处理响应 - 在这两种情况下,Lambda 都具有将 return 消息发送到队列的内置功能。所有这些是否也会在非 public 互联网上的 VPC 之外处理?

我想知道,因为我发现几乎 100% 的 documentation/examples 只谈论 lambda 发布 到 SQS,或者手动从队列 - 当 SQS 用作 lambda 事件源时不是。

只要我们只讨论 Lambda 函数的触发器,您就不需要 VPC 终端节点。

您必须区分 Lambda 服务Lambda 函数执行上下文. Lambda 服务在 AWS 后端某处运行并管理 Lambda 函数。如果您已将 SQS 配置为 Lambda 函数的触发器,Lambda 服务将定期轮询 SQS 以获取新消息,一旦获得消息,就会执行以下操作。

首先,它会检查 Lambda 函数的任何执行上下文是否可用,即不忙于处理另一个事件。如果不是这种情况,它将创建一个新的执行上下文或您的 Lambda 函数的实例,部分 位于 VPC 中。

您在执行上下文中的代码 运行 可以通过共享的弹性网络接口访问 VPC(实际上有点复杂)。这是安全组适用的地方。它适用于 在执行上下文中所做的一切。 AWS 有另一个私有通道来与执行上下文通信。这用于传递事件并接受来自 Lambda 函数的响应。

tl;dr: 要触发 Lambda 函数,您不需要 VPC 端点,如果您想直接从您的代码与服务对话,您将需要一.