AWS Lambda: как использовать инструменты, которые необходимо сначала установить в Linux?

Насколько я понимаю, AWS Lambda работает на прикладном уровне изолированной среды.

Во многих ситуациях функции должны использовать сторонние инструменты, которые должны быть сначала установлены на компьютере с Linux. Например, функция обработки мультимедиа использует exiftool для извлечения метаданных из изображения, поэтому я сначала устанавливаю exiftool.

Теперь я хочу перенести код обработки мультимедиа в AWS Lambda. Мой вопрос в том, как я могу использовать те инструменты, которые я изначально должен установить в Linux? Мой код написан на Java, и необходимо exiftool.


person Jinsong Li    schedule 13.07.2015    source источник


Ответы (4)


Все, что выполняет ваша функция Lambda, должно быть включено в загружаемый вами пакет развертывания.

Это означает, что если вы хотите запустить код Java, вы можете ссылаться на другие библиотеки Java. (Точно так же, если вы хотите запустить код Node.js, вы можете ссылаться на другие библиотеки Node.)

Независимо от используемых вами инструментов, результирующий ZIP-файл должен иметь следующую структуру:

  • Все скомпилированные файлы классов и файлы ресурсов на корневом уровне.

  • Все необходимые jar-файлы для запуска кода находятся в каталоге /lib.

(источник)

Или вы можете загрузить файл .jar.

exiftool, с другой стороны, является программой командной строки Perl. Я подозреваю, что на вашей локальной машине вы выкладываете свой Java-код и запускаете его.

Вы не можете сделать это в AWS Lambda. Вам нужно найти пакет Java, который извлекает информацию EXIF ​​(я уверен, что есть из чего выбрать) и включить его в свой пакет развертывания. Вы не можете устанавливать программные пакеты на Lambda.

person awendt    schedule 13.07.2015
comment
Спасибо за разъяснение этого. Теперь я лучше понимаю лямбду. - person Jinsong Li; 13.07.2015

Чтобы расширить ответ Дэниела, если вы хотите связать exiftool, вы должны выполнить шаги 1 и 2 для платформ Unix/Linux из официальные инструкции по установке. Затем вы должны включить exiftool и lib в zip-файл вашей функции. Чтобы запустить exiftool, вы должны сделать что-то вроде:

const exec = require('child_process').exec;

exports.handler = (event, context, callback) => {
  // './exiftool' gave me permission denied errors
  exec('perl exiftool -ver', (error, stdout, stderr) => {
    if (error) {
      callback(`error: ${error}`);
      return;
    }
    callback(null, `stderr: ${stderr} \n stdout: ${stdout}`);
  });
}
person Palisand    schedule 13.12.2017

https://aws.amazon.com/lambda/faqs/

Вопрос. Какие языки поддерживает AWS Lambda?

AWS Lambda поддерживает код, написанный на Node.js (JavaScript), Python и Java (совместимый с Java 8). Ваш код может включать существующие библиотеки, даже нативные. Ознакомьтесь с нашей документацией по использованию Node.js, Python и Java.

Таким образом, вы можете вызывать собственные процессы, если они предварительно установлены, но только из JavaScript и Java в качестве родительского процесса.

Чтобы получить общее представление о том, что установлено, посмотрите, какие пакеты установлены:

https://gist.github.com/royingantaginting/4499668

Этот список не будет точным на 100%, для этого вам нужно будет посмотреть непосредственно на образ AMI (ami-e7527ed7)

exiftool не устанавливается по умолчанию. Я сомневаюсь, что учетная запись, выполняющая лямбда-функцию, будет иметь достаточно прав для глобальной установки чего-либо, но вы всегда можете связать exiftool со своей функцией Node или Java.

Вы также можете взглянуть на lambdash (https://github.com/alestic/lambdash) который позволяет вам запускать команду из вашей локальной командной строки на удаленном экземпляре лямбда

person Daniel Worthington-Bodart    schedule 19.08.2015

Теперь это можно сделать с помощью AWS Lambda Layers.

Пример того, как конкретно подготовить слой для exiftool, можно найти здесь:

https://gist.github.com/hughevans/6b8c57839b8194ba910428de4375794a

person patforna    schedule 17.01.2020