AWS CodeBuild中无法使用Python 3.6,AWS Lambda中无法使用Python 3.5

9
我有一个Python 3项目,我想通过AWS Codestar-> Codepipeline-> Codebuild-> Cloudformation部署到AWS Lambda。我的项目(实际上只包含一个简单的API Gateway处理程序)导入了一个Python 3(需要3)项目(newspaper)。我在家里的电脑上使用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内部执行该操作,而且我感觉这可能会让我陷入一个兔子洞里,这几乎无法自动化。有没有办法在我的项目中将该配置作为代码自动配置?我的问题如下:
1. 如何将Python 3.6放入从Codestar项目提供的Codebuild环境中? 2. 我应该继续尝试从源代码构建它还是切换到Ubuntu环境? 3. 如何自动配置映像/环境在我的代码/项目中?

编辑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
3个回答

9
这是我的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 docker镜像上传到ECR。您可以设置选项,使用此ECR镜像来运行构建。

我应该粘贴我的buildspec,但我尝试安装Python 3.6,然后在尝试通过下载和运行get_pip.py脚本安装pip时遇到了ssl错误。我该如何安装pip3?或者您知道我可以使用的完整的docker镜像吗?谢谢! - Brooks
在Docker注册表上有https://hub.docker.com/r/frolvlad/alpine-python3/。 - Oluwafemi Sule
@Brooks 我通过在安装Python之前执行yum -y install openssl-devel解决了pip SSL错误。 - khstacking
@khstacking 是的,我最终也这样做了。最终工作正常,但在 CodeBuild 中安装和构建需要大约 5 分钟的时间。 - Brooks
@OluwafemiSule,你能分享整个 .yml 文件吗?我正在尝试使用 3.7 版本运行 Django。 - Arturo

6
现在,AWS 提供了一个官方的 Docker 镜像,用于 Python3.6。你可以使用 aws/codebuild/python:3.6.5 作为 CodeBuild 镜像。详情请参考此处

2

还有一种选择是将CodeBuild指向dockerhub上的镜像。 从文档中可以看到:

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

我已经将我的CodeBuild项目设置为使用python:3.6-alpine,一切都正常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接