我有一个Lambda函数需要使用它的URL从SQS队列中读取消息。然后,它需要将该数据插入在VPC内的服务器上运行的Cassandra。
我能够从我的Lambda函数访问Cassandra服务器,使用它的私有IP并正确配置安全组。
但是,我无法从SQS队列中读取消息。当我将Lambda函数的配置更改为No VPC
时,我能够从SQS队列中读取消息。但是,使用VPC设置时,它只会超时。
我怎样才能克服这一点?我检查了我的Lambda函数的安全组是否具有对所有IP地址的完全出站访问权。
答案 0 :(得分:12)
某些服务(例如S3)正在提供VPC端点来解决此特定问题,但SQS不是其中之一。我认为这个问题的唯一真正解决方案是在你的VPC中运行NAT,这样来自Lambda函数的网络流量就可以路由到外部世界了。
答案 1 :(得分:6)
当我运行lambda函数并且可以访问VPC上的elasticache时,我遇到了同样的问题。虽然该功能配置为在VPC中运行,但我无法与任何其他服务(特别是代码部署)进行通信。
正如@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访问的资源/实例(不包括私有和公共子网),并在需要的地方放置适当的网关(这样您以后可能不必为此目的创建单独的子网)。感谢
答案 2 :(得分:4)
我无法获得此问题的other two个答案。也许这是由于我的一个或多个错误。无论如何,我确实找到了一个我想分享的解决方法,以防我遇到这个问题并不孤单。
解决方案:我创建了两个 Lambda函数。 第一个 Lambda函数在我的VPC中运行并执行所需的工作(在mandeep_m91的情况下,这是对Cassandra的数据插入;在我的情况下是访问RDS实例)。 第二 Lambda函数位于VPC之外,因此我可以将其连接到SQS队列。然后,我使用找到此this StackOverflow Q&A答案的信息,使第二个Lambda函数调用第一个。注意,链接的问题在答案中都有node.js和Python示例。
这将有效地使进行函数调用的成本加倍,因为每次调用都会导致两个函数执行。但是,对于我的情况,音量太低,不会产生真正的差异。
答案 3 :(得分:4)
在end of 2018,AWS宣布了对提供以下功能的SQS端点的支持:
与Amazon SQS的连接,而无需Internet网关,网络地址转换(NAT)实例或VPN连接。
有一个Sending a Message to an Amazon SQS Queue from Amazon Virtual Private Cloud的教程
有关更多信息,另请参见SQS VPC Endpoints Documentation。
请务必注意,如果要在Lambda VPC中访问SQS,还需要执行其他几件事:
endpoint_url
设置为“ https://sqs.us-west-2.amazonaws.com” 答案 4 :(得分:0)
为阐明上述有关“广泛开放”安全组的观点,端点上设置的安全组需要允许从lambda函数对SQS进行入站访问。
我为端点创建了一个安全组,该安全组仅对lambda的安全组打开了443。