Вызов лямбда-функции вручную имитирует триггер события S3 ObjectCreated? (php авс SDK)

У нас была третья сторона, которая создала сценарий эскиза изображения на основе Python, который мы настроили для запуска события S3 ObjectCreated. Затем мы импортировали коллекцию из почти 5000 изображений после тестирования скрипта, но огромный объем файлов изображений в конечном итоге заполнил тестовое пространство лямбда во время импорта, и только около 12% изображений были созданы для них эскизы.

Нам нужно вручную создать миниатюры для остальных 88%. Хотя у меня есть скрипт на основе php, который я могу запустить из EC2, он несколько медленный. Мне приходит в голову, что я мог бы создавать их «по запросу» и не создавать эскизы для всех файлов, которые не были созданы автоматически во время импорта. К некоторым файлам клиент может никогда больше не получить доступ — существующий лямбда-миниатюрист уже имеет небольшую задержку, которую я учитываю в цикле повторных попыток javascript setTimeout, но перед вызовом этого цикла я мог бы проверить, является ли это недавней загрузкой — например в течение последних 10 секунд — всякий раз, когда эскиз не найден, запускайте лямбду вручную перед запуском цикла повтора.

Но для этого мне нужно иметь возможность запускать лямбда-скрипт с параметрами, аналогичными триггеру событий. Похоже, что их скрипт получает доступ только к имени корзины и ключу из значений события:

bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')

Будучи незнакомым с лямбда-выражением и все еще немного новым для sdk, я не уверен, как мне сделать лямбда-триггер, который будет включать эти значения для скрипта python.

Я могу использовать либо php sdk, либо javascript sdk. (или даже cli)

Любая помощь приветствуется.


person Scott    schedule 30.08.2019    source источник
comment
но огромный объем файлов изображений в конечном итоге заполнил тестовое пространство лямбда-выражения во время импорта. Вам нужно очистить временное пространство самостоятельно, потому что вы не знаете, будет ли контейнер повторно использоваться в последующем вызов... но только один вызов функции Lambda за раз имеет доступ к определенному каталогу /tmp.   -  person Michael - sqlbot    schedule 01.09.2019
comment
обратите внимание, мы третья сторона заключила контракт на эту часть. Я бы почистил временный файл, если бы сделал это. (но я не был достаточно знаком с python/node или лямбда-средой). Теперь они очищают само временное пространство после получения этой ошибки. Однако сейчас это нам не очень помогает, так как импорт завершен.   -  person Scott    schedule 03.09.2019


Ответы (1)


Я думаю, что понял это, скопировав структуру данных в ссылках на python, чтобы создать простую полезную нагрузку и вызвать ее как событие:

$lambda = $awsSvc->getAwsSdkCached()->createLambda();
//    bucket = event['Records'][0]['s3']['bucket']['name']
//    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
$bucket = "mybucket";
$key = "somefolder/someimage.jpg";
$payload_json = sprintf('{"Records":[{"s3":{"bucket":{"name":"%s"},"object":{"key":"%s"}}}]}', $bucket, $key);

$params = array(
        'FunctionName' => 'ThumbnailGenerator',
        'InvocationType' => 'Event',
        'LogType' => 'Tail',
        'Payload' => $payload_json
);
$result = $lambda->invoke($params);
person Scott    schedule 30.08.2019