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 минут.

timeout configuration

Ответ 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/...