从 AWS Lambda 获取 URL 时出现静默错误
Posted
技术标签:
【中文标题】从 AWS Lambda 获取 URL 时出现静默错误【英文标题】:Silent error when fetching URLs from AWS Lambda 【发布时间】:2020-03-12 16:45:09 【问题描述】:我正在尝试从 AWS Lambda 获取网页内容,但它静默失败,CloudWatch 日志仅包含以下行(超时设置为 10 秒,因此持续时间为 10000 毫秒):
START 请求 ID:f101849f-1219-411b-8875-8944a76de937 版本:$LATEST 结束请求 ID:f101849f-1219-411b-8875-8944a76de937 报告请求 ID:f101849f-1219-411b-8875-8944a76de937 持续时间:10008.39 毫秒
我正在运行的代码只是获取 URL 并读取内容。它在本地环境中运行良好,但在 AWS Lambda 上测试时却不行:
public class TestHandler implements RequestHandler<Object, String>
@Override
public String handleRequest(Object o, Context context)
try
Connection con = HttpConnection.connect(new URL("https://www.google.com"));
con.timeout(40000);
return con.get().getAllElements().toString();
catch (IOException e)
System.out.println(e.getMessage());
在处理请求时我不知道的任何 AWS 限制?
【问题讨论】:
您的 Lambda 是否在 VPC 中?您是否尝试过增加 Lambda 的超时时间? 你的 lambda 是同步运行还是异步运行?它是否将 Promise 返回给调用者/运行时? 【参考方案1】:Java 容器需要时间来启动。在您的情况下,您也在使用 Lambda,并且您可能知道如果没有请求到来,Lambda 仍处于冷状态。它只有在请求到来时才会醒来。此外,您的 Lambda 配置中的超时设置为 10 秒。请从 Lambda UI 屏幕增加它。同样作为一个java开发人员,如果你能找到它,我建议你也删除不必要的jar或maven依赖。请先增加时间再试一次。
【讨论】:
在这种情况下,瓶颈来自内存限制【参考方案2】:问题来自设置为默认 128MB 的内存限制不足。 当我增加到 256MB 时,连接按预期工作并检索了页面内容。 所以事实证明,当 lambda 达到最大内存限制时,AWS 会杀死它,而 CloudWatch 中没有任何消息(如果它被超时杀死,你会得到它)
【讨论】:
以上是关于从 AWS Lambda 获取 URL 时出现静默错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 Sharp 库运行 AWS Lambda 函数时出现问题
使用 AWS Lambda 连接到 Oracle RDS 时出现错误 (DPI-1047)
消息:尝试访问 aws gateway api 时出现“内部服务器错误”
仅从浏览器使用预签名 URL 上传时出现 AWS S3 CORS 错误