Aws lambda AWS Lambda:无法通过具有VPC访问权限的Lambda函数访问SQS队列
我有一个Lambda函数,需要使用它的URL从SQS队列读取消息。然后,它需要将该数据插入运行在VPC内服务器上的Cassandra 我可以通过Lambda函数访问Cassandra服务器,使用它的私有IP并正确配置安全组 但是,我无法从SQS队列读取消息。当我将Lambda函数的配置更改为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端点
无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的安全组打开了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"