Ошибка запроса внешнего URI AWS Lambda: подключить ETIMEDOUT

Я закодировал в своей локальной среде разработки функцию node.js, которая выполняет несколько запросов к внешнему url-uri (асинхронно с использованием bluebird и request-promise). Работает нормально, функция получает результаты и сохраняет информацию в базу данных EC3.

Проблема возникает, когда я развертываю код (включая модули узла) и выполняю его. У него есть доступ к базе данных, но когда он пытается получить доступ к внешнему URL-адресу, модуль «запрос-обещание» получает ошибку «подключить ETIMEDOUT».

Я сделал все, что указывает AWS, чтобы получить его, прочитал и попробовал все решения, которые я нашел в Stackoverflow, но проблема все еще не устранена.

https://www.youtube.com/watch?v=AR1nt3iGR5o

Связанная роль, которая запускает функцию, имеет следующие политики:

AWSLambdaFullAccess — AWSCodeDeployRoleForLambda — AmazonVPCFullAccess — AWSLambdaExecute — AWSLambdaBasicExecutionRole — AWSLambdaVPCAccessExecutionRole — AWSLambdaRole — oneClick_lambda_basic_execution_1535968782861

Конфигурация сети

Нет пути

Таблица маршрутов

Не могли бы вы помочь мне, пожалуйста, или хотя бы подсказать, пожалуйста?

КОД:

const Promise = require('bluebird');
const Rp = require('request-promise');
const http = require('http');

var httpAgent = new http.Agent();
httpAgent.maxSockets = 15;

var promises = urls.map(function(url){
  return Rp({uri: url.url, pool:httpAgent}).then(function(result){
      url.result = result;
      // Saving space
      delete url.url;
      return url;
  })

});


Promise.all(promises).then(function(results){
    return(processResults(results));
}).catch(Error, function (e) {
    console.error("Error doing Request: ", e);
}).error(function (e) {
    console.error("Unable get info: ", e);
}).then(function(results){
    try{
        product.callback(results);
    }catch (exception) {
        console.error('Error callback: ',exception);   
    }
}).then(function(){
    product.finally();
});

ОШИБКА:

2018-09-28T14:53:48.989Z    efb5493a-c32d-11e8-ae42-f73dec33ca2a    Error doing Request: { RequestError: Error: connect ETIMEDOUT 147.83.184.65:80
at new RequestError (/var/task/node_modules/request-promise-core/lib/errors.js:14:15)
at Request.plumbing.callback (/var/task/node_modules/request-promise-core/lib/plumbing.js:87:29)
at Request.RP$callback [as _callback] (/var/task/node_modules/request-promise-core/lib/plumbing.js:46:31)
at self.callback (/var/task/node_modules/request/request.js:185:22)
at emitOne (events.js:116:13)
at Request.emit (events.js:211:7)
at Request.onRequestError (/var/task/node_modules/request/request.js:881:8)
at emitOne (events.js:116:13)
at ClientRequest.emit (events.js:211:7)
at Socket.socketErrorListener (_http_client.js:387:9)
at emitOne (events.js:116:13)
at Socket.emit (events.js:211:7)
at emitErrorNT (internal/streams/destroy.js:64:8)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickDomainCallback (internal/process/next_tick.js:218:9)
name: 'RequestError',
message: 'Error: connect ETIMEDOUT 147.83.184.65:80',
cause: 
{ Error: connect ETIMEDOUT 147.83.184.65:80
at Object._errnoException (util.js:1022:11)
at _exceptionWithHostPort (util.js:1044:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1198:14)
code: 'ETIMEDOUT',
errno: 'ETIMEDOUT',
syscall: 'connect',
address: '147.83.184.65',
port: 80 },
error: 
{ Error: connect ETIMEDOUT 147.83.184.65:80
at Object._errnoException (util.js:1022:11)
at _exceptionWithHostPort (util.js:1044:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1198:14)
code: 'ETIMEDOUT',
errno: 'ETIMEDOUT',
syscall: 'connect',
address: '147.83.184.65',
port: 80 },
options: 
{ uri: 'http://geoserver.hydsdev.net/geoserver/mhews/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&FORMAT=image%2Fjpeg&TRANSPARENT=true&INFO_FORMAT=text%2Fxml&FEATURE_COUNT=50&X=50&Y=50&SRS=EPSG%3A4326&WIDTH=101&HEIGHT=101&QUERY_LAYERS=mhews:ffews_rain_accumulation_15min_opera&LAYERS=mhews:ffews_rain_accumulation_15min_opera&BBOX=0.6319608%2C42.770155%2C0.8319608%2C42.870155000000004&TIME=2018-09-28T17:30:00.000Z',
pool: 
Agent {
domain: null,
_events: [Object],
_eventsCount: 1,
_maxListeners: undefined,
defaultPort: 80,
protocol: 'http:',
options: [Object],
requests: {},
sockets: {},
freeSockets: {},
keepAliveMsecs: 1000,
keepAlive: false,
maxSockets: 15,
maxFreeSockets: 256,
'http:': [Object] },
callback: [Function: RP$callback],
transform: undefined,
simple: true,
resolveWithFullResponse: false,
transform2xxOnly: false },
response: undefined }

Ваше здоровье.


person NorthmaN    schedule 27.09.2018    source источник
comment
Настроена ли функция Lambda для работы внутри вашего VPC?   -  person Mark B    schedule 27.09.2018
comment
Да, он работает, пишет журналы, имеет доступ к базе данных EC3, но терпит неудачу, когда пытается сделать http-запрос для получения XML-файла.   -  person NorthmaN    schedule 28.09.2018
comment
Спасибо @MarkB, я уже прочитал и выполнил эти шаги (оба видео), но все еще застрял, не имея доступа и не получая ETIMEDOUT. Сделаю это еще раз и попытаюсь выяснить, что не так. Если сегодня это не сработает, я не буду использовать функции Lambda... Я думал, что должно быть легко использовать бессерверные функции... по крайней мере, AWS показывает, как есть... но это не так.   -  person NorthmaN    schedule 28.09.2018
comment
Откуда вы загружаете файл XML? Если это внешний сервер, убедитесь, что в вашей группе безопасности есть исходящие правила, разрешающие трафик.   -  person Rajesh    schedule 28.09.2018
comment
Привет @Раджеш! Правила группы безопасности для исходящего трафика: Порты: Все Назначение: 0.0.0.0/0. Спасибо за вашу заботу.   -  person NorthmaN    schedule 28.09.2018
comment
Можете ли вы опубликовать фрагмент кода, который делает HTTP-запрос, а также, если возможно, подробную ошибку.   -  person Rajesh    schedule 28.09.2018
comment
@Раджеш, ты понял. Код работает в моей локальной среде, а сервер, который дает XML, находится в другом месте.   -  person NorthmaN    schedule 28.09.2018
comment
Наконец я исправил проблему. Не знаю почему, но в объект опций «запрос-обещание» я должен поместить: headers: {'User-Agent':'request' } . Большое спасибо @Rajesh!   -  person NorthmaN    schedule 01.10.2018


Ответы (1)


Наконец я исправил проблему. Не знаю почему, но в объект опций «запрос-обещание» я должен поместить: headers: {'User-Agent':'request' } . Большое спасибо @Rajesh!

person NorthmaN    schedule 25.09.2020