Python 3.6 недоступен в AWS CodeBuild, Python 3.5 недоступен в AWS Lambda
У меня есть проект Python 3, который я пытаюсь развернуть в AWS Lambda через AWS Codestar -> Codepipeline -> Codebuild -> Cloudformation.
Мой проект (который на самом деле состоит из простого метода-обработчика API Gateway) импортирует проект (газету) Python 3 (требуется 3). Я использую Virtualenv 15.1.0 на своем домашнем компьютере, и если я устанавливаю газету с Python 3.5, а затем загружаю ее в Lambda (среда выполнения Python 3.6), он выдает ошибки, связанные с PIL / Pillow.
Сначала он говорит, что не может найти _image, что, по-видимому, решается удалением каталога PIL в пакетах сайта, однако это приводит к тому, что он выдает ошибку, что не может найти PIL.
Однако, если я собираю с Python 3.6, а затем загружаю в Lambda, он работает просто отлично (удаляю ли я PIL или нет).
Таким образом, мне кажется, что я не могу установить газету с 3.5 и попытаться выполнить в среде выполнения 3.6.
Итак, сейчас я пытаюсь выполнить развертывание через Codestar, однако Codestar, по-видимому, по умолчанию использует aws/codebuild/eb-nodejs-4.4.6-amazonlinux-64:2.1.3 даже для проектов Python, и все, что кажется доступным в репозиторий Yum - это Python 3.5, и, конечно, Lambda имеет только среду выполнения 3.6.
Даже если я переключу изображение внутри самого Codebuild, похоже, что не будет никаких изображений, созданных с помощью среды исполнения Python3.6 (согласно документации). Кажется, даже изображениям Docker не хватает Python 3.6.
Итак, я пытаюсь установить Python 3.6 в Codebuild на этапе INSTALL в моем файле buildspec.yml, однако я не могу найти исполняемый файл python3* после установки.
Единственное, о чем я могу думать, это создать проект Codestar, отредактировать codebuild для использования Ubuntu, а затем установить все (как я делал это локально), но из Codestar сделать это невозможно, и я чувствую, что это может принести меня в кроличью нору, и это вряд ли автоматизировано. Есть ли способ сделать эту конфигурацию как код из моего проекта?
РЕДАКТИРОВАТЬ Попытка собрать и установить Python 3.6 из исходного кода работает, но затем, при попытке установить Pip, я получаю ошибки, говорящие, что SSL не установлен. И, оглядываясь назад на журналы сборки, кажется, что другие "биты" также не были установлены.
Итак, мои вопросы здесь:
- Как я могу получить Python 3.6 в среде Codebuild, предоставляемой проектом Codestar?
- Должен ли я продолжать пытаться собрать его из исходного кода или переключиться на среду Ubuntu?
- Как я могу автоматически настроить изображение / среду в моем коде / проекте?
РЕДАКТИРОВАТЬ 1 Для всех остальных мой полный buildspec.yml для установки и использования Python3.6 ниже. Обратите внимание, что он хранит все как можно тише, чтобы уменьшить количество сообщений журнала, снизить стоимость Cloudwatch и ускорить процесс. Таким образом, я смог сэкономить около 90 секунд всего процесса (установив Python и собрав мое приложение). Поскольку плата за CodeBuild основана на затраченном времени, это крайне важно.
version: 0.2
phases:
install:
commands:
- yum -qye 0 update
- yum -qye 0 groupinstall development
- yum -y install python-devel
- yum -qye 0 install libxml2-devel libxslt-devel libjpeg-devel zlib-devel libpng-devel openssl-devel sqlite-devel
- export HOME_DIR=`pwd`
# I would recommend hosting the tarball in an uncompressed format on S3 in order to speed up the download and decompression
- wget --no-verbose https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz
- tar -xzf Python-3.6.1.tgz
- cd Python-3.6.1
- ./configure -q --enable-loadable-sqlite-extensions
- make --silent -j2
- make altinstall --silent
- cd $HOME_DIR
- rm Python-3.6.1.tgz
- rm -rf Python-3.6.1/
- ln -s /usr/local/bin/python3.6 /usr/bin/python3
- python3 -m pip install virtualenv
- pip3 install -U nltk
pre_build:
commands:
- cd $HOME_DIR
# Start a virtualenv and activate
- virtualenv -p /usr/bin/python3 $VIRTUAL_ENV_DIR_NAME
- source $VIRTUAL_ENV_DIR_NAME/bin/activate
- $VIRTUAL_ENV_DIR_NAME/bin/pip3.6 install nltk
# If you plan to use any separate resources on Codecommit, you need to configure git
- git config --global credential.helper '!aws codecommit credential-helper $@'
- git config --global credential.UseHttpPath true
# git clone whatever you need
build:
commands:
- cd $HOME_DIR
- mv $VIRTUAL_ENV/lib/python3.6/site-packages/* .
- aws cloudformation package --template template.yml --s3-bucket $S3_BUCKET --output-template template-export.json
artifacts:
type: zip
files:
- template-export.json
3 ответа
Вот как выглядит мой buildspec.yml. Обратите внимание, что версия python3.6 выводится в фазе pre_build.
version: 0.2
phases:
install:
commands:
- yum -y groupinstall development
- yum -y install zlib-devel
- wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
- tar xJf Python-3.6.0.tar.xz
- cd Python-3.6.0
- ./configure
- make
- make install
pre_build:
commands:
- python3 -V
...
Другой способ - загрузить образ докера Python3.6 в ECR. Вы можете установить опцию, чтобы использовать этот образ ECR для запуска вашей сборки.
Теперь есть официальный образ Docker для Python3.6 от AWS. Ты можешь использовать aws/codebuild/python:3.6.5
как ваш образ CodeBuild.
Это также опция для указания CodeBuild на изображение на Dockerhub. Из документов:
Чтобы использовать другое изображение Docker, выберите "Указать изображение Docker". Для Пользовательского типа изображения выберите Другое или Amazon ECR. Если вы выберете "Другой", то в качестве "Пользовательского идентификатора изображения" введите имя и тег изображения Docker в Docker Hub.
Я настроил свой проект CodeBuild для использования python:3.6-alpine, и все это работает..