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, и все это работает..

Другие вопросы по тегам