2

J'ai un projet Python 3 que j'essaye de déployer sur AWS Lambda via AWS Codestar -> Codepipeline -> Codebuild -> Cloudformation.Python 3.6 n'est pas disponible dans AWS CodeBuild, Python 3.5 n'est pas disponible dans AWS Lambda

Mon projet (qui consiste simplement en une simple méthode de gestionnaire de passerelle API) importe un projet Python 3 (nécessite 3) (journal). J'utilise Virtualenv 15.1.0 sur mon ordinateur personnel et si j'installe Newspaper avec Python 3.5 puis que je télécharge sur Lambda (Python 3.6 runtime), il lance des erreurs liées à PIL/Pillow. Tout d'abord, il dit qu'il ne peut pas trouver _image, qui semble être résolu en supprimant le répertoire PIL dans les packages de site, mais cela entraîne simplement l'erreur qu'il ne peut pas trouver PIL.

Si, cependant, je construis avec Python 3.6 et que je télécharge ensuite sur Lambda, cela fonctionne très bien (que je supprime PIL ou non). Donc, il me semble que je ne peux pas installer Newspaper avec la version 3.5 et que j'essaie de l'exécuter dans un environnement d'exécution 3.6. Donc, maintenant j'essaie de déployer via Codestar, mais Codestar semble par défaut à aws/codebuild/eb-nodejs-4.4.6-amazonlinux-64: 2.1.3, même pour les projets Python, et tout ce qu'il semble avoir disponible dans le référentiel Yum est Python 3.5 et bien sûr, Lambda n'a que 3.6.

Même si je change l'image dans Codebuild, il ne semble pas y avoir d'images construites avec le moteur d'exécution Python3.6 (selon la documentation). Même les images de Docker semblent manquer de Python 3.6. Par conséquent, j'essaye d'installer Python 3.6 dans Codebuild pendant la phase d'INSTALLATION dans mon dossier de buildspec.yml, cependant je ne peux pas trouver l'exécutable de python3 * après l'installation. La seule autre chose que je peux penser est de créer le projet Codestar, éditer codebuild pour utiliser Ubuntu et ensuite installer tout (comme je l'ai fait localement), mais il n'y a aucun moyen de le faire à partir de Codestar et je pense comme ça peut me faire tomber dans un trou de lapin et c'est à peine automatisé. Existe-t-il un moyen de créer cette configuration en tant que code à partir de mon projet?

EDIT Tentative de construire et installer Python 3.6 à partir des œuvres de source, mais en essayant d'installer Pip, je reçois des erreurs disant SSL n'a pas été installé. Et quand on regarde les logs de construction, il semble que d'autres "bits" n'ont pas été installés.

Alors, mes questions sont ici:

  • Comment puis-je obtenir Python 3.6 dans un environnement Codebuild provisionné d'un projet Codestar?
  • Devrais-je continuer à essayer de le construire à partir de la source ou de passer à l'environnement Ubuntu?
  • Comment puis-je configurer automatiquement l'image/l'environnement dans mon code/projet?

EDIT 1 Pour quelqu'un d'autre, mon buildspec.yml complet pour l'installation et l'utilisation Python3.6 est ci-dessous. Notez que tout est aussi silencieux que possible afin de réduire les messages du journal, de réduire le coût du Cloudwatch et d'accélérer le processus. J'ai fini par raser environ 90 secondes de tout le processus en faisant cela (installation de Python et construction de mon application). Depuis CodeBuild les frais basés sur le temps passé, c'est crucial.

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 [email protected]' 
     - 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 

Répondre

4

Voici à quoi ressemble mon buildspec.yml. Notez que la version python3.6 est sortie dans la phase 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 
    ... 

Une autre façon, à ce sujet est de télécharger une image docker Python3.6 à ECR. Vous pouvez définir l'option d'utilisation de cette image ECR pour exécuter votre build.

+0

je devrais J'ai collé mon buildspec, mais j'ai essayé d'installer python 3.6 mais en essayant d'installer pip en téléchargeant et en exécutant un script get_pip.py j'ai eu des erreurs ssl. Comment puis-je installer l'outil pip3? Ou connaissez-vous une image docker complète que je pourrais utiliser à la place? Merci!! – Brooks

+0

Il existe https://hub.docker.com/r/frolvlad/alpine-python3/ dans le registre des dockers. –

+0

@Brooks J'ai résolu les erreurs SSL pip en faisant 'yum -y install openssl-devel' avant d'installer python – khstacking

0

C'est également une option pour pointer CodeBuild à une image sur dockerhub. Depuis le docs:

Pour utiliser une autre image Docker, choisissez Spécifier une image Docker. Pour le type d'image personnalisée, choisissez Autre ou Amazon ECR. Si vous choisissez Autre, puis l'image personnalisée ID, tapez le nom et l'étiquette de l'image Docker dans Docker Hub

J'ai mis mon projet CodeBuild à utiliser python:3.6-alpine et tout cela fonctionne ..