Простой подход к созданию слоя AWS Lambda для оболочки Python OpenCV

Lambda - это бессерверное предложение от AWS, которое позволяет запускать масштабируемый код без необходимости настройки серверов. Каждая среда Lambda (соответствующая различным версиям совместимых языков) поставляется с набором предустановленных пакетов.

Однако что происходит, когда нам требуется пакет, которого нет? Есть несколько подходов к устранению этого недостатка, один из которых - использование лямбда-слоя.

В следующем разделе мы рассмотрим программное решение для создания слоя Lambda для приложения Python 3.7, которое требует OpenCV.

1. Установите библиотеку в совместимой ОС.

Лямбда-функции работают на Amazon Linux (AMI). Поэтому, чтобы гарантировать, что наша версия OpenCV будет работать на Lambda, нам необходимо скомпилировать ее для AMI. Один из способов сделать это - установить библиотеку на экземпляр EC2.

Однако для удобства воспользуемся Docker. Приведенный ниже файл Dockerfile создает образ Docker с установленным OpenCV:

2. Скопируйте соответствующие установленные файлы из Docker в локальный.

Установленная библиотека Python создает артефакты, необходимые для запуска. В случае OpenCV эти артефакты (файлы) можно найти в /packages/opencv-python-3.7/python/lib/python3.7/site-packages. Чтобы наша Lambda могла использовать эту библиотеку, у нее должен быть доступ к этим файлам в том месте, где они ожидают эти файлы.

Поэтому мы копируем эти файлы из образа Docker на наш собственный компьютер, чтобы использовать их при создании слоя Lambda с помощью следующих команд:

docker build --tag=lambda-layer-factory:latest .
docker run --rm -it -v $(pwd):/data lambda-layer-factory cp -r /packages/opencv-python-3.7/ /data

Это создаст папку на машине, на которой выполняется эта команда (наш локальный компьютер), с именем opencv-python-3.7.

3. Zip-папка

Интерфейс для создания слоя Lambda ожидает одного zip-файла со всеми соответствующими артефактами. Чтобы заархивировать файл, мы выполняем команду ниже из каталога opencv-python-3.7:

zip -r opencv-python-37.zip python/

Примечание. Для работы слоя в zip-файле (в несжатом виде) должна быть создана корневая папка с именем python. Пути, необходимые для различных сред выполнения Lambda, указаны в документации.

4. Загрузите Zip-файл в S3.

Команда, которую мы будем использовать на следующем шаге для создания слоя, ожидает, что Zip-файл будет в S3. Чтобы загрузить файл в S3, мы создаем корзину, используя следующую команду:

aws s3 mb s3://my-unique-bucket-name

Затем мы загружаем файл с помощью следующей команды:

aws s3 cp opencv-python-37.zip s3://my-unique-bucket-name

5. Создайте слой.

Наконец, мы создаем слой с помощью следующей команды:

aws lambda publish-layer-version --layer-name python-opencv-37 --description "Open CV for Python 3.7" --content S3Bucket=my-unique-bucket-name,S3Key=opencv-python-37.zip --compatible-runtimes python3.7

Использование нашего слоя

Слой можно добавить к лямбда-функции несколькими способами, в том числе:

  1. Добавление к существующей функции с помощью команды aws lambda update-function-configuration с флагом --layers, как указано в документации.
  2. Использование графического интерфейса пользователя AWS для редактирования слоев, связанных с функцией.
  3. Мой любимый подход - использовать SAM для определения свойств лямбды при создании. В приведенном ниже сценарии показано, как включить только что созданный слой в лямбда-функцию:
YourLambdaName:
  Type: AWS::Serverless::Function
  Properties:
  CodeUri: src/
  Handler: app.lambda_handler
  Runtime: python3.7
  MemorySize: 2048
  Timeout: 30
  Environment:
    Variables:
      MY_FAVORITE_NUMBER: 42
  Policies:
    - AWSLambdaExecute # Managed Policy
    - Version: '2012-10-17' # Policy Document
      Statement:
        - Effect: Allow
          Action:
            - logs:CreateLogGroup
            - logs:CreateLogStream
            - logs:PutLogEvents
            - lambda:Getlayerversion
         Resource: '*'
  Layers:
    - arn:aws:lambda:MY-REGION:MY-ACCOUNT:layer:python-opencv-37:1

Я подробно расскажу о том, как создать лямбда-выражение с помощью SAM, в приведенном ниже руководстве:



Заключение

Мы рассмотрели подход к программному созданию слоя Lambda. Это было показано в контексте установки Python-OpenCV, но может быть распространено на другие языки программирования и библиотеки.

использованная литература

  1. Dockerfile основан на том, что есть в этом проекте.
  2. Этот ответ StackOverflow дает некоторое представление о создании слоя.