【问题标题】:AWS Lambda Function cannot access other servicesAWS Lambda 函数无法访问其他服务
【发布时间】:2018-06-25 11:15:39
【问题描述】:

我的 AWS Lambda 函数存在问题,该函数依赖 DynamoDB 和 SQS 才能正常运行。当我尝试运行 lambda 堆栈时,它们在尝试连接到 SQS 服务时超时。 AWS Lambda 函数位于具有以下设置的 VPC 内:

  • 具有四个子网的 VPC
  • 两个子集是公共的,将它们的 0.0.0.0/16 流量路由到互联网网关
  • MySQL 服务器位于公共子网中
  • 另外两个包含 lambda,并将其 0.0.0.0/16 流量路由到位于其中一个公共子网中的 NAT。
  • 所有路由表都有一个 10.0.0.0/16 到本地规则(这是因为 Lambda 在 VPC 中使用私有 IP 造成的问题吗?)
  • 主路由表是带有 NAT 的路由表,但我明确将公共网络与 Internet 网关路由表相关联
  • 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

【问题讨论】:

  • 这只是为了向读者指出your answer,它强调将不同地方的不正确0.0.0.0/16更改为0.0.0.0/0是解决方案。

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


【解决方案1】:

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

@John Rotenstein:谢谢,不过是关于 lamdash 的提示。这似乎是一个非常有用的工具。

【讨论】:

    【解决方案2】:

    您的配置听起来正确。

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

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

    【讨论】:

    • 这些功能似乎真的没有任何互联网接入。我写的一个快速玩具函数也超时(见编辑的 OP,函数)
    猜你喜欢
    • 1970-01-01
    • 2021-01-07
    • 2018-04-18
    • 2018-02-27
    • 2019-10-02
    • 1970-01-01
    • 2019-11-07
    • 2021-03-24
    • 1970-01-01
    相关资源
    最近更新 更多