У меня есть лямбда-функция, написанная на питоне, которая запускает алгоритм обработки сигналов с данными, предоставленными приложением iOS.
Приложение iOS успешно вызывает функцию, но через некоторое время получает ошибку тайм-аута:
Session task failed with error: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo = {_kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x282711350 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo = {_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask .<6>, _NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalDataTask .<6>" ), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://mylambdaURL/invocations, NSErrorFailingURLKey=https://mylambdaURL/invocations, _kCFStreamErrorDomainKey=4}
Я вызываю функцию следующим образом:
lambdaInvoker.invokeFunction("myLambdaName", jsonObject: jsonObject)
.continueWith(block: {(task:AWSTask<AnyObject>) -> Any? in
if ( task.error != nil) {
print("Error: \(task.error!)")
lambdaLogs.errors += 1
return nil
}
if let JSONDictionary = task.result as? NSDictionary {
lambdaLogs.responses += 1
}
return nil
})
Однако журналы функции Lambda не показывают никаких ошибок, функция работает успешно и даже без проблем записывает данные в таблицу DynamoDB. Таким образом, Lambda не истекает, однако функция работает около 60 секунд.
Эта ошибка возникает примерно в половине случаев вызова лямбды.
Любые идеи?
Обновлено:
Я попытался увеличить время ожидания NSURLSession для запроса, выполнив это в appDelegate:
let urlconfig = URLSessionConfiguration.default
urlconfig.timeoutIntervalForRequest = 300
но я все еще получаю тайм-ауты, и максимальное время выполнения лямбда-функции было 70 с, поэтому я думаю, что на самом деле я не устанавливаю правильный timeoutIntervalForRequest
Да, функция работает успешно все время без тайм-аута. И я делаю прямой вызов, я добавлю это к вопросу!
Тогда я бы сказал, что это просто ваша NSURLSession, время ожидания которой истекло. Вы пытались увеличить время ожидания запроса?
Нет, я не знаю, я не знаю, как это сделать, я узнаю и попробую!
@MilanCermak, я пытался это сделать, но, как я указываю в редактировании, я думаю, что делаю это неправильно...
Вы используете общий URLSession? Тот не настраивается. Вы должны либо создать собственный сеанс с вашей конфигурацией, либо, в качестве альтернативы, установить время ожидания в URLRequest. См., например. stackoverflow.com/questions/23428793/… о том, как сделать первое.
Дело в том, что я не знаю, как вызвать лямбда-функцию с помощью пользовательского сеанса. Как вы видите в приведенном выше коде, для этого нет параметра, и я не смог найти способ инициализировать lambdaInvoker с другой конфигурацией, чем "по умолчанию"...
Мой Swift несколько заржавел, но попробуйте что-то вроде этого gist.github.com/milancermak/3b5ddb77feaa454a51b3d66dc29793f8 Вам нужно настроить тайм-аут в конфигурации службы, которая наследуется от сетевой конфигурации; см. github.com/aws-amplify/aws-sdk-ios/blob/master/AWSCore/Servicece/… и github.com/aws-amplify/aws-sdk-ios/blob/…, если я не совсем правильно понял.






Итак, вы говорите, что ваша Lambda успешно работает все время, верно? Тогда он не достигает выделенного тайм-аута времени выполнения? Как ваше приложение вызывает функцию Lambda? Он находится за шлюзом API?