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

Python 3.6 unavailable in AWS CodeBuild, Python 3.5 unavailable in 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 相关的错误。

首先它说它找不到_image,这似乎可以通过删除站点包中的 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 文件的安装阶段在 Codebuild 中安装 Python 3.6,但是安装后我找不到 python3* 可执行文件.

我唯一能想到的另一件事是创建 Codestar 项目,编辑 codebuild 以使用 Ubuntu,然后安装所有内容(就像我在本地所做的那样),但是无法从在 Codestar 中,我觉得这可能会让我陷入困境,而且这几乎不是自动化的。有没有办法在我的项目中将该配置作为代码?

编辑 尝试从源代码构建和安装 Python 3.6 是可行的,但是当尝试安装 Pip 时,我收到错误消息,提示未安装 SSL。当回顾构建日志时,似乎其他 "bits" 也没有安装。

所以,我的问题是:

编辑 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 $@'
      - 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 docker 图像上传到 ECR。您可以将此 ECR 映像的使用选项设置为 运行 您的构建。

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

To use another Docker image, choose Specify a Docker image. For Custom image type, choose Other or Amazon ECR. If you choose Other, then for Custom image ID, type the name and tag of the Docker image in Docker Hub

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

现在有来自 AWS 的 official Docker image for Python3.6。您可以使用 aws/codebuild/python:3.6.5 作为您的 CodeBuild 图像。