早上好,请你帮我们解决下一个问题: 我有一个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端点,因此它绝对不是端点问题。
感谢任何帮助。
答案 0 :(得分:3)
当您在VPC中放置Lambda函数时,它将无法访问VPC之外的任何内容。要使您的Lambda函数能够访问VPC外部的资源,您必须为VPC添加NAT网关。
答案 1 :(得分:2)
问题解决了。
Lambda VPC配置已附加公共子网。
感谢@ Michael-sqlbot
答案 2 :(得分:1)
假设您手动设置了Lambda,请Configuration
- > Advanced settings
您会找到VPC
,然后选择subnet
和security 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 执行的所有操作都会导致超时的原因。
答案 4 :(得分:-2)
从您的日志中
- 结算时长:15000毫秒
- 内存大小:512 MB
- 使用的最大内存:47 MB
是超时问题。 如有必要,您需要将执行时间增加15秒到30秒或更长时间。
在某些情况下,您还需要增加内存大小。它也可能生效。但我认为时间是你的主要事实,而不是记忆大小。
有关时间问题和测试问题,您可以执行以下操作:
Soluiton:对AWS Lambda的所有调用必须在300秒内完成执行。默认超时为3秒,但您可以将超时设置为1到300秒之间的任何值。
您可以像在任何其他Node.js函数中一样在本地测试代码,也可以使用控制台的测试调用功能在Lambda控制台中对其进行测试,也可以使用AWS CLI Invoke命令。每次执行代码以响应事件时,它都会将日志条目写入与Lambda函数关联的日志组,即/ aws / lambda /。
如果您在日志中看到超时超时错误,则表示超时设置 超过功能代码的运行时间。这可能是因为 超时太低,或者代码执行时间太长。
使用不同的内存设置测试您的代码。
如果您的代码执行时间过长,则可能是因为它没有足够的计算资源来执行其逻辑。尝试使用Lambda控制台的测试调用功能增加分配给您的函数的内存并再次测试代码。您可以在功能日志条目中查看使用的内存,代码执行时间和分配的内存。更改内存设置可能会更改您的持续时间收费方式。有关定价的信息,请参阅AWS Lambda。