AWS CodeBuild中的Python 3.6不可用,AWS Lambda中的Python 3.5不可用

时间:2017-05-26 18:42:56

标签: python amazon-web-services aws-lambda aws-codebuild aws-codestar

我有一个Python 3项目,我试图通过AWS Codestar部署到AWS Lambda - > Codepipeline - > Codebuild - > Cloudformation。

我的项目(实际上只包含一个简单的API网关处理程序方法)导入了Python 3(需要3个)项目(报纸)。我在我的家用电脑上使用Virtualenv 15.1.0,如果我用Python 3.5安装Newspaper然后上传到Lambda(Python 3.6运行时),它会抛出与PIL / Pillow相关的错误。

首先它说它无法找到_image,这似乎是通过删除site-packages中的PIL目录来解决的,但这只会导致它抛出无法找到PIL的错误。

但是,如果我使用Python 3.6构建然后上传到Lambda,它可以正常工作(无论我是否删除PIL)。

所以,在我看来,我无法使用3.5安装Newspaper并尝试在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文件的INSTALL阶段在Codebuild中安装Python 3.6,但是在安装后我找不到python3 *可执行文件。

我能想到的唯一另一件事是创建Codestar项目,编辑codebuild以使用Ubuntu然后安装所有内容(就像我在本地做的那样),但是没有办法在Codestar中做到这一点我感觉像这可能会让我陷入一个兔子洞,这很难自动化。有没有办法将该配置作为我项目中的代码?

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

所以,我的问题是:

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

编辑1 对于其他任何人,我的完整的buildspec.yml用于安装和使用Python3.6如下。请注意,它可以使一切尽可能安静,以减少日志消息,降低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 $@'
      - 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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

这也是将CodeBuild指向dockerhub上的图像的选项。来自docs

  

要使用其他Docker镜像,请选择“指定Docker镜像”。对于自定义图像类型,请选择其他或Amazon ECR。如果选择“其他”,则对于“自定义图像ID”,在“Docker Hub”中键入Docker镜像的名称和标记

我已将我的CodeBuild项目设置为使用python:3.6-alpine并且一切正常..