AWS Lambda函数无法访问其他服务

时间:2018-01-16 17:10:27

标签: python amazon-web-services lambda nat amazon-vpc

AWS Lambda函数存在问题,这取决于DynamoDB和SQS是否正常运行。当我尝试运行lambda堆栈时,它们在尝试连接到SQS服务时会超时。 AWS Lambda函数位于VPC内,具有以下设置:

  • 具有四个子网的VPC
  • 两个子集是公共的,将其0.0.0.0/16流量路由到互联网网关
  • MySQL服务器位于公有子网
  • 另外两个包含lambdas并将其0.0.0.0/16流量路由到NAT,该NAT位于其中一个公共子网中。
  • 所有路由表都有10.0.0.0/16到本地规则(这是问题,因为Lambdas在VPC中使用私有IP?)
  • 主路径表是带有NAT的路径,但我明确地将公共网络与互联网网关路由表相关联。
  • lambdas和mysql服务器共享一个安全组,允许入站内部访问(10.x / 16)以及不受限制的出站流量(0.0.0.0/16)。

lambdas和mysql实例之间的流量没有问题(除非我将lambdas放在VPC之外,即使我打开所有端口也无法访问服务器)。假设lambdas的代码也是正确的,因为它在我试图在私有网中掩盖它之前工作。还相应地设置了lambda执行角色(或者在将它们移动到私有网之后是否需要进行调整?)。

添加dynamodb端点解决了数据库的问题,但是其他一些服务没有可用的VPC端点。根据一些答案,我发现了hereherehere以及公告/教程herehere,我很确定我遵循了所有建议的步骤

我会非常感激并且很高兴任何提示下一步检查,因为我目前不知道这里可能出现什么问题。

编辑:该功能似乎根本没有任何互联网访问,因为我检查的玩具示例也超时:

import urllib.request

def lambda_handler(event, context):
    test = urllib.request.urlopen(url="http://www.google.de")
    return test.status

2 个答案:

答案 0 :(得分:2)

当然问题是再次坐在显示器前面。我没有将0.0.0.0/0(任何流量)路由到Internet网关,而是将0.0.0.0/16(来自具有0.0.x.x ip的计算机的流量)指定到门。由于没有具有此类IP的计算机,因此阻止任何流量进入VPC。

@John Rotenstein:Thx,虽然是关于lambdash的暗示。这似乎是一个非常有用的工具。

答案 1 :(得分:1)

您的配置听起来不错。

您应该测试配置,看看您是否可以访问任何公共Internet站点,然后测试连接到AWS。

您可以编写尝试此类连接的Lambda函数,也可以使用lambdash来有效地为您提供在Lambda上运行的远程shell 。这样,您可以轻松地从命令行测试连接,例如curl