AWS Lambda: Задание выполнено
Мы попросили мой школьный проект написать Java-код, который работает в AWS Lambda. Предполагается получить исходный код определенных URL-адресов, а затем загрузить его в ведро S3. Java-код должен работать на AWS Lambda.
Я получаю исходный код переменной String в Java. Затем у меня есть цикл while, который пытается записать String в файл в каталоге /tmp. Затем файл загружается на S3.
Все работает, но я застрял с одним конкретным URL. Я проследил проблему до этого момента:
try {
BufferedWriter out = new BufferedWriter(new FileWriter("/tmp/url.txt"));
out.write(source_code); //Replace with the string
//you are trying to write
out.close();
}
catch (IOException e) {
System.out.println("Exception ");
}
Самое странное, когда я тестирую код локально, все работает. Файл создается в каталоге /tmp на моем компьютере, а затем он загружается в ведро S3. Однако, когда я запускаю код в Lambda, я получаю следующую ошибку:
Task timed out after 15.00 seconds
Любая идея, почему Lambda не может записать файл в свою временную директорию в этом конкретном случае и работает с другими?
Ответы
Ответ 1
Amazon Lambda предназначена для использования в качестве системы, управляемой событиями, которая реагирует на события. Поток это:
- Что-то происходит где-то, что вызывает Lambda (например, загрузка в Amazon S3, данные, поступающие в поток Amazon Kinesis, приложение, вызывающее функцию Lambda напрямую)
- Лямбда-функция создана, данные из события триггера передаются
- Лямбда-функция работает
Лямбда-функции ограничены максимальным временем выполнения 15 минут (недавно оно было увеличено по сравнению с первоначальным 5-минутным таймаутом). Фактический предел настраивается при создании лямбда-функции. Ограничение установлено, потому что лямбда-функции должны быть небольшими и быстрыми, а не большими приложениями.
В вашем сообщении об ошибке указано, что Task timed out after 15.00 seconds
. Это означает, что AWS намеренно остановил задачу, когда она достигла времени выполнения 15 секунд. Это не имеет никакого отношения к тому, что функция делала в то время, ни к файлу, который обрабатывался.
Исправление: Увеличьте время ожидания на странице конфигурации вашей функции Lambda.
Ответ 2
В моем случае, когда задача работала нормально локально, но была рассчитана на Лямбду, это было потому, что мне нужно было увеличить память, выделенную для экземпляра Lambda.
Ответ 3
Похоже, вы настроили тайм-аут на 15 секунд. Вы можете увеличить тайм-аут, как описано на этом снимке экрана, и в соответствии с настройками лямбды максимальное время, которое оно позволяет вам выполнить, составляет 15 минут.
Ответ 4
Я решил проблему, поместив AWS-SDK вне тела функции:
var AWS = require("aws-sdk");
exports.handler = function(event, context, callback)
{
//var AWS = require("aws-sdk"); //Error: Task timed out after 3.00 seconds
var docClient = new AWS.DynamoDB.DocumentClient();
console.log("Lambda starts");
...
Ответ 5
Для тех, кто сталкивается с этой проблемой тайм-аута при использовании async
, обратите внимание, что образец отличается для обработчика для асинхронных функций.
Вместо
exports.handler = function (event, context, callback) {
callback(null, {
statusCode: 200,
body: JSON.stringify({/* return stuff here */})
});
};
его
exports.handler = async function (event, context) {
return {
statusCode: 200,
body: JSON.stringify({/* return stuff here */})
};
};
Ответ 6
Недавно я работал над POC для работы с функцией AWS Lambda. Я также столкнулся с той же проблемой (задание истекло через 15.01 секунд). Я просто увеличил выделение памяти, и это решило проблему. Прелесть в том, что я мог получить ответ через пару секунд. Итак, я думаю, что ошибка немного вводит в заблуждение. Это должно предоставить точную основную причину отказа.
Ответ 7
Во-первых, зачем писать в /tmp/? Вы пишете в том же месте, где выполняется функция Lambda?
Однако лучше сделать это, если вы хотите написать строку как файл S3, тогда вы можете создать S3Object и записать его непосредственно в AWS S3. Вот сообщение, в котором показан пример: fooobar.com/info/339143/...