【问题标题】:API Gateway+Lambda+VPC timeout issueAPI Gateway+Lambda+VPC 超时问题
【发布时间】:2017-04-06 02:41:01
【问题描述】:

早上好,请您帮我们解决下一个问题: 我有一个 API 网关 + Java Lambda 处理程序。这个 Lambda 使用 httpconnection 来获取一些 Internet REST API。

当我们在没有 VPC 的情况下使用这个 Lambda 时,它可以正常工作。但是当我们使用配置了互联网访问的 VPC 时 - 有时 Lambda 会因超时错误而失败。它在 20% 的请求中失败(80% 的请求正常),并在日志中出现下一个错误。

REPORT RequestId: 16214561-b09a-11e6-a762-7546f12e61bd Duration: 15000.26 ms Billed Duration: 15000 ms Memory Size: 512 MB Max Memory Used: 47 MB

09:57:49
2016-11-22T09:57:49.245Z 16214561-b09a-11e6-a762-7546f12e61bd Task timed out after 15.00 seconds

根据我的日志,lambda 无法发送 GET 请求。我不确定问题出在哪里。这是 Lambda 问题、VPC 问题还是某些配置问题。 我也尝试了许多不同的 REST Api 端点,所以这绝对不是端点问题。

感谢任何帮助。

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-api-gateway amazon-vpc


    【解决方案1】:

    当您在 VPC 中放置 Lambda 函数时,它将无法访问 VPC 之外的任何内容。要使您的 Lambda 函数能够访问 VPC 外部的资源,您必须将 NAT 网关添加到您的 VPC。

    【讨论】:

    • ...并仅选择私有子网(具有到 NAT 框的默认路由)来分配 Lambda 函数,我在想,因为即使配置了 Lambda ENI,也不会分配公共 IP在公共子网上。
    • @Michael-sqlbot 非常感谢,你说得对,这就是问题所在
    • 我有类似的问题。并用NAT网关配置了私有子网,即使这样,仍然无法访问Internet。有什么帮助吗?
    • @Kostanos 该私有子网中的 EC2 实例是否可以访问 Internet?您的路由表设置可能不正确。我建议在这里问一个新问题,而不是标记到这个问题上。
    • 谢谢@mark-b 我已经解决了。我的问题是我在私有子网内创建了 NAT 网关,而我应该在公共子网内进行。
    【解决方案2】:

    问题解决了。

    Lambda VPC 配置附加了公共子网。

    感谢@Michael-sqlbot

    【讨论】:

      【解决方案3】:

      几个月前我遇到了几乎相同的问题,这是我的解决方案:

      假设您手动设置 Lambda,在 Configuration -> Advanced settings 中,您将找到 VPC,然后选择 subnetsecurity groups

      您选择的Subnet 应该与 lambda 函数调用的其他服务位于同一子网中。在您的情况下,您的 lambda 服务使用 httpconnection 到 Internet REST API,这很好,但您可能需要与 RDS 的数据库连接或由 SQS 或 SNS 触发。所以确保子网是正确的。

      Security Groups 更重要。同样,在您的情况下,您需要访问 Internet,因此请确保安全组的 outbound rules 具有外部连接。通常,为了简单起见,我会给出所有可用的端口和所有目标,当然,您可以限制使用端口 80 和您需要的 API 的 IP 地址。

      【讨论】:

        【解决方案4】:

        由于执行程序被“锁定”在 VPC 后面 - 所有互联网 通讯受阻。

        这会导致任何 http(s) 调用在请求时超时 数据包永远不会到达目的地。

        这就是 aws-sdk 执行的所有操作都会导致超时的原因。

        请参考https://stackoverflow.com/a/39206646

        【讨论】:

          【解决方案5】:

          从您的日志中,

          • 计费时长:15000 毫秒
          • 内存大小:512 MB
          • 使用的最大内存:47 MB​​

          解决方案:

          这是超时问题。 如有必要,您需要将执行时间从 15 秒增加到 30 秒或更长时间

          在某些情况下,您还需要增加内存大小。它也可能产生效果。但我认为时间是你的主要事实,而不是内存大小。



          对于时序问题和测试问题,您可以通过以下方式:

          问:AWS Lambda 函数可以执行多长时间?

          解决方案:对 AWS Lambda 的所有调用必须在 300 秒内完成执行。默认超时为 3 秒,但您可以将超时设置为 1 到 300 秒之间的任何值。

          确定您的 Lambda 函数未按预期工作的原因:

          您可以像测试任何其他 Node.js 函数一样在本地测试您的代码,也可以使用控制台的测试调用功能在 Lambda 控制台中对其进行测试,也可以使用 AWS CLI Invoke 命令。每次执行代码以响应事件时,它都会将日志条目写入与 Lambda 函数关联的日志组,即 /aws/lambda/。

          如果您在日志中看到超时超出错误,您的超时设置 超过你的函数代码的运行时间。这可能是因为 timeout 太低,或者代码执行时间太长。

          解决办法:

          使用不同的内存设置测试您的代码。

          如果您的代码执行时间过长,可能是因为它没有足够的计算资源来执行其逻辑。尝试使用 Lambda 控制台的测试调用功能增加分配给您的函数的内存并再次测试代码。您可以在函数日志条目中查看使用的内存、代码执行时间和分配的内存。更改内存设置可以更改您对持续时间的收费方式。有关定价的信息,请参阅AWS Lambda

          资源链接:

          1. Troubleshooting and Monitoring AWS Lambda Functions with Amazon CloudWatch

          为了测试,这里给出了一个完整的代码示例:http://qiita.com/c9katayama/items/b9a30cdfaaa91cba23ad

          【讨论】:

          • 这将是一个很好的答案,但恐怕它并没有真正解决 this 问题中可能存在的问题。如果他们遇到超时,这可能仅仅是因为他们遇到了由 Lambda 函数本身启动的出站连接(无论它可能是什么)的情况,由于 VPC 特定的错误配置而永远不会成功,因为 OP 说它在部署非 VPC 时有效。我相信你应该重新考虑你是否正在解决问题的可能症结。但是,没有理由相信存在内存问题。
          猜你喜欢
          • 2019-06-09
          • 1970-01-01
          • 2021-11-29
          • 1970-01-01
          • 1970-01-01
          • 2020-12-16
          • 1970-01-01
          • 2018-08-22
          • 1970-01-01
          相关资源
          最近更新 更多