Aws lambda AWS Lambda:无法通过具有VPC访问权限的Lambda函数访问SQS队列

Aws lambda AWS Lambda:无法通过具有VPC访问权限的Lambda函数访问SQS队列,aws-lambda,Aws Lambda,我有一个Lambda函数,需要使用它的URL从SQS队列读取消息。然后,它需要将该数据插入运行在VPC内服务器上的Cassandra 我可以通过Lambda函数访问Cassandra服务器,使用它的私有IP并正确配置安全组 但是,我无法从SQS队列读取消息。当我将Lambda函数的配置更改为无VPC时,我就能够从SQS队列中读取消息。然而,使用VPC设置,它只是超时 我怎样才能克服这个问题?我已检查Lambda函数的安全组是否具有对所有IP地址的完全出站访问权限。一些服务(如S3)提供VPC端点

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

我可以通过Lambda函数访问Cassandra服务器,使用它的私有IP并正确配置安全组

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


我怎样才能克服这个问题?我已检查Lambda函数的安全组是否具有对所有IP地址的完全出站访问权限。

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

我在VPC上运行Lambda功能并访问elasticache时遇到了同样的问题。虽然该功能配置为在VPC中运行,但我无法与任何其他服务(特别是codedeploy for me)通信

正如@garnaat指出的,对于没有VPC端点的服务,NAT似乎是解决这个问题的唯一途径

正如您所指出的,我也遇到了同样的问题,在我用路由表中的IGW替换条目后,我无法用SSH连接到机器。似乎分离IGW会使VPC分别缺少来自或到internet的传入流量(大部分)或传出流量。这就是我所做的,它对我起了作用:

在专有网络内创建新的子网 现在,当lambda运行时,确保lambda从此子网运行。 您可以使用aws cli执行此操作,如下所示:


aws lambda更新功能配置--功能名称您的功能名称--vpc配置子网id=“已创建子网的子网id”,SecurityGroupID=“sg-1”,“sg-2”

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

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

这里是将NAT网关添加到目标的位置

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

这一切都应该让它工作。请注意,这只是一个解决办法。我没有做太多的挖掘工作,我对如何在这样做的同时解决内部问题的想法非常有限。这可能不是一个理想的解决方案

理想的解决方案似乎是提前设计专有网络。使用子网隔离需要internet访问和不需要internet访问的资源/实例(专用子网和公用子网),并在需要时放置适当的网关(以便以后不必为此目的创建单独的子网)。谢谢

我无法找到这个问题的任何一个答案。也许这是因为我犯了一个或多个错误。无论如何,我确实找到了一个我想分享的解决方法,以防我不是唯一一个遇到这个问题的人

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

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

在上个月,AWS宣布支持SQS端点,它提供

无需internet网关、网络地址转换(NAT)实例或VPN连接即可连接到Amazon SQS

这里有一个教程

有关更多信息,请参见

需要注意的是,如果您想访问Lambda VPC内的SQS,您还需要做以下几件事:

  • 确保在代码中指定SQS区域。例如,我必须将我的
    端点\u url
    设置为“”
  • 确保您已将“完全开放”的安全组连接到SQS VPC接口,否则SQS将无法工作
  • 确保Lambda VPC中的子网与您为SQS VPC接口设置的子网匹配

要澄清上面关于“完全开放”安全组的一点,端点上设置的组需要允许从lambda函数入站访问SQS


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

我尝试为destination
0.0.0/0
向路由表添加一个条目,目标为新创建的NAT网关的id。但是,已存在具有相同目的地的Internet网关条目。替换它安全吗?好的,我认为它不安全。一旦我替换了条目,我就不能再使用SSH连接到我的实例。怎么办?我是不是唯一一个读到这种“只需创建NAT,编辑路由表,设置VPC端点和…”的人,并认为这太过分了?我敢肯定,如果AWS提供花生酱和果冻三明治,就需要在花生酱罐上设置许可策略,并为每片面包创建特殊的独立子网。这个答案不再正确。AWS为SQS提供VPC端点。@Jwan622否。您可以在自己的VPC中添加Lambda、EC2和RDS等服务,但不能添加SQS或S3。通常,SQS和S3需要

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