早上好,您能帮我们解决下一个问题:我有一个API网关 Java Lambda处理程序。此lambda使用httpconnection获得一些互联网REST API。
当我们使用无VPC的lambda时,它可以正常工作。但是,当我们将VPC与已配置的Internet访问使用时 - 有时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无法发送获取请求。我不确定问题所在。是这个lambda问题,VPC问题还是某些协会问题。另外,我确实尝试了许多不同的REST API端点,因此绝对不是端点问题。
感谢任何帮助。
当您将lambda函数放置在VPC内时,它将无法访问VPC之外的任何内容。要启用您的lambda函数访问VPC之外的资源,您必须向VPC添加NAT网关。
解决了问题。
lambda VPC配置附有了公共子网。
感谢 @michael-sqlbot
几个月前我遇到了几乎相同的问题,这是我的解决方案:
假设您在Configuration
-> Advanced settings
中手动设置Lambda,您将找到VPC
,然后选择subnet
和security groups
。
您选择的Subnet
应该在同一子网中与其他服务lambda函数调用。就您而言,Lambda服务使用HTTPConnection进行Internet REST API,这很好,但是您可能需要与RDS连接或由SQS或SNS触发的DB连接。因此,请确保子网正确。
Security Groups
更重要。同样,在您的情况下,您需要访问Internet,因此请确保安全组的outbound rules
具有外部连接。通常,我会提供所有端口和所有目的地,以简单起见,当然,您可以限制使用端口80和您需要的API IP地址。
由于执行人是"锁定"VPC的背后 - 所有互联网通信被阻止。
会导致任何HTTP(S)随着他们的要求而定时出来的任何HTTP数据包永远不会到达目的地。
这就是为什么AWS-SDK完成的所有操作都会导致超时。
请参阅 https://stackoverflow.com/a/39206646
从您的日志,
- 计费持续时间:15000 ms
- 记忆尺寸:512 MB
- 最大内存使用:47 MB
解决方案:
这是超时问题。您需要在必要时增加执行时间15秒至30秒或更长时间。
在某些情况下,您还需要增加内存大小。它也可能产生效果。但是我认为时间是您的主要事实,而不是记忆大小。
对于计时问题和测试问题,您可以仔细阅读以下内容:
问:AWS lambda函数可以执行多长时间?
soluiton:对AWS lambda进行的所有调用都必须在300秒内完成执行。默认超时为3秒,但是您可以将超时设置为1到300秒之间的任何值。
确定为什么您的lambda功能无法正常工作:
您可以像任何其他node.js函数一样在本地测试您的代码,也可以使用控制台的测试Invoke功能在Lambda控制台内对其进行测试,也可以使用AWS CLI INDOKE命令。每次对事件响应执行代码时,都会将日志条目写入与lambda函数关联的日志组,即/aws/lambda/。
如果您在日志中看到超时的错误,则超时设置 超过功能代码的运行时间。这可能是因为 超时太低,或代码花费太长执行。
用于解决方案:
使用不同的内存设置测试您的代码。
如果您的代码花费太长执行,则可能没有足够的计算资源来执行其逻辑。尝试使用Lambda控制台的测试Invoke功能增加分配给您功能的内存并再次测试代码。您可以在功能日志条目中查看所使用的内存,代码执行时间和内存。更改内存设置可以改变持续时间的费用。有关定价的信息,请参见AWS lambda。
资源链接:
- 使用Amazon的故障排除和监视AWS Lambda功能CloudWatch
用于测试,此处给出了一个完整的代码示例: http://qiita.com/c9katayama/items/b9a30cdfaaa91cba23ad