AWS Lambda с Python 3 и virtualenv не удалось установить зависимости - PullRequest
0 голосов
/ 21 марта 2019

Я работаю над проектом на Python3.6 и использую AWS Lambda для реализации некоторых функций на Python.Я написал файл buildspec.yml для «сборки» и развертывания своей функции из репозитория в лямбда-функции.Вот код:

version: 0.2
phases:
 install:
   commands:
     - echo "install step"
     - apt-get update
     - apt-get install zip -y
     - apt-get install python3-pip -y
 pre_build:
   commands:
     - echo "pre_build step"
     - pip install --upgrade pip
     - pip install --upgrade awscli
     - pip install --upgrade virtualenv
     # Define directories
     - export HOME_DIR=`pwd`
     - export PREPROCESSING_DIR=$HOME_DIR/preprocessing
     - export COMPARE_DIR=$HOME_DIR/compareHilightGood
     - export LAUNCH_HILIGHT_DIR=$HOME_DIR/LaunchHiLight
     - export NLTK_DATA=$HOME_DIR/nltk_data
     - mkdir nltk_data
     # create virtual environements
     - cd $HOME_DIR
     - virtualenv venv_preprocessing
     - virtualenv venv_compare
     - export SITE_PACKAGE_PREPROCESSING=$HOME_DIR/venv_preprocessing/lib/python3.6/site-packages
     - export SITE_PACKAGE_COMPARE=$HOME_DIR/venv_compare/lib/python3.6/site-packages
 build:
   commands:
     - echo "build step"
     - cd $HOME_DIR
     # Configure preprocessing virtual environement
     - . venv_preprocessing/bin/activate
       pip install requests
       pip install nltk
       python -m nltk.downloader -d $NLTK_DATA wordnet stopwords punkt
       deactivate
     - mv $NLTK_DATA $SITE_PACKAGE_PREPROCESSING
     - mv $PREPROCESSING_DIR/* $SITE_PACKAGE_PREPROCESSING
     - cd $SITE_PACKAGE_PREPROCESSING
     - sudo zip -r9 -q $HOME_DIR/preprocessing.zip .
     # Configure compare virtual environement
     - cd $HOME_DIR
     - . venv_compare/bin/activate
       pip install gensim
       pip install pandas
       deactivate
     - mv $COMPARE_DIR/* $SITE_PACKAGE_COMPARE
     - cd $SITE_PACKAGE_COMPARE
     - sudo zip -r9 -q $HOME_DIR/compare.zip .
     # Launch hilight
     - cd $LAUNCH_HILIGHT_DIR
     - sudo zip -r9 -q $HOME_DIR/launchHilight.zip .
 post_build:
   commands:
     - echo "post_build step"
     - cd $HOME_DIR
     - ls
     # preprocessing
     - aws s3 rm s3://lambda-preprocessing --recursive
     - aws s3 cp --acl public-read preprocessing.zip s3://lambda-preprocessing/preprocessing.zip
     - aws lambda update-function-code --function-name arn:aws:lambda:eu-west-3:671560023774:function:preprocessing --s3-bucket lambda-preprocessing --s3-key preprocessing.zip
     - aws lambda update-function-configuration --function-name arn:aws:lambda:eu-west-3:671560023774:function:preprocessing --environment 'Variables={NLTK_DATA=/var/task/nltk_data}'
     # compare hilight good
     - aws s3 rm s3://lambda-comparehilightgood --recursive
     - aws s3 cp --acl public-read compare.zip s3://lambda-comparehilightgood/compare.zip
     - aws lambda update-function-code --function-name arn:aws:lambda:eu-west-3:671560023774:function:compareHilightGood --s3-bucket lambda-comparehilightgood --s3-key compare.zip
     # launchHilight
     - aws s3 rm s3://hilightalgo --recursive
     - aws s3 cp --quiet --acl public-read launchHilight.zip s3://hilightalgo/launchHilight.zip
     - aws lambda update-function-code --function-name arn:aws:lambda:eu-west-3:671560023774:function:LaunchHilight --s3-bucket hilightalgo --s3-key launchHilight.zip
artifacts:
  files:
    - '**/*'

В этом процессе сборки я создаю два virtualenv, устанавливаю в них свои зависимости, а затем упаковываю лямбда-пакеты для развертывания, состоящие из:

  1. site-packages of virtualenv
  2. Исходники

После этого я сохраняю свои zip-пакеты в S3-бункерах и обновляю код функции с помощью aws cli.Кажется, все работает нормально, но у меня есть две проблемы:

Во-первых, файлы кажутся мне слишком легкими (3,8 МБ).И когда я хочу протестировать свои лямбда-функции, это как будто никакие модули не были установлены.См. Ошибку ниже:

Unable to import module 'lambda_function': No module named 'gensim'

Я думаю, что virtualenv не имеет установленных модулей, потому что когда я скачал файлы .zip, я увидел, что папка __pycache__ содержит только маленький easy_install.cpython-36.pyc.

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

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Заархивировали ли вы пакеты сайтов из lib и lib64 в вашем virtualenv?Я заметил, что какой-то пакет оказался в одном или другом месте, и я должен упаковать их из обоих мест.

Посмотрите, можете ли вы найти, установлен ли gensim внутри site-пакетов в lib / ...или lib64 /...

0 голосов
/ 04 июня 2019

Если вы развертываете в AWS Lambda, вам лучше использовать такую ​​среду, как Безсерверная или Zappa , чтобы упаковать свой код и зависимости в zip-файл, готовый к развертыванию.через S3.

Оба работают, хотя я предпочитаю Безсерверный, так как он подключаемый, кросс-языковой, кажется, что лучше поддерживается и просто работает для меня. Этот пост дает краткое изложение того, как начать работу.

Как только у вас работает безсерверная упаковка, ваш buildspec.yml становится очень простым: установить без сервера, запустить serverless package.

Вы также можете использовать Serverless для управления инфраструктурой AWS, если хотите.Но я предпочитаю делать это отдельно, используя Terraform .

...