Простой подход к созданию слоя 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
Использование нашего слоя
Слой можно добавить к лямбда-функции несколькими способами, в том числе:
- Добавление к существующей функции с помощью команды
aws lambda update-function-configuration
с флагом--layers
, как указано в документации. - Использование графического интерфейса пользователя AWS для редактирования слоев, связанных с функцией.
- Мой любимый подход - использовать 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, но может быть распространено на другие языки программирования и библиотеки.