首页 > 解决方案 > AWS Lambda 上的偶尔 Http 请求超时

问题描述

我有一个由 cron 每 3 分钟触发一次的 AWS lambda(作为 node.js)。它的目的是监控我们API的一些服务,所以它发送http请求。问题是,在 20% 的情况下,http 请求会超时。当我在本地或手动(通过使用 AWS 控制台上的测试功能)运行它时,一切正常。我试图增加超时选项但没有成功。

我得到的错误是:

createError (/var/task/node_modules/axios/lib/core/createError.js) 超时超过 5000 毫秒

错误详情:

2021-08-30T09:06:08.029Z 841332b5-d8c1-49dc-8caa-f57215ed5440 错误 PortalApiSql_Error 错误:createError (/var/task/node_modules/axios/lib/core/createError.js:16:15) 超时 5000ms ) 在 RedirectableRequest.handleRequestTimeout (/var/task/node_modules/axios/lib/adapters/http.js:280:16) 在 RedirectableRequest.emit (events.js:400:28) 在 Timeout._onTimeout (/var/task/ node_modules/follow-redirects/index.js:166:12) 在 listOnTimeout (internal/timers.js:557:17) 在 processTimers (internal/timers.js:500:7) { config: { url: '/health/ sql', method: 'get', headers: { Accept: 'application/json, text/plain, / ', ApiToken: ' - - -', 'User-Agent': 'axios/0.21.1' }, baseURL: 'https://apidev.myportal.com/v1', transformRequest: [ [Function: transformRequest] ], transformResponse: [ [Function: transformResponse ] ],超时:5000,适配器:[功能:httpAdapter],xsrfCookieName:'XSRF-TOKEN',xsrfHeaderName:'X-XSRF-TOKEN',maxContentLength:-1,maxBodyLength:-1,validateStatus:[功能:validateStatus] ,数据:未定义},代码:'ECONNABORTED',请求:<ref1> Writable { _writableState:WritableState { objectMode:false,highWaterMark:16384,finalCalled:false,needDrain:false,结束:false,结束:false,finished:false,destroy:false,decodeStrings:true,defaultEncoding:'utf8',长度:0,写入:false,corked:0,sync:true,bufferProcessing:false,onwrite:[Function:bound onwrite],writecb:null,writelen:0,afterWriteTickInfo:null,缓冲:[],bufferedIndex:0, allBuffers: true, allNoop: true, pendingcb: 0, prefinished: false, errorEmitted: false, emitClose: true, autoDestroy: true, errored: null, closed: false }, _events: [Object: null prototype] { response: [Array ],错误:[数组],套接字:[函数:destroyOnTimeout]},_eventsCount:3,_maxListeners:未定义,_options:{ maxRedirects:21,maxBodyLength:10485760,协议:'https:',路径:'/v1/health/sql',方法:'GET',标头:[Object],代理:未定义,代理:[Object],身份验证:未定义,主机名:'apidev.myportal.com',端口:null,nativeProtocols: [对象],路径名:'/v1/health/sql'},_end:true,_ending:true,_redirectCount:0,_redirects:[],_requestBodyLength:0,_requestBodyBuffers:[],_onNativeResponse:[函数(匿名)] , _currentRequest: ClientRequest { _events: [Object: null prototype], _eventsCount: 2, _maxListeners: undefined, outputData: [], outputSize: 0, writable: true, destroy: true, _last: true, chunkedEncoding: false, shouldKeepAlive: false , _defaultKeepAlive: true, useChunkedEncodingByDefault: false, sendDate: false, _removedConnection: false, _removedContLen: false, _removedTE: false, _contentLength: 0, _hasBody: true, _trailer: '', finished: true, _headerSent:true, socket: [TLSSocket], _header: 'GET /v1/health/sql HTTP/1.1\r\n' + 'Accept: application/json, text/plain,/ \r\n' + 'ApiToken: - - --\r\n' + '用户代理:axios/0.21.1\r\n' + '主机:apidev.myportal.com\r\n' + '连接:关闭\r\n' + '\r \n', _keepAliveTimeout: 0, _onPendingData: [Function: noopPendingOutput], agent: [Agent], socketPath: undefined, method: 'GET', maxHeaderSize: undefined, insecureHTTPParser: undefined, path: '/v1/health/sql' ,_end:false,res:null,aborted:true,timeoutCb:null,upgradeOrConnect:false,解析器:[HTTPParser],maxHeadersCount:null,reusedSocket:false,主机:'apidev.myportal.com',协议:'https: ', _redirectable: [Circular *1], [Symbol(kCapture)]: false, [Symbol(kNeedDrain)]: false, [Symbol(corked)]: 0, [Symbol(kOutHeaders)]: [Object: null prototype] }, _currentUrl: 'https://apidev.myportal.com/v1/health/sql', _timeout: 超时 { _idleTimeout: 5000, _idlePrev: null,_idleNext: null, _idleStart: 149306, _onTimeout: [Function (anonymous)], _timerArgs: undefined, _repeat: null, _destroyed: true, [Symbol(refed)]: true, [Symbol(kHasPrimitive)]: false, [Symbol( asyncId)]: 63, [Symbol(triggerId)]: 59 }, [Symbol(kCapture)]: false }, 响应: undefined, isAxiosError: true, toJSON: [Function: toJSON] }

我已经简化了代码(简化的代码也会出现超时错误),

exports.handler = async (event, context) => {
const axiosInstance = axios.create({
    baseURL: PortalApiUrl,
    timeout: AxiosTimeout,
    headers: { ApiToken: PortalApiToken },
});

try {
    console.log("before req ");
    console.log(WATCHERS_CONFIGURATION.PortalApiSql.Path);
    const response = await axiosInstance.get(WATCHERS_CONFIGURATION.PortalApiSql.Path);
    console.log(`recieved ${response}`);
    return {
        statusCode: 200,
    };
} catch (error) {
    console.error("Error: ", error);
    return {
        statusCode: 500,
    };
}
};

标签: amazon-web-serviceshttpaws-lambdaaxiostimeout

解决方案


推荐阅读