从 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 错误

使用谷歌传输服务将文件从 AWS 传输到 GCP 时出现凭证错误

在 AWS Lambda 上使用 nodejs“ref”模块时出现“无效的 ELF 标头”