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

Man*_*ngh 15 aws-lambda

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

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

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

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

gar*_*aat 12

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

  • 我是唯一一个读取这种"只需创建NAT并编辑路由表并设置您的VPC端点和......"的人,并认为这太过分了吗?我非常确定如果AWS提供花生酱和果冻三明治,则需要在花生酱罐上设置许可政策,并为每片面包创建特殊的独立子网. (9认同)
  • 这个答案不再正确。AWS提供了用于SQS的VPC终端节点。 (4认同)

One*_*ema 8

2018年底,AWS宣布支持SQS终端节点,这些终端节点提供

连接到Amazon SQS,而无需Internet网关,网络地址转换(NAT)实例或VPN连接。

有一个教程,用于从Amazon Virtual Private Cloud发送消息到Amazon SQS队列

另请参阅SQS VPC端点文档以了解更多信息。

需要注意的重要一点是,如果要在Lambda VPC中访问SQS,还需要执行其他几件事:

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

  • 这可以用来让 SQS 也触发驻留在 VPC 内的 Lambda 函数吗? (2认同)

Avi*_*agh 6

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

正如@garnaat所指出的,NAT似乎是解决没有VPC端点的服务的唯一方法.

就像你指出的那样,一旦我用路由表中的IGW替换了条目,我也遇到了麻烦,我无法通过SSH进入机器.似乎分离IGW分别使VPC对进入的流量(主要是)或来自或来自互联网的传出流量进行了匮乏.所以这就是我所做的,它对我有用:

在VPC中创建一个新的子网现在,当lambda运行时,确保lambda在此子网中运行.你可以像这样使用aws-cli来做到这一点:


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

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

接下来,转到VPC控制台中的Route Tables并创建新的路由表.

在此输入图像描述

您可以在此处将NAT网关添加到目标.

最后转到新路由表中的Subnet Associations选项卡,并在那里添加新创建的子网.

多数民众赞成应该让它运作起来.请注意,请将此视为一种解决方法.我没有做太多的挖掘,而且对于如何在执行此操作时在内部解决问题我的想法非常有限.这可能不是一个理想的解决方案.

理想的解决方案似乎是事先设计VPC.使用子网隔离需要Internet访问的资源/实例(不包括私有和公共子网),并在需要的地方放置适当的网关(这样您以后可能不必为此目的创建单独的子网).谢谢