amazon-web-services - 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,
};
}
};
解决方案
推荐阅读
- r - R - Spatstat - 使用数据表按 ID 搜索最近邻
- python - 在python中获得尽可能准确的时间
- javascript - 从赛普拉斯命令返回 POST 请求的主体
- html - 将鼠标移动到 ul li 标签但悬停不起作用
- python-3.x - 未找到 Python AWS Lambda 模块
- postgresql - 在不知道密钥的情况下在 jsonb 字段 PostgreSQL 中进行深度搜索
- c++ - 零矩阵不打印,因为它应该 c++
- node.js - Express.js 应用程序错误:Flash 消息未呈现
- c - 访问mmap地址时,收到信号SIGBUS
- angular - 尝试从角度使用 Asp.net 核心 Web api 时出现 Cors 错误