API网关+ Lambda + VPC超时问题

时间:2016-11-22 12:13:40

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

早上好,请你帮我们解决下一个问题: 我有一个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端点,因此它绝对不是端点问题。

感谢任何帮助。

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

问题解决了。

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

感谢@ Michael-sqlbot

答案 2 :(得分:1)

几个月前我几乎有同样的问题,这是我的解决方案:

假设您手动设置了Lambda,请Configuration - > Advanced settings您会找到VPC,然后选择subnetsecurity groups

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

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

答案 3 :(得分:0)

<块引用>

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

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

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

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

答案 4 :(得分:-2)

从您的日志中

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

解决方案:

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

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

有关时间问题和测试问题,您可以执行以下操作:

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

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

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

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

  

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

对于解决方案:

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

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

资源链接:

  1. Troubleshooting and Monitoring AWS Lambda Functions with Amazon CloudWatch
  2. 有关测试,请在此处提供完整的代码示例: http://qiita.com/c9katayama/items/b9a30cdfaaa91cba23ad