AWS Lambda:无法从具有 VPC 访问权限的 Lambda 函数访问 SQS 队列

AWS Lambda: Unable to access SQS Queue from a Lambda function with VPC access

我有一个 Lambda 函数需要使用它 URL 从 SQS 队列中读取消息。然后它需要将该数据插入 VPC 内服务器上的 Cassandra 运行。

我能够从我的 Lambda 函数访问 Cassandra 服务器,使用它的私有 IP 并正确配置安全组。

但是,我无法从 SQS 队列中读取消息。当我将 Lambda 函数的配置更改为 No VPC 时,我就能够从 SQS 队列中读取消息。但是,对于 VPC 设置,它只会超时。

我该如何克服这个问题?我检查了我的 Lambda 函数的安全组对所有 IP 地址具有完全出站访问权限。

一些服务(例如 S3)正在提供 VPC 端点来解决这个特定问题,但 SQS 不是其中之一。我认为解决此问题的唯一真正解决方案是 运行 在您的 VPC 内设置一个 NAT,这样来自 Lambda 函数的网络流量就可以路由到外部世界。

我 运行 在 运行 宁 lambda 函数访问 VPC 上的 elasticache 时遇到了同样的问题。虽然该功能在 VPC 中配置为 运行,但我无法与任何其他服务(特别是对我而言的代码部署)通信。

正如@garnaat 指出的那样,NAT 似乎是为没有 VPC 端点的服务解决此问题的唯一方法。

正如您指出的那样,我也 运行 遇到了同样的麻烦,一旦我用路由 table 中的 IGW 替换了条目,我就无法通过 SSH 进入机器.似乎分离 IGW 会使 VPC 分别缺乏传入流量(大部分)或来自 Internet 或流向 Internet 的传出流量。所以这就是我所做的并且对我有用:

在 VPC 内创建一个新的子网 现在,当 lambda 运行s 时,确保 lambda 从该子网运行。 您可以像这样使用 aws-cli 来执行此操作:


 aws lambda update-function-configuration --function-name <em>your-function-name</em> --vpc-config SubnetIds=<em>"subnet-id-of-created-subnet"</em>,SecurityGroupIds=<em>"sg-1","sg-2"</em>
</pre>

确保添加其入站和出站流量规则适用于您的 lambda 函数的所有安全组。

接下来,转到 VPC 控制台中的路由表并创建一个新路由 table。

此处是将 NAT 网关添加到目标的位置。

最后转到新路由中的“子网关联”选项卡 table 并在其中添加新创建的子网。

这就是所有这一切应该让它工作。请注意,请将此视为唯一的解决方法。我没有做太多的挖掘,而且我对在执行此操作时如何在内部解决问题的想法非常有限。这可能不是一个理想的解决方案。

理想的解决方案似乎是事先设计 VPC。使用子网隔离需要互联网访问的 resources/instances 和不需要的(私有和 public 子网)并在需要的地方放置适当的网关。(这样您以后可能不必为此目的创建单独的子网) .谢谢

我无法使这个问题的 答案起作用。也许这是由于我的一个或多个错误造成的。无论如何,我确实找到了一个我想分享的解决方法,以防我不是唯一遇到这个问题的人。

解决方案: 我创建了两个 Lambda 函数。 first Lambda 函数在我的 VPC 中运行并执行所需的工作(在 mandeep_m91 的情况下,这是向 Cassandra 的数据插入;在我的情况下是访问 RDS 实例). second Lambda 函数位于 VPC 之外,因此我可以将它连接到 SQS 队列。然后,我使用找到此 答案的信息,首先调用了第二个 Lambda 函数。请注意,链接的问题在答案中同时包含 node.js 和 Python 示例。

这将使调用函数的成本有效加倍,因为每次调用都会导致两次函数执行。但是,就我的情况而言,音量太低,不会产生真正的影响。

end of 2018,AWS 宣布支持 SQS 端点,它提供

connectivity to Amazon SQS without requiring an internet gateway, network address translation (NAT) instance, or VPN connection.

Sending a Message to an Amazon SQS Queue from Amazon Virtual Private Cloud

有教程

另请参阅 SQS VPC Endpoints Documentation 了解更多信息。

重要的是要注意,如果您想在 Lambda VPC 中访问 SQS,您还需要做一些其他事情:

  • 确保在您的代码中指定 SQS 区域。例如,我必须将 endpoint_url 设置为“https://sqs.us-west-2.amazonaws.com
  • 确保您已将 "wide open" 安全组附加到 SQS VPC 接口,否则 SQS 将无法工作。
  • 确保 Lambda VPC 中的子网与您为 SQS VPC 接口设置的相匹配。

为了澄清上面关于 "wide open" 安全组的一点,端点上设置的组需要允许从您的 lambda 函数对 SQS 进行入站访问。

我为我的端点创建了一个安全组,它只向我的 lambda 安全组开放了 443。