Python 3.6不适用于AWS CodeBuild,Python 3.5不适用于AWS Lambda

问题描述:

我有一个Python 3项目,我试图通过AWS Codestar - > Codepipeline - > Codebuild - > Cloudformation部署到AWS Lambda。我的项目(其实只是由一个简单的API网关处理程序方法组成)导入一个Python 3(需要3个)项目(报纸)。我在家用电脑上使用Virtualenv 15.1.0,如果我用Python 3.5安装报纸,然后上传到Lambda(Python 3.6运行时),它会抛出与PIL/Pillow有关的错误。Python 3.6不适用于AWS CodeBuild,Python 3.5不适用于AWS Lambda

首先它说找不到_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。

因此,我试图在我的buildspec.yml文件的安装阶段在Codebuild中安装Python 3.6,但是在安装后我找不到python3 *可执行文件。

我唯一能想到的其他事情就是创建Codestar项目,编辑使用Ubuntu的代码构建,然后安装一切(就像我在本地做的那样),但是Codestar内部没有办法做到这一点,我觉得这样可能会使我陷入一个兔子洞,这很难实现自动化。有没有办法在我的项目中将该配置作为代码进行创建?

编辑 试图从源代码构建和安装Python 3.6,但是当尝试安装Pip时,我收到错误,说没有安装SSL。回顾构建日志时,似乎还没有安装其他“位”。

所以,在这里我的问题是:

  • 我如何得到的Python 3.6成从Codestar项目供应的Codebuild环境?
  • 我应该继续尝试从源代码构建它还是切换到Ubuntu环境?
  • 如何自动配置我的代码/项目中的图像/环境?

EDIT 1对于其他人,我对安装和使用Python3.6完整buildspec.yml如下。请注意,它尽可能保持安静,以减少日志消息,减少Cloudwatch成本并加快此过程。通过这样做(安装Python并构建我的应用程序),我最终完成了整个过程大约90秒的时间。由于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 [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 

这就是我的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图像来运行构建。

+0

我应该已经粘贴了我的buildspec,但我确实尝试安装python 3.6,但在尝试通过下载并运行get_pip.py脚本来安装pip时,出现了ssl错误。我如何去安装pip3?或者你知道我可以使用一个完整的码头图像吗?谢谢!! – Brooks

+0

Docker注册表中有https://hub.docker.com/r/frolvlad/alpine-python3/。 –

+0

@Brooks我在安装python之前通过'yum -y install openssl-devel'解决了pip SSL错误 – khstacking

这也是一个选项CodeBuild指向dockerhub上的图像。从docs

要使用另一个Docker镜像,请选择指定Docker镜像。对于自定义图像类型,请选择其他或Amazon ECR。如果选择其他,然后自定义图像ID,在泊坞枢纽键入名称和泊坞窗图像的标签

我已经把我的CodeBuild项目使用python:3.6-alpine,它所有的作品..